docs: comments on embedded dashboards - #11890
Conversation
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Automations to automatically generate PRs for you. |
|
Claude finished @igorlukanin's task in 2m 5s —— View job Reviewed #11890 — 3 medium, 2 low, all inline. No blocking defect.Full review
Findings
Verified clean
Note on scopeThe page runs 231 lines against a repo convention that asks for the shortest version that answers "how do I use this?". Most of it is reference material that earns its space, but the rationale clauses are where it drifts — I could not verify the behavioural claims against the API — the Cube Cloud endpoints under No prior review threads on this PR, so nothing to resolve or de-duplicate. |
|
Fixed in
#3, partly declined. Added On the unverifiable claims — the endpoint shapes, the authorship-only rule, the one-level nesting cap, the 10,000-character body limit and the 24-hour token lifetime each come from the API's own definitions rather than from the neighbouring pages. You were right that this repo can't confirm them. |
Reviewing PR #11890
|
fb9f391 to
664294a
Compare
|
Claude finished @igorlukanin's task in 3m 33s —— View job 1 medium, 2 re-affirmed, 3 stale threads resolved — otherwise the page checks out against
|
| Thread | Why |
|---|---|
PRRT_kwDOCOH19M6isC_9 |
Line 80 now names PATCH /dashboard/{publicId}/comments/{commentId} with the id segment. |
PRRT_kwDOCOH19M6isDJW |
Errors table gained 401 and a widened 403; the account-disabled row was refuted and withdrawn. |
PRRT_kwDOCOH19M6isDNz |
The /* threads */ placeholder is gone; the thread-list fence at lines 139-156 parses. |
Verified against the spec, no finding
- The six paths, query params (
includeResolved,resolvedOnly,first,after,search) and request bodies matchapi.yaml:3743-3992exactly. Commentfields (id,dashboardId,userIdnullable,body,editedAt,removedAt,createdAt,isOwn) matchEmbedDashboardCommentDtoatapi.yaml:9133;Threadmatches9176;Mentionable usermatches9255, includingemail/firstNamenullability andusernamebeing the only guaranteed identity field.- 10,000-character cap and the empty-body
400:CreateEmbedDashboardCommentBodyatapi.yaml:6292(maxLength: 10000,minLength: 1). - Author-only edit/delete/resolve, the one-level nesting cap,
400on resolving a reply's id, and the Cube-app-is-wider contrast: all stated in the endpoints' ownx-mintprose (3904,3833,3945,3980-3986). - Single-use
sessionIdand the 24-hour token:api.yaml:4167-4169. pageInfowithout cursors on the mentionable-users sample is valid —startCursor/endCursorare optional inPageInfo(api.yaml:10605).- All four internal links resolve,
#account-settingsexists, and the Allow comments on embedded dashboards row it points at isfeature-visibility.mdx:186. docs.jsonparses; the slug was added to the Embed APIs group with nothing dropped.
One general note, no action needed
All six endpoints already have generated reference pages (docs.json:1051-1056) carrying this same prose in x-mint. The hand-written page never links to them, so a reader who lands on either one has no path to the other. Worth a line under Endpoints pointing at the generated pages — generate-session.mdx has the same gap, so this is a convention question rather than a defect in this PR.
|
Both re-affirmed points were real — my previous comment claimed two fixes that didn't make it into the commit. They're in
DELETE Thanks for checking the page against |
Reviewing dashboard comments docs
|
|
Claude finished @igorlukanin's task in 3m 14s —— View job No blockers — 3 low-severity findings, all documentation consistencyReview details
Findings (posted inline)
What checks out
Claims about runtime behaviour — the 24-hour token lifetime, the single-use session id, the 10,000-character body cap, the authorship-only permission, the one-level nesting limit, and the Prior threadsResolved four stale threads from earlier rounds, all first-authored by |
|
Claude finished @igorlukanin's task in 4m 2s —— View job Docs-accurate overall — 0 blocking, 2 medium, 2 low. Every endpoint path, field, type, nullability and limit on the new page matches Review detail
Findings
Verified against
|
|
All three fixed:
|
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Claude finished @igorlukanin's task in 4m 0s —— View job Review complete — 2 medium, 1 low, all posted inlineDetails
Findings
Verified against
|
…earch Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Claude finished @igorlukanin's task in 3m 7s —— View job Review complete — docs-only, no blockers. 3 findings: 2 medium, 1 low.Full review
Findings
Verified against the shipped spec
NotesNo unresolved review threads remained on the PR, so nothing was resolved and no finding was a duplicate. The three divergences already settled in earlier rounds against the implementation — |
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
I'll analyze this and get back to you. |
…bedding Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Claude finished @igorlukanin's task in 4m 9s —— View job Review complete — 2 medium, 1 low (non-blocking); everything checkable against
|
| Sev | Where | What |
|---|---|---|
| Medium | dashboard-comments.mdx:22 |
"the only credential these endpoints refuse is an internalId session" contradicts line 32 and the 403 row at line 280; and "do not embed that dashboard" is not a working control — no comment handler calls assertEmbeddingAllowed, so an already-exchanged token keeps posting after the dashboard stops rendering |
| Medium | dashboards.mdx:181 |
"kept separate per embed tenant" states the isolation unconditionally, which is exactly the misread the reference page's Warning at line 82 exists to prevent |
Low, not posted inline
reference/embed-apis/generate-session.mdx:42 documents embedTenantName as "No / Defaults to the current tenant" with no hint that omitting it collapses every customer into one embed tenant. That page is where somebody minting sessions actually reads, and it is not in this diff — worth a one-clause addition in a follow-up rather than widening this PR.
Verified against the repo
Everything the spec can settle agrees with the page:
- Required-field list at line 98 matches
api.yamlexactly —EmbedDashboardCommentDtorequiresid, dashboardId, body, createdAt, isOwn(api.yaml:9169);EmbedDashboardCommentThreadDtorequiresroot, replies(:9196);EmbedMentionableUserDtorequiresid, username(:9269).PageInforequires only the twohas*flags, cursors nullable (:10605) — so keying the loop onhasNextPageis the right advice. - 10,000-character
bodycap:CreateEmbedDashboardCommentBody.body maxLength 10000, minLength 1(:6295), same on update (:12178). search255-character cap (:3848) andfirstminimum: 1with no maximum (:3853) — consistent with line 182's claim that the schema records only the floor.- Endpoint set, paths, and response types match the six operations at
api.yaml:3742-3969,PATCHincluded with{commentId}. - Link targets all resolve:
feature-visibility.mdx#account-settings(heading at:174),admin/account-billing/api-keys.mdx,reference/embed-apis/generate-session.mdx, and/api-reference/embed/exchange-a-session-for-an-embed-token— that slug matches the summary atapi.yaml:4157and the operation is registered indocs.json:1061, so the generated page exists. Same pattern the index already uses for Revoke. docs.jsonparses; the new slug appears once, in the Embed APIs group after Generate Session, nothing dropped.- On-page anchors are self-consistent:
#a-conversation-lives-inside-a-single-embed-tenantmatches the H2 at line 76, referenced from lines 30 and 212. - Naming: "Cube console" has precedent (
feature-visibility.mdx:15,dashboards.mdx:153); no "Cube Cloud" left in the new content; "Premium and above plans" in a<Note>per the plan-callout convention.
Not re-raised
The DELETE 204 vs spec 200, the deleted-comment tombstone contract, and createdAt vs lastActivityAt ordering each disagree with api.yaml's x-mint prose, and each was settled earlier in this PR against the handler with the spec named as the stale side. Page length was raised and partly declined. Nothing to add.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Claude finished @igorlukanin's task in 4m 17s —— View job 1 medium, 0 low — one finding on Full review
Findingmedium — "stop minting sessions for that dashboard" names a scope Generate Session does not have — its body is Verified cleanEvery response shape, bound, and required-field claim on the new page matches
Conventions and wiring:
No prior unresolved review threads existed on the PR, so nothing was resolved and nothing was skipped as a duplicate. |
…at does not exist Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Claude finished @igorlukanin's task in 3m 52s —— View job Approve — 0 findings. Every checkable claim matches
|
| Page claim | Spec |
|---|---|
Guaranteed comment fields: id, dashboardId, body, createdAt, isOwn (dashboard-comments.mdx:98) |
EmbedDashboardCommentDto.required at api.yaml:9169 — exact match |
Guaranteed thread fields: root, replies |
EmbedDashboardCommentThreadDto.required at api.yaml:9196 — exact match |
Guaranteed mentionable-user fields: id, username |
EmbedMentionableUserDto.required at api.yaml:9269 — exact match |
Only hasNextPage/hasPreviousPage guaranteed; cursors nullable (:180) |
PageInfo.required at api.yaml:10605 — exact match |
search capped at 255 chars, 400 above (:212, :278) |
maxLength: 255 at api.yaml:9849 |
first below 1 is a 400 (:278) |
minimum: 1 at api.yaml:3771, :3859 |
first default 100 / cap 200, spec records only the floor (:182) |
Spec carries minimum only — the attribution is correct on its face |
Session id single-use, exchange unauthenticated, token lasts 24 h (:58) |
api.yaml:4167–4174 |
Revoke kills an already-exchanged token (:22) |
api.yaml:4124–4127 |
internalId is a real Generate Session field (:32) |
generate-session.mdx:39 |
The absent-vs-null rule at :98 is logically sound: with resolvedAt omitted, thread.resolvedAt === null evaluates false, so an isOpen check written that way reports every open thread resolved. The thread-list sample at :163 now omits both fields, so it demonstrates the case rather than contradicting the rule.
Links, anchors, structure
Every internal target resolves: #a-conversation-lives-inside-a-single-embed-tenant, #thread-list, #comment, #mentionable-users, #authentication, /embedding/iframe/feature-visibility#account-settings (feature-visibility.mdx:174), /admin/account-billing/api-keys. Both generated-page refs match their summary: slugs — exchange-a-session-for-an-embed-token (api.yaml:4157) and revoke-an-embed-session (api.yaml:4111). docs.json:555 carries the slug in the Embed APIs group. All four json fences parse; the javascript sample's send helper throws on non-OK, so step 2 cannot post its reply as a second root thread.
Conventions (docs-mintlify/CLAUDE.md)
Plan callout uses <Note> with "Premium and above plans" (:8–:12) — correct on both counts. No legacy "Cube Cloud" anywhere in the five touched pages; cubecloud.dev appears only as a literal hostname. No H1 in the body, sections start at H2.
Cross-page consistency
feature-visibility.mdx:186, dashboards.mdx:179, creator-mode.mdx:39 and dashboard-comments.mdx:18 now all say the same thing about the account switch — it hides the panel, the API answers either way. That was the one factual disagreement across the set in earlier rounds, and it is closed.
Threads
No unresolved review threads remain on the PR — nothing to resolve, nothing re-affirmed.

Summary
Documents commenting on embedded published dashboards as a new Embed APIs reference page,
reference/embed-apis/dashboard-comments./api/v1/embed, the response shapes, a worked create → reply → resolve example, and the error codes.mentionable-usersreturns embed users of the caller's own embed tenant only;emailon a returned user is nullable.docs.json(Embed APIs group, after Generate Session), to the Available APIs list on the Embed APIs index, and a short pointer from the Dashboards and Creator Mode pages.Test plan
mint dev— every touched page returns HTTP 200:reference/embed-apis/dashboard-comments,reference/embed-apis/index,embedding/iframe/dashboards,embedding/iframe/creator-mode.mint broken-links --check-anchors— no broken links on any page in this change. The three reported are pre-existing, ondocs/integrations/dbt.mdx,recipes/data-modeling/dbt.mdx, andreference/control-plane-api.mdx, none of which this PR touches.docs.jsonre-parsed as valid JSON; slug added, none dropped or duplicated.icon=attribute on any page in this change, so no Tabler icon names to validate.🤖 Generated with Claude Code