Filed by the domain:services execution seat (session session_01ToDPcx9AESFubJkDiFMtKW) out of the at-ACCEPT residue of #16390 / PR #17470. Filed unassigned and unlabelled: ⛔ this seat does not produce domain:* or grading. ⚠️ Suggested lane for triage: both sites are content/docs/** ⇒ domain:devx.
⛔ Not fixed in PR #17470. content/docs/** is another lane's, and this seat refused authored-guidance edits from a code PR three times today on a sibling. The dev measured them, left them alone and handed them up — this card is that hand-off.
Blocked-by: #16390
⚠️ Both sentences are TRUE on origin/main today and become false only when PR #17470 merges. ⛔ Do not "fix" them before then — that would make them wrong in the other direction. The block names the issue, not the PR, per this lane's vocabulary (the target of a block must be something that closes at the moment the wait ends; #16390 closes via Fixes #16390).
What changes underneath them
packages/spec declares one reference class — REFERENCE_VALUE_TYPES = lookup, master_detail, user, tree. PR #17470 deletes service-analytics's private two-member LOOKUP_TYPES subset and asks spec's referenceTargetOf instead, at all three sites that classified a dimension. ⇒ From that commit on, a user or tree dimension resolves its label exactly as a lookup one already did.
Site 1 — content/docs/data-modeling/analytics.mdx:210–:211
Verbatim on origin/main @ 65ad77d5a:
- Dimensions — a
select dimension returns its option label (not the stored value), a lookup / master_detail dimension returns the related record's display name (not the FK id), and a date dimension with a dateGranularity returns a human bucket label…
⇒ Short by user and tree. ⭐ And short in the direction that matters: a reader asking "does a person axis render a name?" reads this enumeration and concludes no — which is the exact belief #16390 was filed to correct.
Site 2 — content/docs/ui/dashboards.mdx:146–:147 — ⭐ the one no anchor could reach
Verbatim on origin/main @ 65ad77d5a:
- A
sortBy naming a select or lookup dimension orders by the display label the rows render (the option label / the related record's name), not the stored value or foreign-key id — and the label is resolved before limit applies, so a top-N by name truncates the right N.
This is the ADR-#3680 sort rule, which PR #17470 widens through createOrderLabelResolver.isLabelBearing: a sortBy on a user or tree dimension now orders by label too.
⚠️ This page names neither master_detail nor any symbol in the diff. It was not among the drift bot's 21 rows, and could not have been — the bot's own "What this run could not see" section states the limit by name: a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. ⇒ It was found by a deliberate hand sweep over output phrasings (display label, FK id, raw id, stored value) and rendering verbs near dimension/axis, ⛔ not by the tool. Worth recording as a live instance of that class rather than an anecdote.
Suggested shape — ⛔ not a proposal this seat is entitled to make
Name the class rather than two of its members, so the next member added to REFERENCE_VALUE_TYPES does not re-open this card. The wording is the owning lane's call.
Checked and cleared — ⛔ do not re-derive these
Read and found not falsified, so nobody spends the sweep again:
- Already correct, they enumerate all four members:
data-api.mdx:24, hook-bodies.mdx:103, queries.mdx:328, query-syntax.mdx:739 / :803, widget-contract.mdx:162.
- No analytics claim (field-type vocabulary — cascade delete,
Field.masterDetail(), delete behaviour): 11 pages.
- No error-code / status / admission claim (this diff mints no code and touches no admission path): 4 pages.
- Generated tables mirroring
DatasetDimensionSchema.type, and packages/spec is untouched so neither moved: references/ui/dataset.mdx:57, references/data/analytics.mdx:129.
- Name dimensions but claim nothing about the rendered value:
references/ui/report.mdx, references/ui/chart.mdx, references/api/analytics.mdx, references/api/sortability.mdx, capabilities/analytics.mdx.
- Delegates the rule and says so:
ui/reports.mdx:157–:159 explicitly does not repeat the ordering rule — no independent claim.
⚠️ One pre-existing observation, ⛔ not caused by #16390 and ⛔ not this card's: content/docs/protocol/objectql/schema.mdx:298 understates which types carry reference — identically so before this diff.
⛔ Release-owned pages: read, left alone
Six pages under content/docs/releases/** were in the bot's list — implementation-status.mdx, v12.mdx, v17/17-0.mdx, v17/17-3.mdx, v17/17-4.mdx, v9.mdx. Nothing there was edited, and ⛔ nothing here asks for an edit. Two of them do state the rule (v9.mdx:114–:115, 17-0.mdx:1385) and neither is falsified for a reason rather than by exemption: a release page is a dated record of what that release shipped, and both remain true of v9 and 17.0. ⚠️ If that reading is wrong it is a report to the release owner, ⛔ never an edit from a code lane.
Why all 21 bot rows arrived, so the next reader does not over-read the number
Every one of the 27 rows is anchored on a single item — master_detail (literal, a string literal in LOOKUP_TYPES). This diff deletes LOOKUP_TYPES, whose members were 'lookup' and 'master_detail', so every page spelling that field type anywhere was selected. ⇒ Correct rows, and zero signal about which page states the rule. Each was read individually; 1 of 21 was falsified.
Dedupe — run with a control
Semantic search over objectstack-ai/objectstack, 2026-09-10T16:33Z:
query "analytics documentation says a lookup or master_detail dimension returns the display
name — the enumeration omits user and tree members of the reference class" → 4 results
query "a content docs page enumerates field types short by a member and a behaviour
change falsifies the list" → 0 results
CONTROL: the first query returned non-empty, so the tool answers on this topic and the
zero on the second phrasing is a reading, not a dead probe. ⚠️ The second zero is reported
as a zero on THAT phrasing only — it is not independent evidence.
Nearest neighbours, each read and judged not a duplicate:
Refs: #16390 · PR #17470 · packages/services/service-analytics/src/dimension-labels.ts · REFERENCE_VALUE_TYPES / referenceTargetOf in @objectstack/spec/data · the #3680 sort-key hook
Filed by the⚠️ Suggested lane for triage: both sites are
domain:servicesexecution seat (sessionsession_01ToDPcx9AESFubJkDiFMtKW) out of the at-ACCEPT residue of #16390 / PR #17470. Filed unassigned and unlabelled: ⛔ this seat does not producedomain:*or grading.content/docs/**⇒domain:devx.⛔ Not fixed in PR #17470.
content/docs/**is another lane's, and this seat refused authored-guidance edits from a code PR three times today on a sibling. The dev measured them, left them alone and handed them up — this card is that hand-off.Blocked-by: #16390origin/maintoday and become false only when PR #17470 merges. ⛔ Do not "fix" them before then — that would make them wrong in the other direction. The block names the issue, not the PR, per this lane's vocabulary (the target of a block must be something that closes at the moment the wait ends; #16390 closes viaFixes #16390).What changes underneath them
packages/specdeclares one reference class —REFERENCE_VALUE_TYPES=lookup,master_detail,user,tree. PR #17470 deletesservice-analytics's private two-memberLOOKUP_TYPESsubset and asks spec'sreferenceTargetOfinstead, at all three sites that classified a dimension. ⇒ From that commit on, auserortreedimension resolves its label exactly as alookupone already did.Site 1 —
content/docs/data-modeling/analytics.mdx:210–:211Verbatim on
origin/main@65ad77d5a:⇒ Short by
userandtree. ⭐ And short in the direction that matters: a reader asking "does a person axis render a name?" reads this enumeration and concludes no — which is the exact belief #16390 was filed to correct.Site 2 —
content/docs/ui/dashboards.mdx:146–:147— ⭐ the one no anchor could reachVerbatim on
origin/main@65ad77d5a:This is the ADR-#3680 sort rule, which PR #17470 widens through
createOrderLabelResolver.isLabelBearing: asortByon auserortreedimension now orders by label too.master_detailnor any symbol in the diff. It was not among the drift bot's 21 rows, and could not have been — the bot's own "What this run could not see" section states the limit by name: a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. ⇒ It was found by a deliberate hand sweep over output phrasings (display label,FK id,raw id,stored value) and rendering verbs neardimension/axis, ⛔ not by the tool. Worth recording as a live instance of that class rather than an anecdote.Suggested shape — ⛔ not a proposal this seat is entitled to make
Name the class rather than two of its members, so the next member added to
REFERENCE_VALUE_TYPESdoes not re-open this card. The wording is the owning lane's call.Checked and cleared — ⛔ do not re-derive these
Read and found not falsified, so nobody spends the sweep again:
data-api.mdx:24,hook-bodies.mdx:103,queries.mdx:328,query-syntax.mdx:739/:803,widget-contract.mdx:162.Field.masterDetail(), delete behaviour): 11 pages.DatasetDimensionSchema.type, andpackages/specis untouched so neither moved:references/ui/dataset.mdx:57,references/data/analytics.mdx:129.references/ui/report.mdx,references/ui/chart.mdx,references/api/analytics.mdx,references/api/sortability.mdx,capabilities/analytics.mdx.ui/reports.mdx:157–:159explicitly does not repeat the ordering rule — no independent claim.content/docs/protocol/objectql/schema.mdx:298understates which types carryreference— identically so before this diff.⛔ Release-owned pages: read, left alone
Six pages under⚠️ If that reading is wrong it is a report to the release owner, ⛔ never an edit from a code lane.
content/docs/releases/**were in the bot's list —implementation-status.mdx,v12.mdx,v17/17-0.mdx,v17/17-3.mdx,v17/17-4.mdx,v9.mdx. Nothing there was edited, and ⛔ nothing here asks for an edit. Two of them do state the rule (v9.mdx:114–:115,17-0.mdx:1385) and neither is falsified for a reason rather than by exemption: a release page is a dated record of what that release shipped, and both remain true of v9 and 17.0.Why all 21 bot rows arrived, so the next reader does not over-read the number
Every one of the 27 rows is anchored on a single item —
master_detail (literal, a string literal in LOOKUP_TYPES). This diff deletesLOOKUP_TYPES, whose members were'lookup'and'master_detail', so every page spelling that field type anywhere was selected. ⇒ Correct rows, and zero signal about which page states the rule. Each was read individually; 1 of 21 was falsified.Dedupe — run with a control
Semantic search over
objectstack-ai/objectstack, 2026-09-10T16:33Z:Nearest neighbours, each read and judged not a duplicate:
content/docs/**and PR fix(service-analytics): resolve auser(andtree) dimension's display label through its reference, aslookupalready does #17470's own body routes these two sites here.referencenames an object that exists nowhere — the dangling target is found only at runtime #16611 (closed) — validate/lint/build accepting alookup/master_detailwhosereferencenames a nonexistent object. Same field types, different question (a dangling target, not a docs enumeration).crm_account.industry) renders raw stored values — the same field as a local dimension renders its option labels #5144 (closed,repo:objectui) — a dataset dimension on a dotted relationship path rendering raw stored values./analytics/queryignoring record-level scoping. Different.Refs: #16390 · PR #17470 ·
packages/services/service-analytics/src/dimension-labels.ts·REFERENCE_VALUE_TYPES/referenceTargetOfin@objectstack/spec/data· the#3680sort-key hook