You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Three substantive findings + one nit from claude review on #674:
1. **HS256 key size (high)**: said "≥ 32 raw bytes / 44 base64 chars"
but the validator in internal/admin/config.go enforces exactly 64
raw bytes. A 32-byte key fails startup with a confusing error.
Updated to "exactly 64 raw bytes — 88 base64 chars (standard
padding) or 86 (RawURLEncoding)". Operators copying the doc into
key-generation tooling now produce a key that actually validates.
2. **Audit log sample (moderate)**: showed method=POST / path=... /
status=201 / duration=8.2ms — none of those fields are emitted.
The actual slog entries use operation= + a resource key
(bucket= or table=). Replaced the example with two real shapes
(leader-direct and forwarded), so an operator building a log
parser against the documented contract finds matches.
3. **Cross-reference link (moderate)**: line 249 used the
_partial_ filename for the design doc, but #675 (the rename PR)
hasnt landed yet. Point to _proposed_ (matches main today)
with an inline note that the link will follow once #675 lands.
The intro paragraph at line 5 already used _proposed_, so this
removes the inconsistency claude flagged.
4. **"data-plane" label nit**: /admin/api/v1/cluster is an admin-
plane endpoint, not data-plane. "data-plane" implied the
DynamoDB / S3 / Redis ports. Replaced with "admin".
The cosmetic Last-updated / Status verbosity items on #675 are
tracked separately.
|`-adminSessionSigningKey`*or*`-adminSessionSigningKeyFile`*or*`ELASTICKV_ADMIN_SESSION_SIGNING_KEY`| Cluster-shared base64-encoded HS256 key (≥ 32 raw bytes / 44 base64 chars). **Must be the same on every node** — JWTs minted by node A are verified by node B during follower→leader forwarding, so a mismatch breaks the dashboard's read paths on follower nodes. The `*File` / env-var forms keep the secret out of `/proc/<pid>/cmdline`. |
45
+
|`-adminSessionSigningKey`*or*`-adminSessionSigningKeyFile`*or*`ELASTICKV_ADMIN_SESSION_SIGNING_KEY`| Cluster-shared base64-encoded HS256 key — **exactly 64 raw bytes** (88 base64 chars with standard padding, or 86 with `RawURLEncoding`). The validator rejects any other length at startup with a precise error message. **Must be the same on every node** — JWTs minted by node A are verified by node B during follower→leader forwarding, so a mismatch breaks the dashboard's read paths on follower nodes. The `*File` / env-var forms keep the secret out of `/proc/<pid>/cmdline`. |
46
46
|`-s3CredentialsFile`| JSON file with at least one access key + secret key pair. Same file the S3 adapter uses for SigV4; the admin dashboard reuses it for login authentication. |
47
47
|`-adminFullAccessKeys`*and/or*`-adminReadOnlyAccessKeys`| Comma-separated allow-lists. Only access keys listed here may log into the dashboard, even if their SigV4 secret validates against the credentials file. Keys must not appear in both lists. |
48
48
@@ -176,17 +176,27 @@ should look at Raft leader-churn logs first.
176
176
177
177
Every state-changing admin request emits a structured slog line at
178
178
`INFO` level on the leader's stdout (or wherever the process slog
179
-
handler is wired):
179
+
handler is wired). Two shapes:
180
+
181
+
**Leader-direct write** (`DynamoHandler` / `S3Handler` after a
- Design rationale: [docs/design/2026_04_24_proposed_admin_dashboard.md](design/2026_04_24_proposed_admin_dashboard.md) (renamed to `_partial_` in PR #675; this link will follow once that lands)
0 commit comments