Skip to content

Mark KeyViz cluster fanout implemented#1025

Closed
bootjp wants to merge 21 commits into
mainfrom
design/promote-keyviz-cluster-fanout-doc
Closed

Mark KeyViz cluster fanout implemented#1025
bootjp wants to merge 21 commits into
mainfrom
design/promote-keyviz-cluster-fanout-doc

Conversation

@bootjp

@bootjp bootjp commented Jul 7, 2026

Copy link
Copy Markdown
Owner

Summary

  • promote the KeyViz cluster fan-out design doc to implemented
  • refresh source, script, and design references to the implemented filename
  • update the renamed design doc wording for implemented status

Design docs

  • docs/design/2026_04_27_implemented_keyviz_cluster_fanout.md

Validation

  • git diff --check origin/main..HEAD
  • rg -n "2026_04_27_proposed_keyviz_cluster_fanout" . (no matches)
  • git verify-commit HEAD

Author: bootjp

Summary by CodeRabbit

  • ドキュメント
    • KeyVizのクラスターファンアウト仕様を、実装済みのHTTPベース構成に更新しました。
    • 複数ノードのデータ統合、部分障害時の劣化表示、セル単位の競合表示、単一ノード時の挙動を明文化しました。
    • 関連する運用手順、性能見積もり、ラベル付きデータの扱い、ロードマップの参照先を更新しました。
    • 旧提案ドキュメントを削除し、実装版ドキュメントへの参照に統一しました。

@coderabbitai

coderabbitai Bot commented Jul 7, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@bootjp, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 52 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 19ddcba4-bb29-45fa-8814-7827b274cd61

📥 Commits

Reviewing files that changed from the base of the PR and between cc4e448 and 17f5917.

📒 Files selected for processing (4)
  • docs/admin_ui_key_visualizer_design.md
  • docs/design/2026_04_27_implemented_keyviz_cluster_fanout.md
  • docs/design/2026_04_29_proposed_logical_backup.md
  • scripts/rolling-update.env.example
📝 Walkthrough

Walkthrough

KeyVizクラスターファンアウトの実装版設計を追加し、HTTPピア照会・サーバー側マージ・劣化応答・競合表示を定義した。管理UI設計、関連ドキュメント、コードコメントの参照先を実装版へ更新し、提案版設計を削除した。

Changes

KeyVizクラスターファンアウト

