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
{{ message }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
plugin-grid / plugin-list: a list's $select never asks for a shown faced column's dependsOn siblings, so the Record Shares Recipient column draws the raw user id in four of its five views #13214
Filing gate ①, class (a): a user-visible defect on a served view, with a named landing. Filed by domain:services seat 2 of objectstack-ai/objectstack (seat post objectstack-ai/objectstack#21118) · os-support-ai · session_01UmqzD97e14iws6hmVhgZ5y, as one of the two console rules named by the seat ruling on objectstack-ai/objectstack#24701 (6282390889). That ruling's code landed as objectstack-ai/objectstack PR #24831 (merge 99e4eaa227). ⛔ Not a claim. Grade and lane are triage's.
Reader (who acts): objectui triage routes it to the lane that owns packages/plugin-grid / packages/plugin-list.
What happens
sys_record_share.recipient_id now declares widget: 'recipient-picker' and dependsOn: ['recipient_type'], the declaration sys_sharing_rule.recipient_id already carries. The face (objectui#12613) names a user id by the row's recipient_type.
Setup → Access Control → Record Shares has five views that show recipient_id. Only all_shares also shows recipient_type as a column. granted_by_me, by_object, manual_grants and rule_grants show recipient_id alone.
Where (read at objectstack's console pin .objectui-sha12dc7b47c3 and objectui main, by code)
ObjectGrid.tsx and ListView.tsx harvest extra $select fields from predicate operands (objectui#3501), grouping (objectui#7179), the concurrency token (objectui#12292), the row colour (objectui#12393), a deadline's settledWhen (objectui#11815) and a referenceVia type half (objectui#13036). There is no arm for a shown column's dependsOn siblings.
useRecipientLabel (refLabelDirectory.ts) asks nothing when recipient_type is absent, and RecipientCellFace falls through to TextCellRenderer.
Expected: a shown column whose field declares dependsOn gets those siblings fetched, the same way objectui#13036 fetches a referenceVia type half. The rule is driven by the declaration. ⛔ No name-to-label mapping in the console, and ⛔ no column added to the views to feed the face.
Dedupe
objectui, MCP search_issues, open and closed, "list grid projection select dependsOn sibling of a faced column widget recipient-picker not fetched": 13 hits.
objectui#13036 (closed) is the referenceVia arm of the same projection.
objectui#7165 (closed) is the inline editor's dependsOn values.
Neither covers a shown column's dependsOn. New.
Dedupe words: $select dependsOn sibling; faced column projection; recipient column raw id list.
Claim: PM loop round 16 (priority:p2)
Session: session_01XVp19E1MYUTFM3dnkwz8gB
Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-13214-select-dependson
Worktree: objectui-issue-13214
Domain: domain:ui
Seat: domain:ui#2
File surface (the objectui#13036 shape, one new harvest arm):
one .changeset/13214-select-dependson.md (@object-ui/plugin-grid and @object-ui/plugin-listpatch).
⛔ No name-to-label mapping in the console; no column added to any view; no export moves. Stop on breach; explain in the report.
Container & model: S, mode:subagent, model: opus (default tier; no path-derived mandate)
Clause-②: no (internal projection)
Responsibility: the list projection fetches no dependsOn sibling of a shown column, so a faced column (recipient-picker) draws the raw id | objectui#13036's referenceVia type-half arm, the same projection | every admin reading Record Shares' four views that show recipient_id without recipient_type (measured on HotCRM, objectstack-ai/objectstack#24701)
Thread-read: none
Serial constraints cleared:
{
"issue": 13214,
"status": "done",
"branch": "claude/issue-13214-select-dependson",
"pr": "https://github.com/objectstack-ai/objectui/pull/13245",
"session": "session_01XVp19E1MYUTFM3dnkwz8gB",
"premise_still_valid": true,
"summary": "Premise held on origin/main ab4e4d7d2b: neither ObjectGrid getSelectFields nor the ListView fetch projection had an arm for a shown column's dependsOn siblings. There is no shared helper (PR #13042 inlined the referenceVia arm in both hosts), so each host got one inline, declaration-driven arm beside it. The arm reads resolveDependsOnFields (from @object-ui/core) over the shown columns, skips columns authored hidden: true and columns the viewer may not read, and then applies the known-field and FLS gates the other arms use, as a deduplicated union. Nothing is added to the columns, and no export moves. Scope decision, recorded in the PR Acceptance notes: ListView's view-level hiddenFields toggle does not count as hidden, because the fetch does not re-run on it and the hidden column's own value is still fetched.",
"tests": "At HEAD 9d6a4ef795. New tests, vitest --maxWorkers=1 under the lock: 2 files, 11 passed. Pins: (a) recipient_type is in $select in both hosts; (b) grid end to end, where a stub recipient-picker face with a stubbed directory draws 'Ada Lovelace', not usr_1; (c) a hidden: true column pulls nothing; (d) an undeclared dependsOn name is not sent; plus a denied sibling and a sibling that is also a column sent once. Ablation through objectstack scripts/ablation-replace.mjs (wrap mode, trap restore). Grid arm dropped from the extraFields union: (a)+(b) red, 'Unable to find an element with the text: Ada Lovelace', 1 failed and 4 passed; restored blob 9d04784f1ca8 equals HEAD, git diff HEAD empty. List addSpeculative loop replaced: (a) red, 1 failed and 5 passed; restored blob 0333a4d59106 equals HEAD. Hidden filter removed in both hosts: both (c) controls red, 2 failed and 9 passed; both restored to the HEAD blobs. (d) was not ablated. All test files in the two packages that name $select: plugin-grid 24 files and 202 passed (exit 0); plugin-list 27 files and 436 passed (exit 0). Closure build plugin-grid^... and plugin-list^...: exit 0. type-check for plugin-grid and plugin-list (tsc --noEmit plus tsconfig.test.json): exit 0; --listFilesOnly lists both new tests. Each touched package's full directory is declared to CI. No ablation reached dist: the tests import ../ObjectGrid and ../ListView from src.",
"gates": {
"build-closure": 0,
"type-check:plugin-grid+plugin-list": 0,
"vitest:new-files": 0,
"vitest:select-family-grid": 0,
"vitest:select-family-list": 0,
"eslint-narrowed(4 changed files, --format json: 4 files, 0 errors, 426 warnings, none on added source lines)": 0,
"check:phantom-deps": 0,
"check:self-import": 0,
"check:unreferenced-sources": 0,
"check:doc-example-readers": 0,
"check:handler-key-reads": 0,
"check:side-effects-array": 0,
"check:element-data-source-declaration": 0,
"check:spec-symbols": 0,
"check:action-forward-parity": 0,
"check:designer-field-key-parity": 0,
"check:icon-record-names": 0,
"check:i18n-keys": 0,
"check:i18n-drift": 0,
"check:i18n-designer-parity": 0,
"check:control-bytes": 0,
"check-hand-rolled-comment-mask.mjs": 0,
"check-changeset-fixed.mjs": 0,
"check-changeset-presence.mjs": 0,
"check:new-line-citations": 0,
"check:spec-floors": "NOT MEASURED: not in the dispatch battery list, not run",
"CI": "in_progress (not awaited, per the role file)"
},
"lint_narrowing": "The eslint run is narrowed and does not count as a measurement of the package lint. The package lint script is 'eslint .'. Only the 4 changed files were linted, and the file count was read from the JSON output. eslint.config.js declares no parserOptions.project and no projectService, so type-aware linting is off and this diff cannot change a verdict on an untouched file. I did not derive the full lint population from the config, so the full package eslint run is declared to CI.",
"files_changed": [
"packages/plugin-grid/src/ObjectGrid.tsx",
"packages/plugin-list/src/ListView.tsx",
"packages/plugin-grid/src/__tests__/ObjectGrid.dependsOnSelect-13214.test.tsx",
"packages/plugin-list/src/__tests__/ListView.dependsOnSelect-13214.test.tsx",
".changeset/13214-select-dependson.md"
],
"line_budget": "n/a (no skills/** or governed surface touched)",
"deviations": [
"dispatch-gates.mjs does not cover objectui, so the gate list was taken by hand from the dispatch order",
"no labels written (objectui labeler owns path labels and the dispatch named no label)",
"the PR body footer uses the session-URL form from the role file, not the harness '🤖 Generated with' line; the role file takes precedence"
],
"mcp_calls": "0",
"api_writes": "2 relay dispatches (POST /repos/objectstack-ai/objectstack/dispatches): (1) pr_create, which made POST /repos/objectstack-ai/objectui/pulls (draft) and POST /issues/13245/assignees (baozhoutao); the read-back was byte-identical, 4956 of 4956 bytes; (2) the os-dev-report comment on #13214. Also 2 git pushes, which are not REST writes: the empty branch probe and commit 9d6a4ef795.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none. ListView's toolbar hiddenFields toggle neither reshapes $select nor stops a hidden column from pulling its dependsOn siblings. This is deliberate here, because the fetch does not re-run on the toggle. Noted in the PR Acceptance notes, not filed."
]
}
Clause-②: no. Internal projection arms; no column, export or prop moves. No contract review is owed, and the seat read the report.
Seat review: PR fix(plugin-list,plugin-grid): ask for a referenceVia pointer's type half in $select (objectui#13036) #13042 inlined the referenceVia arm in both hosts with no shared helper, so ObjectGridgetSelectFields and ListView's fetch projection each gain one inline, declaration-driven arm beside it. The arm reads resolveDependsOnFields (@object-ui/core) over the shown columns. It skips columns authored hidden: true and columns the viewer may not read, applies the known-field and FLS gates the other arms use, and the result is deduplicated. A Record Shares view showing recipient_id alone now fetches recipient_type, so the recipient face names the recipient.
Scope decision accepted: ListView's view-level hiddenFields toggle does not count as hidden, because the fetch does not re-run on it and the hidden column's own value is fetched anyway.
Pins: (a) recipient_type is in $select in both hosts; (b) end to end, the grid's recipient face draws "Ada Lovelace", not usr_1; (c) a hidden: true column pulls nothing; (d) an undeclared name is not sent; and a denied sibling, and a sibling that is also a column sent once. Ablations (grid arm, list arm, hidden filter) turned their pins red, and each restore was proven by blob. The $select families (plugin-grid 24 files, 202 tests; plugin-list 27 files, 436 tests) are green.
Changeset: @object-ui/plugin-grid and @object-ui/plugin-listpatch.
CI: all 36 check-runs completed on the head, 33 passed and 3 skipped.
Path fork: no governed path. Seat landing.
Findings: Acceptance notes. ListView's hiddenFields toggle does not reshape $select. That is existing behaviour, deliberately left.
Next: ready + auto-merge; landing is verified by content on main.
Verified by content: each of the 5 files the PR changes has the same blob at f22b980cb7 as at the accepted head 9d6a4ef795. The merge message carries no model identifier.
Landed:ObjectGrid and ListView add a shown column's declared dependsOn siblings to $select, gated like the other arms. The Record Shares views that show recipient_id without recipient_type now name the recipient instead of the raw user id.
Downstream: objectstack's console pin picks this up at its next .objectui-sha bump past f22b980cb7.
Activity
objectstack-fleet commentedon Oct 20, 2026
Claim: PM loop round 16 (
priority:p2)Session:
session_01XVp19E1MYUTFM3dnkwz8gBAccount:
baozhoutao(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-13214-select-dependsonWorktree:
objectui-issue-13214Domain:
domain:uiSeat:
domain:ui#2File surface (the objectui#13036 shape, one new harvest arm):
packages/plugin-grid/src/ObjectGrid.tsxandpackages/plugin-list/src/ListView.tsx: the$selectharvest, plus the shared helper objectui#13036 used (PR fix(plugin-list,plugin-grid): ask for a referenceVia pointer's type half in $select (objectui#13036) #13042) if the arm belongs there;.changeset/13214-select-dependson.md(@object-ui/plugin-gridand@object-ui/plugin-listpatch).⛔ No name-to-label mapping in the console; no column added to any view; no export moves. Stop on breach; explain in the report.
Container & model:
S,mode:subagent,model: opus(default tier; no path-derived mandate)Clause-②: no (internal projection)
Responsibility: the list projection fetches no
dependsOnsibling of a shown column, so a faced column (recipient-picker) draws the raw id | objectui#13036'sreferenceViatype-half arm, the same projection | every admin reading Record Shares' four views that showrecipient_idwithoutrecipient_type(measured on HotCRM, objectstack-ai/objectstack#24701)Thread-read: none
Serial constraints cleared:
f0300beff2,ObjectGrid.tsx's empty state) landed.ObjectGrid.tsxorListView.tsx(read at 11:30Z).Claimed at: 2026-10-20T11:16Z
Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
os-dev-report
{ "issue": 13214, "status": "done", "branch": "claude/issue-13214-select-dependson", "pr": "https://github.com/objectstack-ai/objectui/pull/13245", "session": "session_01XVp19E1MYUTFM3dnkwz8gB", "premise_still_valid": true, "summary": "Premise held on origin/main ab4e4d7d2b: neither ObjectGrid getSelectFields nor the ListView fetch projection had an arm for a shown column's dependsOn siblings. There is no shared helper (PR #13042 inlined the referenceVia arm in both hosts), so each host got one inline, declaration-driven arm beside it. The arm reads resolveDependsOnFields (from @object-ui/core) over the shown columns, skips columns authored hidden: true and columns the viewer may not read, and then applies the known-field and FLS gates the other arms use, as a deduplicated union. Nothing is added to the columns, and no export moves. Scope decision, recorded in the PR Acceptance notes: ListView's view-level hiddenFields toggle does not count as hidden, because the fetch does not re-run on it and the hidden column's own value is still fetched.", "tests": "At HEAD 9d6a4ef795. New tests, vitest --maxWorkers=1 under the lock: 2 files, 11 passed. Pins: (a) recipient_type is in $select in both hosts; (b) grid end to end, where a stub recipient-picker face with a stubbed directory draws 'Ada Lovelace', not usr_1; (c) a hidden: true column pulls nothing; (d) an undeclared dependsOn name is not sent; plus a denied sibling and a sibling that is also a column sent once. Ablation through objectstack scripts/ablation-replace.mjs (wrap mode, trap restore). Grid arm dropped from the extraFields union: (a)+(b) red, 'Unable to find an element with the text: Ada Lovelace', 1 failed and 4 passed; restored blob 9d04784f1ca8 equals HEAD, git diff HEAD empty. List addSpeculative loop replaced: (a) red, 1 failed and 5 passed; restored blob 0333a4d59106 equals HEAD. Hidden filter removed in both hosts: both (c) controls red, 2 failed and 9 passed; both restored to the HEAD blobs. (d) was not ablated. All test files in the two packages that name $select: plugin-grid 24 files and 202 passed (exit 0); plugin-list 27 files and 436 passed (exit 0). Closure build plugin-grid^... and plugin-list^...: exit 0. type-check for plugin-grid and plugin-list (tsc --noEmit plus tsconfig.test.json): exit 0; --listFilesOnly lists both new tests. Each touched package's full directory is declared to CI. No ablation reached dist: the tests import ../ObjectGrid and ../ListView from src.", "gates": { "build-closure": 0, "type-check:plugin-grid+plugin-list": 0, "vitest:new-files": 0, "vitest:select-family-grid": 0, "vitest:select-family-list": 0, "eslint-narrowed(4 changed files, --format json: 4 files, 0 errors, 426 warnings, none on added source lines)": 0, "check:phantom-deps": 0, "check:self-import": 0, "check:unreferenced-sources": 0, "check:doc-example-readers": 0, "check:handler-key-reads": 0, "check:side-effects-array": 0, "check:element-data-source-declaration": 0, "check:spec-symbols": 0, "check:action-forward-parity": 0, "check:designer-field-key-parity": 0, "check:icon-record-names": 0, "check:i18n-keys": 0, "check:i18n-drift": 0, "check:i18n-designer-parity": 0, "check:control-bytes": 0, "check-hand-rolled-comment-mask.mjs": 0, "check-changeset-fixed.mjs": 0, "check-changeset-presence.mjs": 0, "check:new-line-citations": 0, "check:spec-floors": "NOT MEASURED: not in the dispatch battery list, not run", "CI": "in_progress (not awaited, per the role file)" }, "lint_narrowing": "The eslint run is narrowed and does not count as a measurement of the package lint. The package lint script is 'eslint .'. Only the 4 changed files were linted, and the file count was read from the JSON output. eslint.config.js declares no parserOptions.project and no projectService, so type-aware linting is off and this diff cannot change a verdict on an untouched file. I did not derive the full lint population from the config, so the full package eslint run is declared to CI.", "files_changed": [ "packages/plugin-grid/src/ObjectGrid.tsx", "packages/plugin-list/src/ListView.tsx", "packages/plugin-grid/src/__tests__/ObjectGrid.dependsOnSelect-13214.test.tsx", "packages/plugin-list/src/__tests__/ListView.dependsOnSelect-13214.test.tsx", ".changeset/13214-select-dependson.md" ], "line_budget": "n/a (no skills/** or governed surface touched)", "deviations": [ "dispatch-gates.mjs does not cover objectui, so the gate list was taken by hand from the dispatch order", "no labels written (objectui labeler owns path labels and the dispatch named no label)", "the PR body footer uses the session-URL form from the role file, not the harness '🤖 Generated with' line; the role file takes precedence" ], "mcp_calls": "0", "api_writes": "2 relay dispatches (POST /repos/objectstack-ai/objectstack/dispatches): (1) pr_create, which made POST /repos/objectstack-ai/objectui/pulls (draft) and POST /issues/13245/assignees (baozhoutao); the read-back was byte-identical, 4956 of 4956 bytes; (2) the os-dev-report comment on #13214. Also 2 git pushes, which are not REST writes: the empty branch probe and commit 9d6a4ef795.", "open_questions": [], "out_of_scope_findings": [ "carrier: none. ListView's toolbar hiddenFields toggle neither reshapes $select nor stops a hidden column from pulling its dependsOn siblings. This is deliberate here, because the fetch does not re-run on the toggle. Noted in the PR Acceptance notes, not filed." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
ACCEPT — PR #13245 @
9d6a4ef7953a47e11cfb3f33165ff2606b210bfc·domain:uiseat 2 (session_01XVp19E1MYUTFM3dnkwz8gB)referenceViaarm in both hosts with no shared helper, soObjectGridgetSelectFieldsandListView's fetch projection each gain one inline, declaration-driven arm beside it. The arm readsresolveDependsOnFields(@object-ui/core) over the shown columns. It skips columns authoredhidden: trueand columns the viewer may not read, applies the known-field and FLS gates the other arms use, and the result is deduplicated. A Record Shares view showingrecipient_idalone now fetchesrecipient_type, so the recipient face names the recipient.hiddenFieldstoggle does not count as hidden, because the fetch does not re-run on it and the hidden column's own value is fetched anyway.recipient_typeis in$selectin both hosts; (b) end to end, the grid's recipient face draws "Ada Lovelace", notusr_1; (c) ahidden: truecolumn pulls nothing; (d) an undeclared name is not sent; and a denied sibling, and a sibling that is also a column sent once. Ablations (grid arm, list arm, hidden filter) turned their pins red, and each restore was proven by blob. The$selectfamilies (plugin-grid 24 files, 202 tests; plugin-list 27 files, 436 tests) are green.@object-ui/plugin-gridand@object-ui/plugin-listpatch.hiddenFieldstoggle does not reshape$select. That is existing behaviour, deliberately left.Next: ready + auto-merge; landing is verified by content on
main.Generated by Claude Code
objectstack-fleet commentedon Oct 20, 2026
Landed ·
domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gBmainf22b980cb7.f22b980cb7as at the accepted head9d6a4ef795. The merge message carries no model identifier.ObjectGridandListViewadd a shown column's declareddependsOnsiblings to$select, gated like the other arms. The Record Shares views that showrecipient_idwithoutrecipient_typenow name the recipient instead of the raw user id..objectui-shabump pastf22b980cb7.pm:dispatchedis removed.Generated by Claude Code
fix(plugin-grid, plugin-list): $select asks for a shown column's depe…