cabloy 5.1.61 → 5.1.62

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (201) hide show
  1. package/.claude/skills/cabloy-backend-scaffold/SKILL.md +2 -0
  2. package/.claude/skills/cabloy-backend-scaffold/references/follow-up-checklist.md +1 -1
  3. package/.claude/skills/cabloy-domain-planning/SKILL.md +212 -0
  4. package/.claude/skills/cabloy-frontend-scaffold/SKILL.md +2 -0
  5. package/CHANGELOG.md +42 -0
  6. package/CLAUDE.md +1 -0
  7. package/cabloy-docs/.vitepress/config.mjs +158 -12
  8. package/cabloy-docs/ai/docs-skills-rules-mapping.md +8 -0
  9. package/cabloy-docs/ai/future-skill-roadmap.md +2 -0
  10. package/cabloy-docs/ai/skills.md +1 -0
  11. package/cabloy-docs/backend/backend-contract-emission-output-inspection.md +189 -0
  12. package/cabloy-docs/backend/backend-contract-emission-source-reading-map.md +160 -0
  13. package/cabloy-docs/backend/backend-contract-emission-specimen.md +170 -0
  14. package/cabloy-docs/backend/backend-resource-module-contract-chain.md +323 -0
  15. package/cabloy-docs/backend/backend-source-reading-debug-checklist.md +173 -0
  16. package/cabloy-docs/backend/backend-source-reading-roadmap.md +129 -0
  17. package/cabloy-docs/backend/backend-source-reading-verify-playbook.md +166 -0
  18. package/cabloy-docs/backend/bean-scene-authoring.md +4 -4
  19. package/cabloy-docs/backend/broadcast-guide.md +3 -3
  20. package/cabloy-docs/backend/cli.md +20 -11
  21. package/cabloy-docs/backend/config-guide.md +4 -4
  22. package/cabloy-docs/backend/controller-aop-guide.md +10 -10
  23. package/cabloy-docs/backend/controller-guide.md +12 -2
  24. package/cabloy-docs/backend/crud-workflow.md +7 -3
  25. package/cabloy-docs/backend/dto-guide.md +12 -2
  26. package/cabloy-docs/backend/dto-infer-generation.md +201 -25
  27. package/cabloy-docs/backend/election-guide.md +2 -2
  28. package/cabloy-docs/backend/entity-guide.md +12 -3
  29. package/cabloy-docs/backend/error-guide.md +3 -3
  30. package/cabloy-docs/backend/event-guide.md +4 -4
  31. package/cabloy-docs/backend/external-aop-guide.md +2 -2
  32. package/cabloy-docs/backend/field-indexes.md +9 -3
  33. package/cabloy-docs/backend/foundation.md +8 -8
  34. package/cabloy-docs/backend/i18n-guide.md +6 -6
  35. package/cabloy-docs/backend/internal-aop-guide.md +2 -2
  36. package/cabloy-docs/backend/introduction.md +13 -0
  37. package/cabloy-docs/backend/migration-and-changes.md +3 -3
  38. package/cabloy-docs/backend/model-guide.md +16 -6
  39. package/cabloy-docs/backend/openapi-guide.md +3 -0
  40. package/cabloy-docs/backend/queue-guide.md +3 -3
  41. package/cabloy-docs/backend/redlock-guide.md +2 -2
  42. package/cabloy-docs/backend/schedule-guide.md +2 -2
  43. package/cabloy-docs/backend/scripts.md +8 -0
  44. package/cabloy-docs/backend/serialization-guide.md +2 -2
  45. package/cabloy-docs/backend/service-guide.md +18 -9
  46. package/cabloy-docs/backend/startup-guide.md +5 -5
  47. package/cabloy-docs/backend/status-guide.md +7 -7
  48. package/cabloy-docs/backend/unit-testing.md +3 -3
  49. package/cabloy-docs/backend/vona-source-reading-map.md +157 -0
  50. package/cabloy-docs/backend/websocket-protocol-guide.md +5 -5
  51. package/cabloy-docs/backend/websocket-usage-guide.md +15 -8
  52. package/cabloy-docs/frontend/a-model-under-the-hood.md +281 -0
  53. package/cabloy-docs/frontend/a-openapi-under-the-hood.md +248 -0
  54. package/cabloy-docs/frontend/a-router-guide.md +307 -0
  55. package/cabloy-docs/frontend/api-guide.md +4 -4
  56. package/cabloy-docs/frontend/api-schema-guide.md +1 -0
  57. package/cabloy-docs/frontend/app-startup-guide.md +7 -4
  58. package/cabloy-docs/frontend/bean-scene-authoring.md +1 -1
  59. package/cabloy-docs/frontend/behavior-guide.md +16 -16
  60. package/cabloy-docs/frontend/cli.md +5 -5
  61. package/cabloy-docs/frontend/command-scene-authoring.md +17 -8
  62. package/cabloy-docs/frontend/component-guide.md +5 -5
  63. package/cabloy-docs/frontend/component-props-guide.md +1 -1
  64. package/cabloy-docs/frontend/component-v-model-guide.md +2 -2
  65. package/cabloy-docs/frontend/filter-query-select-data-flow-guide.md +260 -0
  66. package/cabloy-docs/frontend/form-guide.md +19 -28
  67. package/cabloy-docs/frontend/form-scene-to-page-meta-guide.md +303 -0
  68. package/cabloy-docs/frontend/foundation.md +10 -6
  69. package/cabloy-docs/frontend/frontend-source-reading-roadmap.md +249 -0
  70. package/cabloy-docs/frontend/generated-contract-consumption-debug-checklist.md +190 -0
  71. package/cabloy-docs/frontend/generated-contract-consumption-entry-branch.md +205 -0
  72. package/cabloy-docs/frontend/generated-contract-consumption-list-branch.md +157 -0
  73. package/cabloy-docs/frontend/generated-contract-consumption-specimen.md +203 -0
  74. package/cabloy-docs/frontend/generated-contract-consumption-verify-playbook.md +189 -0
  75. package/cabloy-docs/frontend/generic-component-guide.md +1 -1
  76. package/cabloy-docs/frontend/introduction.md +29 -7
  77. package/cabloy-docs/frontend/model-architecture.md +38 -2
  78. package/cabloy-docs/frontend/model-resource-cookbook.md +11 -8
  79. package/cabloy-docs/frontend/model-resource-internals-deep-dive.md +238 -0
  80. package/cabloy-docs/frontend/model-resource-owner-pattern.md +22 -2
  81. package/cabloy-docs/frontend/model-resource-usage-guide.md +22 -6
  82. package/cabloy-docs/frontend/model-state-guide.md +12 -9
  83. package/cabloy-docs/frontend/module-scope.md +8 -8
  84. package/cabloy-docs/frontend/modules-and-suites.md +2 -1
  85. package/cabloy-docs/frontend/navigation-guards-guide.md +7 -0
  86. package/cabloy-docs/frontend/openapi-sdk-guide.md +12 -4
  87. package/cabloy-docs/frontend/page-guide.md +9 -9
  88. package/cabloy-docs/frontend/page-meta-guide.md +466 -0
  89. package/cabloy-docs/frontend/page-params-guide.md +3 -3
  90. package/cabloy-docs/frontend/page-query-guide.md +2 -2
  91. package/cabloy-docs/frontend/page-route-guide.md +6 -0
  92. package/cabloy-docs/frontend/permission-formscene-action-visibility-guide.md +263 -0
  93. package/cabloy-docs/frontend/quickstart.md +14 -2
  94. package/cabloy-docs/frontend/resource-entry-page-deep-dive.md +271 -0
  95. package/cabloy-docs/frontend/resource-list-page-deep-dive.md +279 -0
  96. package/cabloy-docs/frontend/rest-resource-source-reading-map.md +522 -0
  97. package/cabloy-docs/frontend/rest-resource-under-the-hood.md +622 -0
  98. package/cabloy-docs/frontend/root-behaviors-guide.md +282 -0
  99. package/cabloy-docs/frontend/route-alias-guide.md +6 -0
  100. package/cabloy-docs/frontend/router-stack-guide.md +229 -0
  101. package/cabloy-docs/frontend/router-tabs-introduction.md +26 -3
  102. package/cabloy-docs/frontend/router-tabs-layout-integration.md +367 -0
  103. package/cabloy-docs/frontend/router-tabs-mechanism.md +6 -0
  104. package/cabloy-docs/frontend/router-tabs-route-meta-cookbook.md +7 -0
  105. package/cabloy-docs/frontend/router-tabs-vs-stack.md +167 -0
  106. package/cabloy-docs/frontend/router-view-hosts-guide.md +450 -0
  107. package/cabloy-docs/frontend/server-data.md +2 -1
  108. package/cabloy-docs/frontend/system-startup-guide.md +2 -2
  109. package/cabloy-docs/frontend/table-action-visibility-permission-flow-guide.md +263 -0
  110. package/cabloy-docs/frontend/table-cell-cookbook.md +568 -0
  111. package/cabloy-docs/frontend/table-guide.md +373 -0
  112. package/cabloy-docs/frontend/table-resource-crud-cookbook.md +496 -0
  113. package/cabloy-docs/frontend/zova-app-guide.md +251 -0
  114. package/cabloy-docs/frontend/zova-form-source-reading-map.md +7 -9
  115. package/cabloy-docs/frontend/zova-form-under-the-hood.md +5 -0
  116. package/cabloy-docs/frontend/zova-router-under-the-hood.md +561 -0
  117. package/cabloy-docs/frontend/zova-source-reading-map.md +101 -7
  118. package/cabloy-docs/frontend/zova-table-controller-render-supplement.md +225 -0
  119. package/cabloy-docs/frontend/zova-table-source-reading-map.md +317 -0
  120. package/cabloy-docs/frontend/zova-table-under-the-hood.md +532 -0
  121. package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions-debug-checklist.md +245 -0
  122. package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions-source-reading-map.md +139 -0
  123. package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions-verify-playbook.md +248 -0
  124. package/cabloy-docs/fullstack/backend-metadata-to-frontend-table-actions.md +511 -0
  125. package/cabloy-docs/fullstack/contract-loop-playbook.md +8 -2
  126. package/cabloy-docs/fullstack/edition-collaboration-differences.md +6 -0
  127. package/cabloy-docs/fullstack/frontend-metadata-to-backend.md +181 -48
  128. package/cabloy-docs/fullstack/introduction.md +3 -0
  129. package/cabloy-docs/fullstack/openapi-to-sdk.md +116 -2
  130. package/cabloy-docs/fullstack/suites-and-modules.md +333 -0
  131. package/cabloy-docs/fullstack/tutorial-1-first-module.md +3 -0
  132. package/cabloy-docs/fullstack/tutorial-2-first-crud.md +4 -0
  133. package/cabloy-docs/fullstack/tutorial-3-frontend-metadata-sharing.md +4 -0
  134. package/cabloy-docs/fullstack/tutorial-4-custom-level-renderers.md +31 -19
  135. package/cabloy-docs/fullstack/tutorial-5-backend-contract-sharing.md +5 -0
  136. package/cabloy-docs/fullstack/tutorial-6-one-contract-four-uses.md +4 -0
  137. package/cabloy-docs/fullstack/tutorials-overview.md +1 -1
  138. package/cabloy-docs/reference/bean-scene-boilerplates.md +13 -13
  139. package/cabloy-docs/reference/package-map.md +4 -3
  140. package/package.json +1 -1
  141. package/vona/pnpm-lock.yaml +22 -258
  142. package/vona/src/suite/a-training/modules/training-student/package.json +53 -0
  143. package/vona/src/suite/a-training/modules/training-student/src/.metadata/index.ts +400 -0
  144. package/vona/src/suite/a-training/modules/training-student/src/.metadata/locales.ts +18 -0
  145. package/vona/src/suite/a-training/modules/training-student/src/.metadata/this.ts +2 -0
  146. package/vona/src/suite/a-training/modules/training-student/src/bean/meta.index.ts +12 -0
  147. package/vona/src/suite/a-training/modules/training-student/src/bean/meta.version.ts +21 -0
  148. package/vona/src/suite/a-training/modules/training-student/src/bean/ssrMenu.student.ts +29 -0
  149. package/vona/src/suite/a-training/modules/training-student/src/config/locale/en-us.ts +15 -0
  150. package/vona/src/suite/a-training/modules/training-student/src/config/locale/zh-cn.ts +15 -0
  151. package/vona/src/suite/a-training/modules/training-student/src/controller/student.ts +74 -0
  152. package/vona/src/suite/a-training/modules/training-student/src/dto/studentCreate.tsx +28 -0
  153. package/vona/src/suite/a-training/modules/training-student/src/dto/studentSelectReq.tsx +44 -0
  154. package/vona/src/suite/a-training/modules/training-student/src/dto/studentSelectRes.tsx +11 -0
  155. package/vona/src/suite/a-training/modules/training-student/src/dto/studentSelectResItem.tsx +45 -0
  156. package/vona/src/suite/a-training/modules/training-student/src/dto/studentSummary.tsx +42 -0
  157. package/vona/src/suite/a-training/modules/training-student/src/dto/studentUpdate.tsx +28 -0
  158. package/vona/src/suite/a-training/modules/training-student/src/dto/studentView.tsx +25 -0
  159. package/vona/src/suite/a-training/modules/training-student/src/entity/student.tsx +84 -0
  160. package/vona/src/suite/a-training/modules/training-student/src/index.ts +2 -0
  161. package/vona/src/suite/a-training/modules/training-student/src/model/student.ts +10 -0
  162. package/vona/src/suite/a-training/modules/training-student/src/service/student.ts +57 -0
  163. package/vona/src/suite/a-training/modules/training-student/test/student.test.ts +173 -0
  164. package/vona/src/suite/a-training/modules/training-student/tsconfig.build.json +11 -0
  165. package/vona/src/suite/a-training/modules/training-student/tsconfig.json +7 -0
  166. package/vona/src/suite/a-training/package.json +12 -0
  167. package/vona/src/suite/a-training/tsconfig.base.json +4 -0
  168. package/vona/src/suite/a-training/tsconfig.json +10 -0
  169. package/zova/packages-zova/zova/package.json +2 -2
  170. package/zova/pnpm-lock.yaml +406 -680
  171. package/zova/src/suite/a-training/modules/training-student/cli/openapi.config.ts +9 -0
  172. package/zova/src/suite/a-training/modules/training-student/package.json +52 -0
  173. package/zova/src/suite/a-training/modules/training-student/src/.metadata/component/formFieldLevel.ts +31 -0
  174. package/zova/src/suite/a-training/modules/training-student/src/.metadata/index.ts +258 -0
  175. package/zova/src/suite/a-training/modules/training-student/src/.metadata/locales.ts +7 -0
  176. package/zova/src/suite/a-training/modules/training-student/src/.metadata/this.ts +2 -0
  177. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/baseURL.ts +5 -0
  178. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/index.ts +3 -0
  179. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/schemas.ts +196 -0
  180. package/zova/src/suite/a-training/modules/training-student/src/api/openapi/types.ts +4146 -0
  181. package/zova/src/suite/a-training/modules/training-student/src/api/trainingStudent.ts +151 -0
  182. package/zova/src/suite/a-training/modules/training-student/src/apiSchema/trainingStudent.ts +43 -0
  183. package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.actionDeleteForce.tsx +51 -0
  184. package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.actionSummary.tsx +56 -0
  185. package/zova/src/suite/a-training/modules/training-student/src/bean/tableCell.level.tsx +63 -0
  186. package/zova/src/suite/a-training/modules/training-student/src/component/formFieldLevel/controller.tsx +117 -0
  187. package/zova/src/suite/a-training/modules/training-student/src/config/locale/en-us.ts +9 -0
  188. package/zova/src/suite/a-training/modules/training-student/src/config/locale/zh-cn.ts +9 -0
  189. package/zova/src/suite/a-training/modules/training-student/src/index.ts +2 -0
  190. package/zova/src/suite/a-training/modules/training-student/src/model/student.ts +42 -0
  191. package/zova/src/suite/a-training/modules/training-student/tsconfig.build.json +13 -0
  192. package/zova/src/suite/a-training/modules/training-student/tsconfig.json +5 -0
  193. package/zova/src/suite/a-training/package.json +12 -0
  194. package/zova/src/suite/a-training/tsconfig.base.json +4 -0
  195. package/zova/src/suite/a-training/tsconfig.json +4 -0
  196. package/zova/src/suite/cabloy-basic/modules/basic-select/src/component/formFieldSelect/controller.tsx +29 -7
  197. package/zova/src/suite/cabloy-basic/modules/basic-select/src/component/select/controller.tsx +34 -11
  198. package/zova/src/suite-vendor/a-zova/modules/a-table/package.json +1 -1
  199. package/zova/src/suite-vendor/a-zova/modules/a-table/src/component/table/controller.tsx +3 -3
  200. package/zova/src/suite-vendor/a-zova/modules/a-table/src/lib/tableCell.ts +1 -1
  201. package/zova/src/suite-vendor/a-zova/package.json +2 -2