Layer / File(s) Summary
実装版ファンアウト設計
docs/design/2026_04_27_implemented_keyviz_cluster_fanout.md, docs/design/2026_04_28_implemented_keyviz_adapter_labels.md
HTTPピア照会、--keyvizFanoutNodes、マージ規則、競合情報、ワイヤーフォーマット、SPA表示、実装状況を定義した。
管理UI設計の経路更新
docs/admin_ui_key_visualizer_design.md
KeyVizのファンアウト経路を埋め込みHTTPハンドラによる並列ピア照会とサーバー側マージへ更新し、性能およびPhase 2-Cの状況記述を修正した。
実装版ドキュメント参照への統一
docs/design/2026_04_27_proposed_keyviz_cluster_fanout.md, docs/design/2026_04_29_proposed_logical_backup.md, docs/design/2026_06_11_partial_hotspot_split_milestone3_automation.md, docs/design/2026_06_23_proposed_scaling_roadmap.md, internal/admin/*.go, main.go, scripts/rolling-update.env.example
提案版設計を削除し、関連文書・コードコメント・運用例の参照先を実装版設計へ変更した。

Estimated code review effort: 3 (Moderate) | ~20 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed KeyViz のクラスターファンアウトを実装済み扱いへ更新する変更内容を端的に表しています。
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@bootjp

bootjp commented Jul 7, 2026

Copy link
Copy Markdown
Owner Author

@codex review

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Code Review

This pull request updates the status of the keyviz cluster fan-out design document from "proposed" to "implemented," renaming the file and updating all references to it across other design documents, source code comments, and configuration files. It also refines some of the language in the design document to generalize references to previous review findings. There are no review comments, so I have no feedback to provide.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

@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: ebde63c255

ℹ️ 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/design/2026_04_27_implemented_keyviz_cluster_fanout.md
@bootjp

bootjp commented Jul 7, 2026

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

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

Reviewed commit: 2270fa6c0b

ℹ️ 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".

@bootjp

bootjp commented Jul 7, 2026

Copy link
Copy Markdown
Owner Author

@codex review

@bootjp
bootjp force-pushed the design/promote-keyviz-cluster-fanout-doc branch from 2270fa6 to dfc61d3 Compare July 7, 2026 19:48

@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: dfc61d341f

ℹ️ 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/design/2026_04_27_implemented_keyviz_cluster_fanout.md
@bootjp
bootjp marked this pull request as ready for review July 8, 2026 00:37
@bootjp

bootjp commented Jul 8, 2026

Copy link
Copy Markdown
Owner Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Nice work!

Reviewed commit: dfc61d341f

ℹ️ 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".

@bootjp

bootjp commented Jul 8, 2026

Copy link
Copy Markdown
Owner Author

対応しました。

  • implemented fan-out doc を現実装の RaftGroupIDs / LeaderTerms / conflicts[] に合わせて更新
  • write merge を MVP max-merge ではなく canonical (bucketID, raftGroupID, leaderTerm, column) dedupe + sum-across-terms として説明
  • 親 roadmap は現 HEAD で Phase 2-C shipped と同期済みであることを確認

検証:

  • git diff --check
  • go test ./internal/admin ./adapter -run 'Test(MergeKeyVizMatrices|KeyVizFanoutRun|BuildKeyVizPeerURL|GetKeyVizMatrixStampsRaftIdentity|GetKeyVizMatrixReturnsUnavailableWhenSamplerNotRegistered|GetKeyVizMatrixPivotsColumnsToRows|GetKeyVizMatrixSeriesSelection)' -count=1 -timeout=180s\n\n@codex review

@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


P2 Badge Use the real admin listener flag

This implemented rollout example still uses --adminAddress, but the binary defines the admin HTTP listener flag as --adminListen (main.go) and the fan-out self filtering is built from that listener value. An operator copying this implemented config will start the process with an unknown flag, and the surrounding self-match bullets repeat the wrong flag name, so the documented Phase 2-C rollout cannot be followed as written.


- Both sides round `column_unix_ms[i]` down to the nearest
multiple of `keyvizStep_ms` before merging.

P3 Badge Don't claim timestamp bucketing is implemented

This implemented spec promises peers round column_unix_ms to the keyvizStep boundary before merging, but the current fan-out merge only unions the raw ColumnUnixMs values via unionColumns and no step duration is available in mergeKeyVizMatrices. In clusters whose flushes land at slightly different millisecond offsets, one logical window will still appear as multiple columns despite the doc saying routine jitter is coalesced; either document exact-timestamp union or add the rounding before presenting this as shipped behavior.


are taken from the **lowest-indexed node in `--keyvizFanoutNodes`
whose response is non-empty for the row**. Selection by config-list

P3 Badge Don't promise config-order metadata selection

The implemented doc says row metadata comes from the lowest-indexed node in --keyvizFanoutNodes, but KeyVizFanout.Run always merges []KeyVizMatrix{local} before appending peer matrices, so the serving node wins metadata even when it appears later in the shared flag list. During catalog divergence this makes Start/End and route metadata depend on which node served the browser request, contrary to the deterministic rule documented here.


identity. An old SPA against a new server ignores the extra
fields and renders the local view it always did.

P3 Badge Don't say old SPAs keep rendering the local view

When --keyvizFanoutNodes is enabled, the server rewrites the existing rows/values payload to the merged cluster matrix; an old SPA may ignore the new fanout, conflict, and identity fields, but it will still render the aggregated values rather than the local view. This rollout note can mislead mixed-version validation because the real compatibility risk is that old clients show cluster-wide data without the new degraded/conflict affordances.

ℹ️ 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/design/2026_04_28_implemented_keyviz_adapter_labels.md
Comment thread docs/design/2026_04_27_implemented_keyviz_cluster_fanout.md Outdated
Comment thread docs/design/2026_04_27_implemented_keyviz_cluster_fanout.md Outdated
Comment thread docs/admin_ui_key_visualizer_design.md
@bootjp

bootjp commented Jul 8, 2026

Copy link
Copy Markdown
Owner Author

対応内容:

  • fan-out wire example を FanoutNodeStatus{node, ok, error} の現行 JSON 形に合わせ、未実装の per-node warnings/catalog_divergence を future extension として明確化しました。
  • KeyVizRow.Conflictomitempty なので、conflict 欄の absent=false contract に docs を修正しました。
  • adapter-label doc の merge rule 参照を、現行の (bucketID, raftGroupID, leaderTerm, column) per-cell dedupe + sum-across-terms に更新しました。
  • 親 KeyViz design の §9.1 を、Phase 2-C の shipped surface である embedded --keyvizFanoutNodes static fan-out に合わせました。

検証:

  • go test ./internal/admin -run 'Test(KeyVizFanoutRun|MergeKeyVizMatrices|KeyVizHandler)' -count=1 -timeout=180s\n- git diff --check\n\n@codex review

@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

divergence the operator should investigate; we surface it as a
warning in the per-node status payload but do not block the

P3 Badge Defer catalog-divergence warnings consistently

For same-BucketID rows with different Start/End, this section still says the divergence is surfaced as a warning in the per-node status payload, but the implemented FanoutNodeStatus only serializes node, ok, and error, and §5 now explicitly says catalog-divergence warnings are not shipped in Phase 2-C. This leaves the implemented design promising an operator-visible signal that the wire format cannot carry, so this should be reworded as a future extension or backed by an actual warning field.



P3 Badge Use the implemented admin listener flag

This implemented configuration example uses --adminAddress, but the server flag is --adminListen (main.go defines flag.String("adminListen", ...)), so operators copying the shipped fan-out doc get an unknown flag before the server starts. The self-matching prose below repeats the same name, so update the example and references to the actual listener flag.


All nodes use `keyvizStep` (default 1 s). The aggregator **bucket-
aligns** column timestamps to the nearest `keyvizStep` boundary
before pivoting, so two nodes whose flush goroutines fire fractions

P3 Badge Stop claiming column timestamps are aligned

When peer flush times differ by sub-step jitter, this implemented doc promises the aggregator bucket-aligns timestamps to keyvizStep, but the current merge path builds unionColumns from the exact ColumnUnixMs values and KeyVizFanout is not given keyvizStep to round with. Operators will expect skew tolerance that the shipped code does not provide, so either implement the rounding before merging or document the exact-timestamp union behavior.

ℹ️ 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/design/2026_04_27_implemented_keyviz_cluster_fanout.md Outdated
Comment thread docs/design/2026_04_27_implemented_keyviz_cluster_fanout.md Outdated
@bootjp

bootjp commented Jul 8, 2026

Copy link
Copy Markdown
Owner Author

対応内容:

  • wire format 例で conflicts[] に true がある row の conflict を true に修正し、row-level OR 契約と一致させました。
  • raft_group_ids[] / leader_terms[] は current JSON path では values[] と並行な配列を出し、unknown identity は zero entry で表すことを明記しました。legacy peer の省略/空配列だけを互換扱いにしています。

検証:

  • go test ./internal/admin -run 'Test(KeyVizHandlerStampsRaftIdentity|MergeKeyVizMatrices|KeyVizFanoutRun|KeyVizHandler)' -count=1 -timeout=180s\n- git diff --check\n\n@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

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

Reviewed commit: b0be263880

ℹ️ 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".

…-cluster-fanout-doc

# Conflicts:
#	docs/design/2026_06_23_proposed_scaling_roadmap.md
@bootjp

bootjp commented Jul 8, 2026

Copy link
Copy Markdown
Owner Author

@codex review

@bootjp

bootjp commented Jul 8, 2026

Copy link
Copy Markdown
Owner Author

@codex review

@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: 104eb4f47b

ℹ️ 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 proto/service.proto Outdated
Comment on lines +251 to +252
reserved 3, 4, 5;
reserved "gated", "max_lag", "target_candidates";

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 Do not reserve the planned transfer fields

The active leader-balance design still requires RaftAdminTransferLeadershipRequest to add bool gated = 3, uint64 max_lag = 4, and repeated TransferTarget target_candidates = 5 for forwarded, catch-up-gated leadership transfers (docs/design/2026_06_11_proposed_leader_balance_scheduler.md:111 and :242). Reserving exactly those numbers/names here makes protoc reject that documented wire-compatible extension, forcing a renumbering that loses the mixed-version behavior the design depends on, so these reservations should be removed or the design updated before landing.

Useful? React with 👍 / 👎.

Comment on lines +340 to +341
- Fan-out aggregator with the §4 merge rules, degraded peer status,
peer timeouts, bounded peer response bodies, cookie forwarding, and

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 Do not mark timestamp alignment implemented

This promotes the fan-out aggregator as implementing all §4 merge rules, but §4.5's timestamp bucketing is still not in the server: pivotKeyVizColumns emits raw col.At.UnixMilli() and unionColumns unions exact timestamps rather than rounding to keyvizStep. In clusters whose flush ticks differ by even small sub-step offsets, peer samples still split into adjacent columns, so the documented cluster heatmap guarantee is false unless the rounding is implemented or this part remains deferred.

Useful? React with 👍 / 👎.

Comment thread docs/design/2026_04_27_implemented_keyviz_cluster_fanout.md Outdated
@bootjp

bootjp commented Jul 10, 2026

Copy link
Copy Markdown
Owner Author

対応しました。

  • origin/main を merge し、PR の conflict を解消しました。
  • KeyViz fan-out implemented doc の rollout/config 記述を現実装に合わせ、--adminAddress--adminListen に修正しました。
  • 旧 SPA 互換の説明を、local view ではなく merged rows を表示しつつ新しい degraded/conflict affordance を無視する挙動に修正しました。

検証:

  • git diff --check
  • go test ./internal/admin -run 'Test(KeyVizFanoutRun|MergeKeyVizMatrices|BuildKeyVizPeerURL|KeyVizHandlerStampsRaftIdentity|KeyVizHandler)' -count=1 -timeout=180s\n\n@codex review

@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: 1dbadac3e7

ℹ️ 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 98 to 100
--adminListen 127.0.0.1:8080 \
--keyvizEnabled \
--keyvizFanoutNodes=10.0.0.1:8080,10.0.0.2:8080,10.0.0.3:8080

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 Make the fan-out example enable a reachable admin listener

When this example is copied for a multi-node rollout, it does not actually expose a peer admin endpoint: the HTTP admin server is disabled by default unless --adminEnabled is set, and binding --adminListen to 127.0.0.1 makes the documented 10.0.0.x:8080 fan-out endpoints unreachable from other hosts and not self-filtered by buildKeyVizFanout's exact/wildcard matching. The rollout doc should show the required admin enablement plus a reachable per-node listen address (with the necessary TLS or plaintext opt-in flags) so operators do not get only connection-refused/degraded fan-out responses.

Useful? React with 👍 / 👎.

Comment on lines +204 to +205
- sets `conflicts[j]=true` only when two sources report different
non-zero values for the same `(group, term, column)` identity.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P3 Badge Include unknown-identity fallback in conflict semantics

For mixed-version or legacy peers this "only" condition is not what the shipped merge reports: cellMergeAcc.hasConflict returns true on the unknown-identity fallback path when distinct non-zero values are seen, and TestMergeKeyVizMatricesGroupTermFallbackOnUnknownTerm asserts Conflicts[j] in that case. As written, operators could treat a rollout-era known+legacy disagreement as an impossible same-term Raft violation, so the docs should include the fallback conflict case alongside the same-identity case.

Useful? React with 👍 / 👎.

Comment on lines 124 to 125
- Each entry is a host:port. TLS is out of scope for Phase 2-C
(intra-cluster admin traffic is assumed to ride a private

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 Document HTTPS endpoints for TLS fan-out

For deployments that enable admin TLS (the normal non-loopback configuration unless --adminAllowPlaintextNonLoopback is set), following this guidance makes fan-out call http://host:port against an HTTPS listener and every peer will degrade. The implementation already preserves explicit schemes in buildKeyVizPeerURL, and main.go documents host:port or scheme://host:port, so the implemented rollout doc should tell TLS users to configure https://... peer endpoints rather than saying TLS is out of scope.

Useful? React with 👍 / 👎.

@bootjp

bootjp commented Jul 10, 2026

Copy link
Copy Markdown
Owner Author

対応しました。

  • rollout 例を --adminEnabled + 到達可能な --adminListen に更新し、非 loopback plaintext の opt-in を明示しました。
  • TLS admin listener では https://host:port--keyvizFanoutNodes に明示すること、host-only は http:// として扱われることを追記しました。
  • unknown-identity fallback でも distinct non-zero values は conflicts[] を立てることを、merge rules / wire semantics に反映しました。

検証:

  • go test ./internal/admin -run 'Test(KeyVizFanoutRun|MergeKeyVizMatrices|BuildKeyVizPeerURL|KeyVizHandlerStampsRaftIdentity|KeyVizHandler)' -count=1 -timeout=180s\n- git diff --check\n\n@codex review

@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: c55050113c

ℹ️ 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/design/2026_04_27_implemented_keyviz_cluster_fanout.md
Comment thread docs/design/2026_04_27_implemented_keyviz_cluster_fanout.md
Comment on lines +129 to +132
will not match — the fan-out makes a loopback HTTP call to
itself. This is harmless (it degrades to one extra round-trip
per request) but wasteful; operators should prefer the literal
`--adminAddress` value in the flag.
`--adminListen` value in the flag.

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 Do not treat self-alias fan-out as harmless

When this branch is hit because --keyvizFanoutNodes names the same process through a DNS name or reverse proxy, the peer request returns the same local matrix with the recursion guard set, and the merge path sums reads/read_bytes across sources. That means these self-loop calls double-count local read traffic rather than just adding one wasted round trip, so operators using aliases need either an explicit self name to filter or instructions to omit that alias from the fan-out list.

Useful? React with 👍 / 👎.

Comment thread docs/design/2026_04_27_implemented_keyviz_cluster_fanout.md
Comment on lines +136 to +138
must use explicit `https://host:port` entries:
`--keyvizFanoutNodes=https://node1.internal:8443,https://node2.internal:8443`.
The URL builder preserves explicit schemes, so TLS fan-out does not

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 Document trust requirements for HTTPS fan-out

This says TLS fan-out only needs an https:// URL, but NewKeyVizFanout uses the default http.Client and the fan-out config has no CA bundle or insecure-dev option, so peer certificates must already chain to the process/system trust roots. In common admin-TLS deployments using self-signed or private-CA certs that are not installed in the container trust store, every peer call fails certificate verification and the cluster view stays degraded; either document that trust-store prerequisite here or add an explicit CA/trust configuration before promising no separate flag.

Useful? React with 👍 / 👎.

@bootjp

bootjp commented Jul 10, 2026

Copy link
Copy Markdown
Owner Author

対応しました。

  • plaintext admin の rollout 例に必須の --s3CredentialsFile / --adminSessionSigningKeyFile--adminAllowInsecureDevCookie を追加しました。
  • self alias は double-count し得るため、literal --adminListen を使うか alias を除外する運用条件に修正しました。
  • HTTPS fan-out は default Go http.Client の system trust roots 前提であることを明記しました。

検証:

  • git diff --check
  • commit signature / author / committer 確認済み

@codex review

@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: 3eee0232c6

ℹ️ 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/design/2026_04_27_implemented_keyviz_cluster_fanout.md
Comment thread docs/design/2026_04_27_implemented_keyviz_cluster_fanout.md
Comment thread docs/admin_ui_key_visualizer_design.md
Comment thread docs/admin_ui_key_visualizer_design.md Outdated
Comment on lines +286 to +288
Because writes are recorded by Raft leaders and follower-local reads are recorded by the followers that serve them (§5.1), a single node's local admin view produces a **partial heatmap**. Phase 2-C ships a narrower embedded fan-out path inside each server process:

- `--nodes` accepts a comma-separated list of seed addresses. The admin binary calls `GetClusterOverview` on any reachable seed to discover the current full membership (node → gRPC endpoint, plus per-group leader identity). Membership is cached for `--nodesRefreshInterval` (**default 15 s**) so a stampede of concurrent browser requests hits at most one `GetClusterOverview` per interval per seed, while scale-out events are still reflected within seconds. The cache is refreshed lazily on the first request after expiry and invalidated immediately on any per-node `Unavailable` error, so removed or replaced nodes are dropped on the next request instead of waiting for the next tick.
- For each query (`GetKeyVizMatrix`, `GetRouteDetail`, `GetAdapterSummary`), the admin binary issues parallel gRPC calls to every known node and merges results server-side before sending one combined JSON payload to the browser.
- Merging rule for the heatmap: rows are grouped by `bucketID`/`lineageID` and time step. Read samples from multiple nodes are **summed**, because they represent distinct locally served reads. For write samples the authoritative identity is `(raftGroupID, leaderTerm)` — by Raft invariants at most one leader exists per term per group — so the admin binary collapses write samples to **one value per `(bucketID, raftGroupID, leaderTerm, windowStart)`** key. If the same logical key arrives from more than one node (e.g., an ex-leader that has not yet expired its local cache plus a correctly-responding new leader in the same term), the entries are expected to be identical and the merger keeps one; if they differ, the cell is surfaced with `conflict=true` (not silently dropped). Across distinct `leaderTerm` values for the same group and window, values are summed because each term's leader only observed its own term's writes. The admin binary never uses "later timestamp wins" to overwrite a previous leader's complete window with a new leader's partial window.
- Degraded mode: if any node is unreachable, the admin binary returns a partial result with a per-node `{node, ok, error}` status array so the UI can surface "3 of 4 nodes responded" instead of silently hiding ranges. The heatmap hatches rows or time windows whose expected source node failed.
- A single-node mode — pass one address to `--nodes` and the admin binary will fan out to just that node's view. A future `--no-fanout` flag that also suppresses the background membership-discovery RPC is deferred; for now the operator can simulate it by pointing at a single seed and accepting the one-node partial view.
- `--keyvizFanoutNodes` accepts a comma-separated static list of peer admin HTTP endpoints. Empty disables fan-out. The local node is added in-process, and the configured peers are queried over the existing admin HTTP surface with the `X-Admin-Fanout-Peer` recursion guard. Phase 2-C does not use `cmd/elastickv-admin --nodes`, `GetClusterOverview` membership discovery, or `--nodesRefreshInterval`; dynamic discovery remains a future extension.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P3 Badge Replace the stale standalone-admin workflow

After this section switches Phase 2-C to the embedded HTTP handler, the deployment bullets just above still tell operators to run elastickv-admin --nodes=... --nodeTokenFile and say browser login/RBAC are deferred. That standalone binary is only a Phase-0 gRPC-token overview surface, so following that workflow will not serve the implemented KeyViz SPA/fan-out path or its cookie-login prerequisites; please update the operator workflow alongside this embedded implementation note.

Useful? React with 👍 / 👎.

@bootjp

bootjp commented Jul 10, 2026

Copy link
Copy Markdown
Owner Author

対応しました。

  • rollout 例に admin role allow-list を追加し、credentials file 内の access key を指定する必要を明記しました。
  • TLS fan-out の full URL は scheme://host:port 形式のみで、path/trailing slash は self 判定から外れることを明記しました。
  • 親 KeyViz doc の Phase 2-C 運用/性能記述を embedded admin HTTP fan-out に合わせました。

検証:

  • git diff --check
  • commit signature / author / committer 確認済み

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

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

Reviewed commit: cc4e448c3e

ℹ️ 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".

@coderabbitai coderabbitai 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.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
docs/admin_ui_key_visualizer_design.md (1)

342-343: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Phase 2-C の完了条件を部分結果の契約に合わせてください。

§9.1 および実装版設計では、ノード障害時に ok=false の状態を付けた劣化した部分結果を返します。「1 ノード停止でも complete view」は実装契約と矛盾し、ロールアウト時に欠落データを完全ビューとして扱う誤解を招きます。「partial cluster view with per-node failure status」などに修正してください。

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/admin_ui_key_visualizer_design.md` around lines 342 - 343, Phase 2-C
の完了条件を、ノード障害時に完全ビューではなく劣化した部分結果を返す実装契約に合わせて修正してください。該当する「1 node down でも complete
view」の記述を、「per-node failure status を含む partial cluster
view」など、部分結果とノード単位の失敗状態を明示する表現へ変更してください。
scripts/rolling-update.env.example (1)

114-126: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

ファンアウトの認証・URL 契約を実装版に一致させてください。

この説明は、--adminEnabled なしのピアが未認証 KeyViz エンドポイントを公開すると記載していますが、実装版設計では --adminEnabled が必須で、未設定ならハンドラ自体がマウントされません。誤った説明は、管理認証を設定せずに運用できるという危険な誤解を招きます。あわせて、TLS 構成で必要な https://host:port 形式もこの例に明記してください。

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/rolling-update.env.example` around lines 114 - 126, Update the
KEYVIZ_FANOUT_NODES documentation to state that every peer must run with
--adminEnabled and that the KeyViz handler is not mounted when it is disabled;
remove the claim that peers without it expose an unauthenticated endpoint. Also
document that TLS configurations must use https://host:port entries in the
comma-separated list.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/admin_ui_key_visualizer_design.md`:
- Around line 79-82: §3 のアーキテクチャ図と説明を更新し、standalone overview は管理バイナリから各ノードへ gRPC
接続する経路、KeyViz Phase 2-C の fan-out は各 elastickv に埋め込まれた HTTP
ハンドラを利用する経路として明確に分離してください。§9.1 の embedded HTTP handler
への参照を追加し、図中の接続方式・データ取得経路も実装と一致させてください。

---

Outside diff comments:
In `@docs/admin_ui_key_visualizer_design.md`:
- Around line 342-343: Phase 2-C
の完了条件を、ノード障害時に完全ビューではなく劣化した部分結果を返す実装契約に合わせて修正してください。該当する「1 node down でも complete
view」の記述を、「per-node failure status を含む partial cluster
view」など、部分結果とノード単位の失敗状態を明示する表現へ変更してください。

In `@scripts/rolling-update.env.example`:
- Around line 114-126: Update the KEYVIZ_FANOUT_NODES documentation to state
that every peer must run with --adminEnabled and that the KeyViz handler is not
mounted when it is disabled; remove the claim that peers without it expose an
unauthenticated endpoint. Also document that TLS configurations must use
https://host:port entries in the comma-separated list.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 6b6700ea-bcae-4442-b3d6-dbcee354674f

📥 Commits

Reviewing files that changed from the base of the PR and between 66eb385 and cc4e448.

📒 Files selected for processing (11)
  • docs/admin_ui_key_visualizer_design.md
  • docs/design/2026_04_27_implemented_keyviz_cluster_fanout.md
  • docs/design/2026_04_27_proposed_keyviz_cluster_fanout.md
  • docs/design/2026_04_28_implemented_keyviz_adapter_labels.md
  • docs/design/2026_04_29_proposed_logical_backup.md
  • docs/design/2026_06_11_partial_hotspot_split_milestone3_automation.md
  • docs/design/2026_06_23_proposed_scaling_roadmap.md
  • internal/admin/keyviz_fanout.go
  • internal/admin/keyviz_handler.go
  • main.go
  • scripts/rolling-update.env.example
💤 Files with no reviewable changes (1)
  • docs/design/2026_04_27_proposed_keyviz_cluster_fanout.md

Comment thread docs/admin_ui_key_visualizer_design.md Outdated
@bootjp

bootjp commented Jul 10, 2026

Copy link
Copy Markdown
Owner Author

対応しました。

  • 親 KeyViz design doc の §3 図と説明で、standalone gRPC overview path と embedded admin HTTP KeyViz fan-out path を分離しました。

検証:

  • git diff --check
  • commit signature / author / committer 確認済み

@codex review

@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: cffe865b7a

ℹ️ 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/admin_ui_key_visualizer_design.md

### 4.5 Time alignment

All nodes use `keyvizStep` (default 1 s), but the shipped Phase 2-C

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P3 Badge Correct the documented KeyViz step default

The implemented default is keyviz.DefaultStep = 60 * time.Second and --keyvizStep uses that default, so documenting the shipped Phase 2-C default as 1 s gives operators the wrong sampling-window size and understates how far exact, unaligned peer columns can drift under the default configuration.

Useful? React with 👍 / 👎.

Comment thread docs/admin_ui_key_visualizer_design.md Outdated
Admin -- "gRPC: Distribution, RaftAdmin, Admin.KeyViz" --> Node1
Admin -- "gRPC" --> Node2
Admin -- "gRPC" --> Node3
Browser -- "HTTP/JSON + WebSocket" --> Node1HTTP

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P3 Badge Remove nonexistent WebSocket from embedded path

This diagram now describes the shipped embedded KeyViz path, but the embedded admin router only registers the KeyViz matrix/hotkeys HTTP endpoints, and a repo-wide search shows no /api/stream or WebSocket handler in internal/admin. Leaving WebSocket on the implemented Node HTTP path promises a live-streaming API that clients cannot actually use.

Useful? React with 👍 / 👎.

@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: cffe865b7a

ℹ️ 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 +225 to +230
Under stable leadership, exactly one node (the current leader for
the route's group) records writes for a given
`(bucketID, raftGroupID, leaderTerm, column)`; other nodes report
0. Zero-valued contributions are ignored for write conflict
purposes, so follower zeros against the leader's non-zero value do
not perturb the result or raise `conflicts[j]`.

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 Do not claim stable writes are leader-only

When clients send writes through followers or through multiple ingress nodes in the same Raft term, this stable-leadership contract is not what the server records: ShardedCoordinator.groupMutations calls observeMutation before ShardRouter.Commit forwards, and the leader-side Internal.Forward path commits directly without re-entering that observation hook. Those ingress-local write samples share the same (raftGroupID, leaderTerm), so the documented max/dedupe rule undercounts normal traffic and may mark conflicts even without a leadership flip; either document the ingress-observed limitation or change observation/merge semantics before calling this exact.

Useful? React with 👍 / 👎.

@bootjp

bootjp commented Jul 10, 2026

Copy link
Copy Markdown
Owner Author

対応しました。

  • 親設計の embedded KeyViz 経路から存在しない WebSocket 表記を削除し、standalone overview と embedded KeyViz の役割を分離しました。
  • Phase 2-C の完了条件を complete view ではなく per-node failure status 付き partial cluster view に修正しました。
  • KeyViz fan-out doc の keyvizStep default を 60s に修正し、write merge は leader-only ではなく ingress-observed sample として説明しました。
  • rolling-update env example から admin 無効時の未認証 endpoint 説明を削除し、--adminEnabled と https://host:port 条件を明記しました。

検証:

  • git diff --check
  • go test ./internal/admin -run 'Test(KeyVizFanoutRun|MergeKeyVizMatrices|BuildKeyVizPeerURL|KeyVizHandlerStampsRaftIdentity|KeyVizHandler)' -count=1 -timeout=180s\n\n@codex review

@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: e51f140a5b

ℹ️ 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/admin_ui_key_visualizer_design.md Outdated
### 9.1 Cluster-wide fan-out

Because writes are recorded by Raft leaders and follower-local reads are recorded by the followers that serve them (§5.1), pointing the admin binary at a single node produces a **partial heatmap**. To give operators a complete view by default, the admin binary runs in **fan-out mode**:
Because writes are recorded by Raft leaders and follower-local reads are recorded by the followers that serve them (§5.1), a single node's local admin view produces a **partial heatmap**. Phase 2-C ships a narrower embedded fan-out path inside each server process:

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 Document writes as ingress-observed

In follower-ingress or multi-ingress deployments this section still tells operators that KeyViz writes are leader-recorded, but the actual write hook runs in ShardedCoordinator.groupMutations before forwarding (kv/sharded_coordinator.go:2048), and the leader-side Internal.Forward path commits directly without re-observing (adapter/internal.go:65). That makes the merge rules below look like exact leader-only accounting even though the implemented fan-out doc now correctly says write cells are ingress-observed samples; please align this parent section so operators do not misinterpret normal same-term conflicts or under-counts as Raft anomalies.

Useful? React with 👍 / 👎.

Comment thread docs/admin_ui_key_visualizer_design.md
Comment on lines +445 to +448
trip the cap. The cap firing surfaces as a JSON-decode error
from the peer (the LimitReader returns EOF mid-stream), which
the aggregator records as `ok=false` with the decode error in
that node's status entry plus a `WARN`-level server log. No

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P3 Badge Match the body-cap docs to actual peer status behavior

This states that hitting the peer response cap is always reported as ok=false, but fetchPeerJSON uses a LimitReader(cap+1) and returns success after logging when a complete JSON object decodes before the extra/trailing bytes; TestKeyVizFanoutRunPeerNearCapSucceedsWithWarning pins that path as OK=true. Operators relying on this doc will assume every over-cap response is excluded from the merge, so the implemented-status doc should distinguish bounded-read warnings from mid-object truncation/decode failures.

Useful? React with 👍 / 👎.

Comment on lines +1572 to +1573
control plane being fan-out-aware (see
`2026_04_27_proposed_keyviz_cluster_fanout.md`).
`2026_04_27_implemented_keyviz_cluster_fanout.md`).

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P3 Badge Point backup fan-out to a Distribution design

The new target is the implemented KeyViz HTTP fan-out design, but that design explicitly scopes itself to static --keyvizFanoutNodes and excludes GetClusterOverview/membership discovery, so it is not evidence that the Distribution control plane is fan-out-aware. Readers following this dependency for multi-cluster backup will land on the wrong contract; keep this reference on a future Distribution fan-out design or the parent section that still describes discovery semantics.

Useful? React with 👍 / 👎.

@bootjp

bootjp commented Jul 10, 2026

Copy link
Copy Markdown
Owner Author

対応しました。

  • parent KeyViz design の API surface を embedded admin HTTP (/admin/api/v1/keyviz/*) と standalone overview gRPC に分離し、古い /api/keyviz/* / WebSocket / admin binary fan-out 記述を削除しました。
  • write sampling を leader-only ではなく ingress-observed offered-load samples として親 design 側にも反映しました。
  • peer body cap の実装挙動を、near-cap success (ok=true + warn) と mid-object truncation (ok=false) に分けて記述しました。
  • logical backup doc の multi-cluster fan-out 依存先を、KeyViz static fan-out ではなく future Distribution discovery/fan-out design に戻しました。

検証:

  • git diff --check
  • go test ./internal/admin -run 'Test(KeyVizFanoutRun|MergeKeyVizMatrices|BuildKeyVizPeerURL|KeyVizHandlerStampsRaftIdentity|KeyVizHandler|KeyVizFanoutRunPeerNearCapSucceedsWithWarning)' -count=1 -timeout=180s\n\n@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Already looking forward to the next diff.

Reviewed commit: 17f5917655

ℹ️ 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".

@bootjp

bootjp commented Jul 10, 2026

Copy link
Copy Markdown
Owner Author

Current HEAD 17f591765502b3f919bcbd2098cad197f512a65a has no remaining unresolved non-outdated review threads. The remaining stale anchors were on older commits and are skipped under the latest-head rule.

CI is green and the branch is MERGEABLE/CLEAN.

@codex review
@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 10, 2026

Copy link
Copy Markdown

@bootjp Thanks for the update. I'll re-review the current head now.

✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Hooray!

Reviewed commit: 17f5917655

ℹ️ 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".

@bootjp

bootjp commented Jul 18, 2026

Copy link
Copy Markdown
Owner Author

Superseded by #1079, which merged the current implemented KeyViz fanout design into main. Closing this older duplicate branch to avoid carrying stale conflicts.

@bootjp bootjp closed this Jul 18, 2026
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