@@ -0,0 +1,263 @@
1
+ # Table Action Visibility and Permission Flow Guide
2
+
3
+ This guide explains how row and bulk action visibility works in current Cabloy Basic list pages.
4
+
5
+ Use this page when you want to understand:
6
+
7
+ - why a row action is visible or hidden
8
+ - why a bulk action is visible or hidden
9
+ - where table action permissions come from
10
+ - how row action and bulk action visibility differ
11
+ - how the list-page action path differs from the entry-page `formScene`-aware path
12
+
13
+ ## Why this page exists
14
+
15
+ Several existing docs already explain nearby pieces:
16
+
17
+ - [Table Guide](/frontend/table-guide) and [Zova Table Under the Hood](/frontend/zova-table-under-the-hood) explain table runtime and rendering
18
+ - [Model Resource Owner Pattern](/frontend/model-resource-owner-pattern) explains `ModelResource` as the owner of permissions and schema
19
+ - [Permission, formScene, and Action Visibility Guide](/frontend/permission-formscene-action-visibility-guide) explains the entry-page scene-aware action path
20
+
21
+ What those pages do not isolate directly is the list-page row/bulk action visibility path.
22
+
23
+ That is the gap this page fills.
24
+
25
+ In the current Basic source, list-page row and bulk action visibility are permission-driven, but they do not add the entry-page `formScene` prefilter layer.
26
+
27
+ ## The shortest accurate mental model
28
+
29
+ A practical mental model is:
30
+
31
+ 1. `ModelResource.permissions` is the permission source for the current resource
32
+ 2. `blockPage` publishes those permissions into the page render scope
33
+ 3. `blockTable` passes that scope into `ZTable`
34
+ 4. row action visibility is decided in the table-cell operations-row renderer through `$passport.checkPermission(...)`
35
+ 5. bulk action visibility is decided in the bulk-toolbar block through `$passport.checkPermission(...)`
36
+ 6. row and bulk list-page flows do not add the entry-page `formScene` visibility prefilter
37
+
38
+ That means current list-page action visibility is a permission-gating problem first, not a form-scene filtering problem.
39
+
40
+ ## What this guide is not
41
+
42
+ This page is not a general permission guide for all frontend action surfaces.
43
+
44
+ It is specifically about current **list-page** action visibility.
45
+
46
+ It is also not a page-entry action guide. If your question is about entry-page scene-aware toolbar actions, read [Permission, formScene, and Action Visibility Guide](/frontend/permission-formscene-action-visibility-guide).
47
+
48
+ ## Source-confirmed reading path
49
+
50
+ When reading this topic, use this order:
51
+
52
+ 1. `zova/src/suite/cabloy-basic/modules/basic-page/src/component/blockPage/controller.tsx`
53
+ 2. `zova/src/suite/cabloy-basic/modules/basic-page/src/component/blockTable/controller.tsx`
54
+ 3. `zova/src/suite/cabloy-basic/modules/basic-page/src/component/blockToolbarBulk/controller.tsx`
55
+ 4. `zova/src/suite/cabloy-basic/modules/basic-table/src/bean/tableCell.actionOperationsRow.tsx`
56
+ 5. `zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/permissions.ts`
57
+ 6. `zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/resource/tableActionRow.ts`
58
+ 7. `zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/resource/tableActionBulk.ts`
59
+ 8. optional contrast: `zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockToolbarRow/controller.tsx`
60
+
61
+ That order moves from permission source/context exposure, to row/bulk consumers, to permission-hint type contracts, and finally to the entry-page contrast.
62
+
63
+ ## Visibility flow by surface
64
+
65
+ ### 1. Permission source: `ModelResource.permissions`
66
+
67
+ The list-page permission source lives in:
68
+
69
+ ```text
70
+ zova/src/suite-vendor/a-cabloy/modules/rest-resource/src/model/resource.ts
71
+ ```
72
+
73
+ The current source confirms:
74
+
75
+ - `permissions` is computed from `this.$sdk.getPermissions(this.resource).data`
76
+
77
+ That means action visibility in list pages is grounded in resource-owned permissions, not in ad hoc page-local permission state.
78
+
79
+ ### 2. `blockPage` exposes permissions into page scope
80
+
81
+ The deeper list runtime lives in:
82
+
83
+ ```text
84
+ zova/src/suite/cabloy-basic/modules/basic-page/src/component/blockPage/controller.tsx
85
+ ```
86
+
87
+ This controller exposes `permissions` through the shared page CEL/render scope.
88
+
89
+ That matters because downstream blocks and table renders do not fetch permissions independently. They consume the permission surface prepared by the page runtime.
90
+
91
+ ### 3. `blockTable` passes page scope into `ZTable`
92
+
93
+ The table bridge lives in:
94
+
95
+ ```text
96
+ zova/src/suite/cabloy-basic/modules/basic-page/src/component/blockTable/controller.tsx
97
+ ```
98
+
99
+ This bridge passes:
100
+
101
+ - `data`
102
+ - `schemaRow`
103
+ - `tableScope`
104
+
105
+ into `ZTable`.
106
+
107
+ That means table-cell action visibility runs inside a render scope that already contains the page/resource permission surface.
108
+
109
+ ## Row action visibility
110
+
111
+ ### 4. Row actions are filtered in the operations-row cell bean
112
+
113
+ The key row-action file is:
114
+
115
+ ```text
116
+ zova/src/suite/cabloy-basic/modules/basic-table/src/bean/tableCell.actionOperationsRow.tsx
117
+ ```
118
+
119
+ This bean handles row action visibility in two related phases:
120
+
121
+ - `checkVisible(...)`
122
+ - `render(...)`
123
+
124
+ #### `checkVisible(...)`
125
+
126
+ The cell bean:
127
+
128
+ - iterates configured actions
129
+ - calls `$passport.checkPermission(permissions, actionName, permissionHint)` for each one
130
+ - collects only visible render providers
131
+ - prepares those renders in advance
132
+ - returns visible only if at least one action survives
133
+
134
+ This means the row-action container itself can disappear when no actions remain visible.
135
+
136
+ #### `render(...)`
137
+
138
+ At render time, the bean again filters actions with:
139
+
140
+ - `$passport.checkPermission(permissions, actionName, permissionHint)`
141
+
142
+ Only surviving actions are rendered into the row action container.
143
+
144
+ This is the clearest source-confirmed row-action rule:
145
+
146
+ - row action visibility is permission-driven
147
+ - it is resolved in the table-cell operations-row bean
148
+
149
+ ## Bulk action visibility
150
+
151
+ ### 5. Bulk actions are filtered in the bulk-toolbar block
152
+
153
+ The key bulk-action file is:
154
+
155
+ ```text
156
+ zova/src/suite/cabloy-basic/modules/basic-page/src/component/blockToolbarBulk/controller.tsx
157
+ ```
158
+
159
+ This block:
160
+
161
+ - iterates configured bulk actions
162
+ - reads `action.options?.permission`
163
+ - calls `$passport.checkPermission(this.permissions, actionName, permissionHint)`
164
+ - renders only the permitted actions
165
+
166
+ This is the clearest source-confirmed bulk-action rule:
167
+
168
+ - bulk action visibility is permission-driven
169
+ - it is resolved in the bulk-toolbar block
170
+
171
+ ## Row action hints vs bulk action hints
172
+
173
+ The permission hint contracts live in:
174
+
175
+ ```text
176
+ zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/permissions.ts
177
+ zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/resource/tableActionRow.ts
178
+ zova/src/suite-vendor/a-zova/modules/a-openapi/src/types/resource/tableActionBulk.ts
179
+ ```
180
+
181
+ The important source-confirmed difference is:
182
+
183
+ - `IPermissionHintTableActionRow` can carry row-style permission hint fields such as `formScene`
184
+ - `IPermissionHintTableActionBulk` does not carry `formScene`
185
+
186
+ This is a type-contract distinction, not only a docs convention.
187
+
188
+ ## What row and bulk actions do not do in current list pages
189
+
190
+ A common confusion is to assume that because entry-page actions can use `formScene`, table row or bulk actions automatically use the same scene-aware filter.
191
+
192
+ That is **not** the current list-page rule.
193
+
194
+ In current Basic list pages:
195
+
196
+ - row and bulk action visibility rely on permission gating
197
+ - they do not add the entry-page `formScene` prefilter path
198
+
199
+ So even if some row-style hint types can carry `formScene`, the current list-page row/bulk runtime path documented here should be read as permission-gating first.
200
+
201
+ ## Contrast with the entry-page action path
202
+
203
+ A useful contrast file is:
204
+
205
+ ```text
206
+ zova/src/suite/cabloy-basic/modules/basic-pageentry/src/component/blockToolbarRow/controller.tsx
207
+ ```
208
+
209
+ That entry-page action row:
210
+
211
+ - checks `permissionHint.formScene` first against `$$pageEntry.formMeta.formScene`
212
+ - then calls `$passport.checkPermission(...)`
213
+
214
+ That is a different rule from current list-page row/bulk visibility.
215
+
216
+ So the practical split is:
217
+
218
+ - **entry-page toolbar** = scene-aware visibility prefilter + permission check
219
+ - **list-page row/bulk actions** = permission check path only
220
+
221
+ ## What bulk actions can and cannot express today
222
+
223
+ Current public Basic source supports this rule clearly:
224
+
225
+ - bulk actions can express permission hints through `IPermissionHintTableActionBulk`
226
+ - bulk actions do not currently carry `formScene`
227
+ - bulk visibility should therefore not be documented as scene-aware unless the type/runtime contract changes
228
+
229
+ This is the safest public rule to teach.
230
+
231
+ ## Debugging checklist
232
+
233
+ If a list-page action is missing unexpectedly, ask:
234
+
235
+ 1. does `ModelResource.permissions` contain the expected action grant?
236
+ 2. is the page/table render scope exposing the expected `permissions`?
237
+ 3. is the action name correct for the configured renderer/action?
238
+ 4. is the permission hint aligned with the intended action semantics?
239
+ 5. for row actions, is the operations-row cell bean actually resolving a visible renderer set?
240
+ 6. for bulk actions, is the bulk toolbar reading the expected action config?
241
+ 7. are you accidentally expecting entry-page `formScene` behavior in a list-page action surface?
242
+
243
+ ## Where to read next
244
+
245
+ Use these next steps depending on your question:
246
+
247
+ - if you want the list-page runtime path that hosts these actions, read [Resource List Page Deep Dive](/frontend/resource-list-page-deep-dive)
248
+ - if you want the entry-page scene-aware action path, read [Permission, formScene, and Action Visibility Guide](/frontend/permission-formscene-action-visibility-guide)
249
+ - if you want the broader resource-owner permission surface, read [Model Resource Owner Pattern](/frontend/model-resource-owner-pattern)
250
+ - if you want table runtime internals, read [Zova Table Under the Hood](/frontend/zova-table-under-the-hood)
251
+
252
+ ## Final takeaway
253
+
254
+ The most accurate current Basic rule for list-page actions is:
255
+
256
+ - `ModelResource.permissions` is the permission source
257
+ - row action visibility is resolved in `tableCell.actionOperationsRow.tsx`
258
+ - bulk action visibility is resolved in `blockToolbarBulk/controller.tsx`
259
+ - both use `$passport.checkPermission(...)`
260
+ - current list-page row/bulk flows do **not** add the entry-page `formScene` prefilter
261
+ - bulk action hints do not carry `formScene`
262
+
263
+ That is the source-confirmed `table row / bulk action visibility` path in the current Cabloy Basic frontend architecture.