pi-apexlang 0.2.2 → 0.4.0

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 (239) hide show
  1. package/README.md +22 -5
  2. package/THIRD_PARTY_NOTICES.md +2 -2
  3. package/UPSTREAM.json +2 -2
  4. package/docs/assets/overview.en.png +0 -0
  5. package/docs/assets/overview.en.svg +89 -0
  6. package/docs/assets/overview.uk.png +0 -0
  7. package/docs/assets/overview.uk.svg +89 -0
  8. package/docs/en/README.md +41 -0
  9. package/docs/en/architecture.md +73 -0
  10. package/docs/en/getting-started.md +77 -0
  11. package/docs/en/maintenance.md +83 -0
  12. package/docs/en/tool-reference.md +85 -0
  13. package/docs/uk/README.md +41 -0
  14. package/docs/uk/architecture.md +73 -0
  15. package/docs/uk/getting-started.md +77 -0
  16. package/docs/uk/maintenance.md +83 -0
  17. package/docs/uk/tool-reference.md +85 -0
  18. package/extensions/apexlang/index.ts +19 -10
  19. package/extensions/lib/apexlang-cli.d.mts +1 -2
  20. package/extensions/lib/apexlang-cli.mjs +18 -13
  21. package/extensions/lib/apexlang-local-validate.mjs +83 -0
  22. package/extensions/lib/apexlang-local-validator.py +116 -0
  23. package/extensions/lib/apexlang-runtime-validate.mjs +76 -0
  24. package/package.json +2 -1
  25. package/skills/apexlang/APEXlang Skills and Workflows.md +325 -0
  26. package/skills/apexlang/README.md +6 -6
  27. package/skills/apexlang/RELEASE-NOTES.md +2 -2
  28. package/skills/apexlang/SKILL.md +24 -19
  29. package/skills/apexlang/agents/openai.yaml +4 -3
  30. package/skills/apexlang/assets/apex-generation/components.registry.json +1001 -16
  31. package/skills/apexlang/assets/apexlang/domains-catalog.json +6 -1
  32. package/skills/apexlang/assets/component-attributes.json +1924 -180
  33. package/skills/apexlang/assets/component-policies.json +19 -10
  34. package/skills/apexlang/assets/contracts/grammar-semantic-rules.json +134 -0
  35. package/skills/apexlang/assets/contracts/package-layers.json +56 -0
  36. package/skills/apexlang/assets/contracts/page-construction-packs.json +154 -0
  37. package/skills/apexlang/assets/contracts/page-patterns.json +119 -0
  38. package/skills/apexlang/assets/grammar/apexlang.ebnf +11743 -0
  39. package/skills/apexlang/assets/indexes/font-apex-icon-index.json +1699 -0
  40. package/skills/apexlang/assets/routing-catalog-main.json +11 -10
  41. package/skills/apexlang/assets/routing-load-policy.json +35 -9
  42. package/skills/apexlang/assets/rules-mapping.json +110 -2
  43. package/skills/apexlang/assets/rules.catalog.json +1298 -0
  44. package/skills/apexlang/assets/validator-fix-recipes.json +372 -17
  45. package/skills/apexlang/assets/workspace-intelligence.json +7 -10
  46. package/skills/apexlang/manifest.json +268 -12
  47. package/skills/apexlang/references/domains/README.md +1 -1
  48. package/skills/apexlang/references/domains/page-components/buttons.md +2 -2
  49. package/skills/apexlang/references/domains/page-components/page-items.md +3 -3
  50. package/skills/apexlang/references/domains/page-components/regions/region-display-selector/workflow-region-display-selector.md +69 -0
  51. package/skills/apexlang/references/domains/page-components/regions.md +1 -0
  52. package/skills/apexlang/references/domains/template-components/comments.md +61 -0
  53. package/skills/apexlang/references/domains/template-components/registry.md +2 -0
  54. package/skills/apexlang/references/domains/template-components/templates.md +47 -0
  55. package/skills/apexlang/references/domains/template-components/timeline.md +51 -0
  56. package/skills/apexlang/references/ops/one-message-router-contract.md +2 -2
  57. package/skills/apexlang/references/ops/runtime-gates/01-direct-sqlcl-import.md +1 -1
  58. package/skills/apexlang/references/ops/runtime-gates/02-direct-sqlcl-validate-gate.md +1 -1
  59. package/skills/apexlang/references/ops/runtime-gates.md +17 -16
  60. package/skills/apexlang/references/ops/sqlcl-agents/00-connection-gate.md +7 -7
  61. package/skills/apexlang/references/ops/sqlcl.md +7 -8
  62. package/skills/apexlang/references/policies/compiler-prop-map.md +6 -4
  63. package/skills/apexlang/references/policies/governance/00-governance.md +2 -2
  64. package/skills/apexlang/references/policies/memory-bank/00-guard/ai.guard.md +126 -922
  65. package/skills/apexlang/references/policies/memory-bank/20-data/apex.logic.md +3 -3
  66. package/skills/apexlang/references/policies/memory-bank/20-data/db.connection.md +9 -11
  67. package/skills/apexlang/references/policies/memory-bank/30-pages/apex.cards-page.md +95 -0
  68. package/skills/apexlang/references/policies/memory-bank/30-pages/apex.page.md +2 -2
  69. package/skills/apexlang/references/policies/memory-bank/30-pages/apex.smart-filter-search.md +145 -74
  70. package/skills/apexlang/references/policies/memory-bank/40-components/apex.region-interactions.md +9 -2
  71. package/skills/apexlang/references/policies/memory-bank/40-components/apex.region-media.md +6 -5
  72. package/skills/apexlang/references/policies/memory-bank/systemPatterns.md +9 -1
  73. package/skills/apexlang/references/workflows/apex-generation/agents/20-agent-draft.md +51 -232
  74. package/skills/apexlang/references/workflows/apex-generation/agents/30-agent-critique.md +49 -449
  75. package/skills/apexlang/references/workflows/apex-generation/agents/40-agent-revision.md +38 -238
  76. package/skills/apexlang/references/workflows/apex-generation/nlu/nlu-routing-test-matrix.md +8 -2
  77. package/skills/apexlang/references/workflows/apex-generation/nlu/nlu-routing-validation-notes.md +19 -3
  78. package/skills/apexlang/references/workflows/apex-generation/registry.md +15 -1
  79. package/skills/apexlang/references/workflows/apex-generation/templates.md +1 -1
  80. package/skills/apexlang/references/workflows/apex-generation.md +1 -1
  81. package/skills/apexlang/references/workflows/apexlang/apexlang-execution-model.md +5 -5
  82. package/skills/apexlang/references/workflows/apexlang/prompt-contracts.md +81 -10
  83. package/skills/apexlang/references/workflows/apexlang/workflow-create-app-from-fr-and-model.md +18 -7
  84. package/skills/apexlang/release-notes.json +156 -0
  85. package/skills/apexlang/runtime/grammar_contract.mjs +1166 -0
  86. package/skills/apexlang/runtime/internal/python/format_apexlang.py +210 -0
  87. package/skills/apexlang/runtime/internal/python/validate_apexlang.py +14142 -5843
  88. package/skills/apexlang/runtime/internal/python/validator_common.py +2 -0
  89. package/skills/apexlang/runtime/lib/catalogs.mjs +1026 -0
  90. package/skills/apexlang/runtime/lib/common.mjs +35 -0
  91. package/skills/apexlang/runtime/runtime.bundle.mjs +457 -57
  92. package/skills/apexlang/templates/items/combobox/combobox.explicit-defaults.md +1 -1
  93. package/skills/apexlang/templates/items/date-picker/date-picker._common.md +1 -1
  94. package/skills/apexlang/templates/items/date-picker/date-picker.explicit-defaults.md +1 -1
  95. package/skills/apexlang/templates/items/file-upload/file-upload._common.md +30 -24
  96. package/skills/apexlang/templates/items/file-upload/file-upload.compact-template.md +6 -0
  97. package/skills/apexlang/templates/items/file-upload/file-upload.explicit-defaults.md +23 -8
  98. package/skills/apexlang/templates/items/file-upload/file-upload.minimal.md +6 -0
  99. package/skills/apexlang/templates/items/hidden-item/hidden-item._common.md +1 -1
  100. package/skills/apexlang/templates/items/hidden-item/hidden-item.explicit-defaults.md +1 -1
  101. package/skills/apexlang/templates/items/items._common.md +3 -2
  102. package/skills/apexlang/templates/items/list-manager/list-manager.explicit-defaults.md +1 -1
  103. package/skills/apexlang/templates/items/markdown-editor/markdown-editor._common.md +1 -1
  104. package/skills/apexlang/templates/items/markdown-editor/markdown-editor.explicit-defaults.md +1 -1
  105. package/skills/apexlang/templates/items/number-field/number-field._common.md +8 -6
  106. package/skills/apexlang/templates/items/number-field/number-field.explicit-defaults.md +12 -2
  107. package/skills/apexlang/templates/items/popup-lov/popup-lov.explicit-defaults.md +1 -1
  108. package/skills/apexlang/templates/items/rich-text-editor/rich-text-editor._common.md +1 -1
  109. package/skills/apexlang/templates/items/rich-text-editor/rich-text-editor.explicit-defaults.md +1 -1
  110. package/skills/apexlang/templates/items/select-many/standard.md +1 -1
  111. package/skills/apexlang/templates/items/shuttle/shuttle.explicit-defaults.md +1 -1
  112. package/skills/apexlang/templates/items/switch/switch._common.md +8 -8
  113. package/skills/apexlang/templates/items/switch/switch.explicit-defaults.md +1 -1
  114. package/skills/apexlang/templates/items/text-area/text-area._common.md +2 -3
  115. package/skills/apexlang/templates/items/text-area/text-area.explicit-defaults.md +1 -1
  116. package/skills/apexlang/templates/items/text-area/text-area.required-length.md +1 -3
  117. package/skills/apexlang/templates/items/text-autocomplete/text-autocomplete.explicit-defaults.md +1 -1
  118. package/skills/apexlang/templates/items/text-autocomplete/text-autocomplete.required-length.md +1 -3
  119. package/skills/apexlang/templates/items/text-field/text-field._common.md +2 -3
  120. package/skills/apexlang/templates/items/text-field/text-field.explicit-defaults.md +1 -1
  121. package/skills/apexlang/templates/items/text-field/text-field.required-length.md +1 -3
  122. package/skills/apexlang/templates/page-examples/faceted-search/faceted-search.example.md +0 -5
  123. package/skills/apexlang/templates/page-examples/form-page/form-page.example.md +0 -9
  124. package/skills/apexlang/templates/page-examples/interactive-report-page/interactive-report-page.example.md +2 -2
  125. package/skills/apexlang/templates/page-examples/login-page/login-page.example.md +0 -8
  126. package/skills/apexlang/templates/page-examples/task-definition-initiated-tasks-page/task-definition-initiated-tasks-page.example.md +7 -17
  127. package/skills/apexlang/templates/page-examples/task-definition-my-tasks-page/task-definition-my-tasks-page.example.md +7 -65
  128. package/skills/apexlang/templates/page-examples/task-definition-task-details/task-definition-task-details.example.md +38 -201
  129. package/skills/apexlang/templates/region-components/calendar/calendar.custom-styling.md +3 -1
  130. package/skills/apexlang/templates/region-components/calendar/calendar.faceted-search.md +3 -2
  131. package/skills/apexlang/templates/region-components/cards/README.md +12 -4
  132. package/skills/apexlang/templates/region-components/cards/cards._common.md +176 -37
  133. package/skills/apexlang/templates/region-components/cards/cards._index.md +2 -1
  134. package/skills/apexlang/templates/region-components/cards/cards.refresh-after-dialog.md +46 -0
  135. package/skills/apexlang/templates/region-components/cards/cards.refresh-on-change.md +58 -0
  136. package/skills/apexlang/templates/region-components/cards/cards.rest-source.md +54 -18
  137. package/skills/apexlang/templates/region-components/cards/cards.standard.md +37 -21
  138. package/skills/apexlang/templates/region-components/chart/chart._series._common.md +1 -4
  139. package/skills/apexlang/templates/region-components/chart/chart.pie.md +6 -2
  140. package/skills/apexlang/templates/region-components/chart/chart.status-meter-gauge.md +1 -1
  141. package/skills/apexlang/templates/region-components/chart/chart.stock.md +2 -0
  142. package/skills/apexlang/templates/region-components/chart/features/chart.feature-chart-links.md +9 -7
  143. package/skills/apexlang/templates/region-components/faceted-search/faceted-search._common.md +1 -14
  144. package/skills/apexlang/templates/region-components/form/form._items._common.md +1 -5
  145. package/skills/apexlang/templates/region-components/interactive-report/interactive-report._columns._common.md +2 -6
  146. package/skills/apexlang/templates/region-components/interactive-report/interactive-report.page-header-actions.md +1 -7
  147. package/skills/apexlang/templates/region-components/list/README.md +1 -1
  148. package/skills/apexlang/templates/region-components/list/list._common.md +1 -1
  149. package/skills/apexlang/templates/region-components/map/map.backgrounds.md +12 -10
  150. package/skills/apexlang/templates/region-components/map/map.layer.extruded-polygons.md +16 -12
  151. package/skills/apexlang/templates/region-components/map/map.layer.heat-map.md +10 -7
  152. package/skills/apexlang/templates/region-components/map/map.layer.lines.md +10 -8
  153. package/skills/apexlang/templates/region-components/map/map.layer.polygons.md +21 -18
  154. package/skills/apexlang/templates/region-components/map/map.region.background-custom.md +25 -19
  155. package/skills/apexlang/templates/region-components/map/map.region.background-shared.md +19 -13
  156. package/skills/apexlang/templates/region-components/map/map.region.bbox-sql.md +13 -13
  157. package/skills/apexlang/templates/region-components/map/map.region.bbox-static.md +2 -2
  158. package/skills/apexlang/templates/region-components/map/map.region.browser-location.md +3 -7
  159. package/skills/apexlang/templates/region-components/map/map.region.init-position-sql.md +7 -7
  160. package/skills/apexlang/templates/region-components/region-display-selector/README.md +5 -2
  161. package/skills/apexlang/templates/region-components/region-display-selector/region-display-selector._common.md +60 -7
  162. package/skills/apexlang/templates/region-components/region-display-selector/region-display-selector._index.md +4 -1
  163. package/skills/apexlang/templates/region-components/region-display-selector/region-display-selector.permutations.md +55 -0
  164. package/skills/apexlang/templates/region-components/region-display-selector/region-display-selector.standard.md +91 -5
  165. package/skills/apexlang/templates/region-components/smart-filter-search/README.md +6 -2
  166. package/skills/apexlang/templates/region-components/smart-filter-search/smart-filter-search._common.md +107 -46
  167. package/skills/apexlang/templates/region-components/smart-filter-search/smart-filter-search._index.md +4 -3
  168. package/skills/apexlang/templates/region-components/smart-filter-search/smart-filter-search.standard.md +33 -17
  169. package/skills/apexlang/templates/shared-components/component-settings/component-settings._common.md +1 -0
  170. package/skills/apexlang/templates/shared-components/component-settings.example.md +1 -0
  171. package/skills/apexlang/templates/shared-components/email-templates.example.md +1 -1
  172. package/skills/apexlang/templates/shared-components/rest-data-sources/example_rest_data_source.example.md +40 -46
  173. package/skills/apexlang/templates/shared-components/task-definitions/action-task.example.md +2 -30
  174. package/skills/apexlang/templates/shared-components/task-definitions/approve-request.example.md +3 -31
  175. package/skills/apexlang/templates/template-components/README.md +27 -15
  176. package/skills/apexlang/templates/template-components/avatar/README.md +56 -0
  177. package/skills/apexlang/templates/template-components/avatar/avatar._common.md +149 -0
  178. package/skills/apexlang/templates/template-components/avatar/avatar._index.md +42 -0
  179. package/skills/apexlang/templates/template-components/{avatar._template_options.md → avatar/avatar._template_options.md} +1 -1
  180. package/skills/apexlang/templates/template-components/avatar/avatar.report-icon.md +48 -0
  181. package/skills/apexlang/templates/template-components/avatar/avatar.report-image-url-column.md +62 -0
  182. package/skills/apexlang/templates/template-components/avatar/avatar.report-initials.md +54 -0
  183. package/skills/apexlang/templates/template-components/badge/README.md +38 -0
  184. package/skills/apexlang/templates/template-components/badge/badge._common.md +183 -0
  185. package/skills/apexlang/templates/template-components/badge/badge._index.md +20 -0
  186. package/skills/apexlang/templates/template-components/badge/badge.report-link.md +66 -0
  187. package/skills/apexlang/templates/template-components/badge/badge.report-minimal.md +76 -0
  188. package/skills/apexlang/templates/template-components/comments/README.md +20 -0
  189. package/skills/apexlang/templates/template-components/comments/comments._common.md +43 -0
  190. package/skills/apexlang/templates/template-components/comments/comments._index.md +25 -0
  191. package/skills/apexlang/templates/template-components/{comments._template_options.md → comments/comments._template_options.md} +2 -1
  192. package/skills/apexlang/templates/template-components/comments/comments.apex-task-comments.md +77 -0
  193. package/skills/apexlang/templates/template-components/comments/comments.partial-column.md +120 -0
  194. package/skills/apexlang/templates/template-components/comments/comments.permutations.md +425 -0
  195. package/skills/apexlang/templates/template-components/content-row/README.md +1 -1
  196. package/skills/apexlang/templates/template-components/content-row/content-row._common.md +1 -1
  197. package/skills/apexlang/templates/template-components/content-row/content-row._index.md +1 -1
  198. package/skills/apexlang/templates/template-components/content-row/content-row._template_options.md +1 -1
  199. package/skills/apexlang/templates/template-components/flexbox-container/README.md +9 -0
  200. package/skills/apexlang/templates/template-components/flexbox-container/flexbox-container._index.md +13 -0
  201. package/skills/apexlang/templates/template-components/media-list/README.md +100 -0
  202. package/skills/apexlang/templates/template-components/media-list/media-list._common.md +174 -0
  203. package/skills/apexlang/templates/template-components/media-list/media-list._index.md +50 -0
  204. package/skills/apexlang/templates/template-components/{media-list._template_options.md → media-list/media-list._template_options.md} +8 -2
  205. package/skills/apexlang/templates/template-components/media-list/media-list.partial.md +50 -0
  206. package/skills/apexlang/templates/template-components/media-list/media-list.report-avatar-badge.md +76 -0
  207. package/skills/apexlang/templates/template-components/media-list/media-list.report-base.md +71 -0
  208. package/skills/apexlang/templates/template-components/media-list/media-list.report-grouped.md +40 -0
  209. package/skills/apexlang/templates/template-components/media-list/media-list.report-layouts.md +50 -0
  210. package/skills/apexlang/templates/template-components/media-list/media-list.report-link.md +53 -0
  211. package/skills/apexlang/templates/template-components/metric-card/README.md +19 -4
  212. package/skills/apexlang/templates/template-components/metric-card/metric-card._common.md +122 -29
  213. package/skills/apexlang/templates/template-components/metric-card/metric-card._index.md +6 -0
  214. package/skills/apexlang/templates/template-components/metric-card/metric-card._template_options.md +47 -2
  215. package/skills/apexlang/templates/template-components/metric-card/metric-card.partial-minimal.md +51 -0
  216. package/skills/apexlang/templates/template-components/metric-card/metric-card.permutations.md +56 -0
  217. package/skills/apexlang/templates/template-components/metric-card/metric-card.report-avatar-badge.md +98 -0
  218. package/skills/apexlang/templates/template-components/metric-card/metric-card.report-grouping-selection.md +131 -0
  219. package/skills/apexlang/templates/template-components/metric-card/metric-card.report-link.md +66 -0
  220. package/skills/apexlang/templates/template-components/metric-card/metric-card.report-minimal.md +97 -0
  221. package/skills/apexlang/templates/template-components/template-components.registry.json +90 -1
  222. package/skills/apexlang/templates/template-components/timeline/README.md +19 -0
  223. package/skills/apexlang/templates/template-components/timeline/timeline._common.md +43 -0
  224. package/skills/apexlang/templates/template-components/timeline/timeline._index.md +24 -0
  225. package/skills/apexlang/templates/template-components/{timeline._template_options.md → timeline/timeline._template_options.md} +2 -1
  226. package/skills/apexlang/templates/template-components/timeline/timeline.permutations.md +399 -0
  227. package/skills/apexlang/templates/template-components/timeline/timeline.report-sample-data.md +168 -0
  228. package/skills/apexlang/templates/workspace-components/credentials/credentials-for-open-ai.example.md +1 -1
  229. package/skills/apexlang/templates/workspace-components/generative-ai-services/open-ai.example.md +8 -6
  230. package/skills/apexlang/tools/apexctl.mjs +167 -4
  231. package/skills/apexlang/tools/compiler-truth-audit.mjs +95 -63
  232. package/skills/apexlang/tools/query-valid-props-context.mjs +30 -0
  233. package/skills/apexlang/tools/query-valid-props-normalize.mjs +1 -0
  234. package/skills/apexlang/tools/query-valid-props-runtime.mjs +13 -8
  235. package/skills/apexlang/tools/query-valid-props-semantics.mjs +391 -0
  236. package/skills/apexlang/tools/query-valid-props-template-components.mjs +15 -1
  237. package/skills/apexlang/tools/query-valid-props.mjs +198 -216
  238. /package/skills/apexlang/templates/template-components/{badge._template_options.md → badge/badge._template_options.md} +0 -0
  239. /package/skills/apexlang/templates/template-components/{flexbox-container._template_options.md → flexbox-container/flexbox-container._template_options.md} +0 -0
@@ -0,0 +1,1298 @@
1
+ {
2
+ "schemaVersion": 2,
3
+ "purpose": "Machine-readable best-practice source for task-specific context projection. Resolve it through apexctl context commands instead of loading the complete catalog or broad agent checklists into model context.",
4
+ "prose_migration_coverage": {
5
+ "source_path": "references/policies/memory-bank/00-guard/ai.guard.md",
6
+ "source_revision": "0683cc52b17b829232f881d2d2ea1a4da476f63a",
7
+ "source_bytes": 72944,
8
+ "source_sha256": "29164e1625cc03e9475986870e23ac251e51f23b41c8dd822aa0fd880ab541ee",
9
+ "instruction_selector": "top-level Markdown bullets containing MUST or MUST NOT",
10
+ "normalization": "trim each selected line, collapse whitespace, preserve source order, and join with LF",
11
+ "instruction_count": 273,
12
+ "instruction_digest": "10c95299880cf3cd96779fae112b40c5babbc1e29a6bc9d19f55b4a2b5bcb686",
13
+ "coverage_groups": [
14
+ {
15
+ "id": "routing-authority",
16
+ "rule_ids": ["PROMPT_NORMALIZATION_REQUIRED_001", "GRAMMAR_FIRST_AUTHORITY_REQUIRED_001", "PROGRESSIVE_DISCLOSURE_TRACE_REQUIRED_001", "TOOLING_REWRITE_ALIAS_LITERAL_REQUIRED_001", "ORACLE_DB_SKILLS_DELEGATION_REQUIRED_001"],
17
+ "profile_ids": [],
18
+ "enforcement_paths": ["SKILL.md", "references/policies/governance/00-governance.md"],
19
+ "source_sections": [
20
+ {"heading": "Prompt Normalization Gate (NON-NEGOTIABLE)", "instruction_count": 8, "instruction_digest": "5fb945ce4becf728ea4a8ec0cabe2fd97d6a20b1b7d5d34eef6c06f523493a03"},
21
+ {"heading": "Grammar-First Progressive Disclosure Gate (NON-NEGOTIABLE)", "instruction_count": 8, "instruction_digest": "3c79d4fd276c6705cd4db1e6a930fb556b9fd12b27100e0b0a4641c39e447109"},
22
+ {"heading": "Tooling Rewrite Safety (NON-NEGOTIABLE)", "instruction_count": 3, "instruction_digest": "787167d75074a62cfe3aca9ba931bda0a4c00ac43371129aea81a76be40594c9"},
23
+ {"heading": "Oracle DB Skills Delegation Boundary (NON-NEGOTIABLE)", "instruction_count": 7, "instruction_digest": "4560b6237403b11542c612b857cfb87e4404de447f6683d43b8be9263a6219ad"}
24
+ ]
25
+ },
26
+ {
27
+ "id": "security-artifacts",
28
+ "rule_ids": ["SECURITY_BASELINE_REQUIRED_001", "PUBLIC_PAGE_REVIEW_REQUIRED_001", "HIDDEN_ITEM_SSP_REQUIRED_001", "REPORT_ESCAPE_REQUIRED_001", "SECURE_COOKIE_DSL_UNVERIFIED_001", "APP_TEMPLATE_ARTIFACT_LEAK_001", "APEXLANG_LF_LINE_ENDINGS_REQUIRED_001"],
29
+ "profile_ids": ["full-app"],
30
+ "enforcement_paths": ["runtime/internal/python/validate_apexlang.py", "assets/validator-fix-recipes.json", "tools/apexctl.mjs"],
31
+ "source_sections": [
32
+ {"heading": "Generated Application Security Baseline (NON-NEGOTIABLE)", "instruction_count": 47, "instruction_digest": "2a7b8e4380fe96b94101cc9a0a555bf2e0d53d4b6ab72f51bf095c542fe778d1"},
33
+ {"heading": "APEXlang Line Ending Gate (NON-NEGOTIABLE)", "instruction_count": 3, "instruction_digest": "7c2b91e98f7426e47aa67e3f7e0f7c60dded9e25681c3a7bed7af384eb526e72"}
34
+ ]
35
+ },
36
+ {
37
+ "id": "calendar-composition",
38
+ "rule_ids": ["CALENDAR_CREATE_LINK_TARGET_REQUIRED_001", "CALENDAR_VIEW_LINK_TARGET_REQUIRED_001", "CALENDAR_REPORT_TYPE_REQUIRED_001", "CALENDAR_REPORT_PK_FILTER_REQUIRED_001", "COMPOSITION_CONTRACT_REQUIRED_001", "GRID_SCOPE_REQUIRED_001", "CSS_CLASS_INVENTION_FORBIDDEN_001"],
39
+ "profile_ids": [],
40
+ "enforcement_paths": ["runtime/internal/python/validate_apexlang.py", "references/policies/memory-bank/40-components/apex.templates.md"],
41
+ "source_sections": [
42
+ {"heading": "Calendar Link Target Resolution Gate (NON-NEGOTIABLE)", "instruction_count": 11, "instruction_digest": "05f15af2886132fabc2a5d3cf18e5c2e581611b3e69fb75e3959edbbbd6bde1a"},
43
+ {"heading": "Structure-First UI Composition Gate (NON-NEGOTIABLE)", "instruction_count": 6, "instruction_digest": "1df05269da25a8d09c5a39dd2ce84bc66e698606c6b5de9eef11cb9f332e606d"}
44
+ ]
45
+ },
46
+ {
47
+ "id": "database-evidence",
48
+ "rule_ids": ["DB_MODE_PROMPT_REQUIRED_001", "DB_CONN_REQUIRED_001", "DB_OBJECT_EVIDENCE_REQUIRED_001", "DB_METADATA_REQUIRED_REPORT_001", "DB_VERIFY_BEFORE_GENERATION_001"],
49
+ "profile_ids": ["interactive-report", "classic-report", "standalone-avatar", "media-list", "form", "faceted-search"],
50
+ "enforcement_paths": ["tools/apexctl.mjs", "references/ops/sqlcl.md", "references/workflows/apex-generation/agents/20-agent-draft.md", "references/workflows/apex-generation/agents/30-agent-critique.md"],
51
+ "source_sections": [
52
+ {"heading": "DB Metadata Prerequisite Gate (NON-NEGOTIABLE)", "instruction_count": 49, "instruction_digest": "cca8061238d3156def2a38d6900f7a9821ae74f8f78cdc7c86806c7bf0cdd3ea"},
53
+ {"heading": "Local Database Source Metadata Gate (NON-NEGOTIABLE)", "instruction_count": 5, "instruction_digest": "00db8969b65976e58a2717944a70cf22146ba42095751e5a149434fc45065bc0"},
54
+ {"heading": "Object Evidence Gate (NON-NEGOTIABLE)", "instruction_count": 6, "instruction_digest": "c4ea758b6cdad687cf008e9866f9b86da6b0d78171fa5b205ffca555e8197da2"},
55
+ {"heading": "Report DB Metadata Verification Gate (NON-NEGOTIABLE)", "instruction_count": 4, "instruction_digest": "058d38e23e0bdaf3ee1926a50a61949cedfacb605ba26b771eabbf64868fc4c1"},
56
+ {"heading": "Pre-Generation DB Verification Gate (NON-NEGOTIABLE)", "instruction_count": 6, "instruction_digest": "7129cd20d766f1a6d2bf679f8f84ee9f00fafbd480b964e717bbb93b4add2d9c"}
57
+ ]
58
+ },
59
+ {
60
+ "id": "runtime-completion",
61
+ "rule_ids": ["LIVE_RUNTIME_VALIDATION_REQUIRED_001", "RUNTIME_GATE_COMPLETION_REQUIRED_001", "ONLINE_IMPORT_CONDITIONAL_001"],
62
+ "profile_ids": [],
63
+ "enforcement_paths": ["tools/apexctl.mjs", "runtime/runtime.bundle.mjs", "references/ops/runtime-gates.md"],
64
+ "source_sections": [
65
+ {"heading": "Validation Deferral Prevention Gate (NON-NEGOTIABLE)", "instruction_count": 15, "instruction_digest": "8753390b89e9b2a3a06ff9a4864f0f3bda9f4a4a09d046887441945b1e31ac00"},
66
+ {"heading": "APEX Artifact Completion Gate (NON-NEGOTIABLE)", "instruction_count": 5, "instruction_digest": "b72af170861eda97393abf4e87ba20ad4a14c561294237cb38b46491d9e12324"}
67
+ ]
68
+ },
69
+ {
70
+ "id": "compatibility-maintenance",
71
+ "rule_ids": ["GRAMMAR_FIRST_AUTHORITY_REQUIRED_001", "APEXLANG_BUILD_REFRESH_SCOPE_REQUIRED_001"],
72
+ "profile_ids": [],
73
+ "enforcement_paths": ["runtime/internal/python/validate_apexlang_vocab.py", "tools/apexctl.mjs", "references/policies/governance/00-governance.md"],
74
+ "source_sections": [
75
+ {"heading": "APEXlang Vocabulary Compatibility Gate (NON-NEGOTIABLE)", "instruction_count": 11, "instruction_digest": "1f3aadeccdacdc2d28d0065977467943abbd83429cfeb8a6923acf6da36d87f6"},
76
+ {"heading": "APEXlang Build Refresh Discipline Gate (NON-NEGOTIABLE)", "instruction_count": 6, "instruction_digest": "ecf75183ebd2bdf6f9af849e702079faaea4e78a23cd14782bb0b14e9129ed9c"}
77
+ ]
78
+ },
79
+ {
80
+ "id": "nl2ir-metadata",
81
+ "rule_ids": ["DB_OBJECT_EVIDENCE_REQUIRED_001", "DB_METADATA_REQUIRED_REPORT_001", "INTERACTIVE_REPORT_COLUMN_COVERAGE_001"],
82
+ "profile_ids": ["interactive-report"],
83
+ "enforcement_paths": ["references/policies/memory-bank/30-pages/apex.interactive-report.md", "templates/region-components/interactive-report/interactive-report.nl2ir.md"],
84
+ "source_sections": [
85
+ {"heading": "NL2IR Context Source Resolution (NON‑NEGOTIABLE)", "instruction_count": 13, "instruction_digest": "2a1c837739e8f35f59bf2f91a10b9e05f384226e39d687a2d7d80d097d2f9722"}
86
+ ]
87
+ },
88
+ {
89
+ "id": "report-sql-acl",
90
+ "rule_ids": ["REPORT_SQL_HTML_LITERAL_FORBIDDEN_001", "STATIC_ID_WHERE_LOWER_REQUIRED_001", "ACL_ROLE_DECLARATION_REQUIRED_001"],
91
+ "profile_ids": ["interactive-report", "classic-report"],
92
+ "enforcement_paths": ["runtime/internal/python/validate_apexlang.py", "assets/validator-fix-recipes.json"],
93
+ "source_sections": [
94
+ {"heading": "Report SQL/PLSQL HTML Literal Gate (NON-NEGOTIABLE)", "instruction_count": 4, "instruction_digest": "4efd88c442002fcb1dc9777d07776f66afca36cf481603a7f1fe7c3f7d4465cc"},
95
+ {"heading": "Static-ID WHERE Comparison Normalization Gate (NON-NEGOTIABLE)", "instruction_count": 4, "instruction_digest": "0d011659dea844285448bbe5bc6530ea5647771ce8549652cf87e1a3ed873dcc"},
96
+ {"heading": "ACL Role Declaration Dependency Gate (NON-NEGOTIABLE)", "instruction_count": 4, "instruction_digest": "e049624d7f5aca777463cc63c6c57b90aef9e9c53339afde0bd3ebd30cf3da22"}
97
+ ]
98
+ },
99
+ {
100
+ "id": "rest-source-contract",
101
+ "rule_ids": ["GRAMMAR_FIRST_AUTHORITY_REQUIRED_001", "DB_OBJECT_EVIDENCE_REQUIRED_001"],
102
+ "profile_ids": ["rest-data-source"],
103
+ "enforcement_paths": ["references/policies/memory-bank/40-components/apex.region-data-source.md", "runtime/internal/python/validate_apexlang.py"],
104
+ "source_sections": [
105
+ {"heading": "REST Source Canonical Reference Rule (NON‑NEGOTIABLE)", "instruction_count": 4, "instruction_digest": "29e93b25c0697dacb1a1aae6c11a97b90e8b3e5e7950533fe36796cf7194f923"},
106
+ {"heading": "REST Data Source Alias Mapping (NON‑NEGOTIABLE)", "instruction_count": 3, "instruction_digest": "c70d3387dce1a42363ce24ab6ca8ccba4783464aa616331b896de9509ed40b54"},
107
+ {"heading": "Remote Server “single origin” rule for REST Data Source (NON-NEGOTIABLE)", "instruction_count": 1, "instruction_digest": "a704328dd54fe36dbaa0dc46437cde95a07da128cbf81e73ca59cc67aa5f3522"},
108
+ {"heading": "Templates of REST Data Source, REST Data Source Remote Servers and REST Source as Page/Region Source are examples only (NON-NEGOTIABLE)", "instruction_count": 1, "instruction_digest": "c6c900f530c2eb34db96d538db7e5d86635b62b82932abd1e09ab83ba55f0624"},
109
+ {"heading": "REST synchronization attributes in examples are placeholders (NON-NEGOTIABLE)", "instruction_count": 2, "instruction_digest": "a02ed81afe68658598d568821287229e84fbde0accfd0741b42176e15793b449"},
110
+ {"heading": "REST Data Source dataProfile requirements (NON-NEGOTIABLE)", "instruction_count": 1, "instruction_digest": "5d49718c198bfc1071459fe20828fc3246b9183b758349afa2f4a8eef3995112"},
111
+ {"heading": "REST Source page/region requirements (NON-NEGOTIABLE)", "instruction_count": 4, "instruction_digest": "0fc808ce62d154ff0ed8af5d5bb1c1885d9ad8f036f257604dc1cfe07520814d"},
112
+ {"heading": "REST Source process requirements (NON-NEGOTIABLE)", "instruction_count": 1, "instruction_digest": "9646fd2e69070a6577e517180a1714f6ac29888098a5f5803f4380671b2ea3d9"}
113
+ ]
114
+ },
115
+ {
116
+ "id": "declarative-navigation",
117
+ "rule_ids": ["BUTTON_BEHAVIOR_TARGET_CONTRACT_001", "INTERACTIVE_REPORT_COLUMN_COVERAGE_001"],
118
+ "profile_ids": ["buttons", "interactive-report", "classic-report"],
119
+ "enforcement_paths": ["runtime/internal/python/validate_apexlang.py", "references/policies/memory-bank/40-components/apex.buttons.md"],
120
+ "source_sections": [
121
+ {"heading": "Report Region Link Target Resolution Gate (Non-Negotiable)", "instruction_count": 6, "instruction_digest": "0c2a2687eb0b15b346e31d95871ac00be53d74af78f90836a38be892ee80d2f0"},
122
+ {"heading": "Button Same-App Target Resolution Gate (Non-Negotiable)", "instruction_count": 3, "instruction_digest": "1b9b640896aed7600348dff7ff18ea610b1e4e18978680cb42c67f33b76fb610"}
123
+ ]
124
+ },
125
+ {
126
+ "id": "business-logic-payloads",
127
+ "rule_ids": ["GRAMMAR_FIRST_AUTHORITY_REQUIRED_001", "DB_CONN_REQUIRED_001", "DB_OBJECT_EVIDENCE_REQUIRED_001", "PLSQL_INLINE_BLOCK_001", "SQL_INLINE_BLOCK_001"],
128
+ "profile_ids": ["dynamic-actions"],
129
+ "enforcement_paths": ["runtime/internal/python/validate_apexlang.py", "references/policies/memory-bank/20-data/apex.logic.md", "references/policies/memory-bank/20-data/apex.sql.md"],
130
+ "source_sections": [
131
+ {"heading": "Process Type Policy — invokeApi Preferred with Thin Wrapper Exception (Non‑Negotiable)", "instruction_count": 7, "instruction_digest": "d1553bc4b8a11a91eb7ee5abba90245687e596a8f7c702b1d90fed95efb14e6c"},
132
+ {"heading": "SQL/PLSQL Inline Size and DB Object Connection Gate — Non‑Negotiable", "instruction_count": 9, "instruction_digest": "4d535ffedb263094f7fa86813cafbb219208a2294eaf234dc0d9e7aa3bb8b2a3"},
133
+ {"heading": "Computation Type Guardrail — Non‑Negotiable", "instruction_count": 3, "instruction_digest": "0f3cfc6e36a16d05c6257dde8824f75ba8bae7344168c599f7be3c0810a9c840"},
134
+ {"heading": "APEX Artifact PL/SQL Call Safety — Non‑Negotiable", "instruction_count": 3, "instruction_digest": "1667606eac113c0fd22990c343b6178cbfb75f8e9ba828c051263a06cffe6a97"}
135
+ ]
136
+ }
137
+ ]
138
+ },
139
+ "core_rule_ids": [
140
+ "GRAMMAR_FIRST_AUTHORITY_REQUIRED_001",
141
+ "PROGRESSIVE_DISCLOSURE_TRACE_REQUIRED_001",
142
+ "DEFAULT_GUIDANCE_LAYER_REQUIRED_001",
143
+ "VALIDATOR_REPAIR_RECIPE_REQUIRED_001"
144
+ ],
145
+ "stop_conditions": [
146
+ "Stop with Missing Inputs when authoritative structure, database-object evidence, target mappings, or compiler-backed legality cannot be proven.",
147
+ "Stop when same-rank authoritative sources conflict.",
148
+ "Do not invent blocks, properties, enum values, template options, schema objects, targets, or identifiers."
149
+ ],
150
+ "required_validation": [
151
+ "Run compiler-truth audit before publish or live work.",
152
+ "Use problems.json plus projected validator repair recipes for deterministic revision.",
153
+ "Treat live APEX validation as authoritative when the workflow requires runtime completion."
154
+ ],
155
+ "profiles": [
156
+ {
157
+ "id": "buttons",
158
+ "keywords": ["button", "redirect button", "submit button", "button icon", "text with icon", "button action"],
159
+ "rule_ids": ["BUTTON_ICON_POSITION_DEFAULT_001", "BUTTON_BEHAVIOR_TARGET_CONTRACT_001", "TEMPLATE_OPTIONS_EMITTED_VALUES_001", "PAGE_ACTION_BREADCRUMB_REQUIRED_001"],
160
+ "directives": [
161
+ "Select the exact button behavior variant before drafting.",
162
+ "Use declarative targets for redirects and canonical Font APEX/template-option values."
163
+ ],
164
+ "guidance_paths": ["references/policies/memory-bank/40-components/apex.buttons.md"],
165
+ "template_projections": [
166
+ {
167
+ "path": "templates/buttons/buttons._common.md",
168
+ "sections": ["Generation Rules", "Conditional Rendering Rules"]
169
+ }
170
+ ],
171
+ "template_routes": [
172
+ {"keywords": ["redirect", "same app"], "path": "templates/buttons/buttons.redirect-this-app.md", "sections": ["Output Template", "Example"]},
173
+ {"keywords": ["submit"], "path": "templates/buttons/buttons.submit.md", "sections": ["Output Template", "Example"]},
174
+ {"keywords": ["icon", "text with icon"], "path": "templates/buttons/buttons.appearance-icon.md", "sections": ["Output Template", "Example", "Rules"]}
175
+ ]
176
+ },
177
+ {
178
+ "id": "icons",
179
+ "keywords": ["icon", "icons", "icon-only", "icon css class", "icon property", "image icon css classes", "appearance.icon", "font apex", "fa-", "checkmark", "glyph", "pictogram"],
180
+ "rule_ids": ["FA_ICON_REQUIRED_001"],
181
+ "directives": ["Load the pinned Font APEX index only when an icon is required, then select exactly one icon token, at most one optional fa base class, and unique optional catalog-listed modifiers."],
182
+ "guidance_paths": []
183
+ },
184
+ {
185
+ "id": "interactive-report",
186
+ "keywords": ["interactive report", "report page", "report columns", "report link"],
187
+ "rule_ids": ["INTERACTIVE_REPORT_COLUMN_COVERAGE_001", "IR_PROJECTED_COLUMNS_REQUIRED_001", "IR_CONTEXT_BIND_SUBMIT_REQUIRED_001", "IR_TEXT_SEARCH_CASE_NORMALIZATION_REQUIRED_001", "INTERACTIVE_REPORT_LINK_COLUMN_INVALID_001", "REPORT_ESCAPE_REQUIRED_001"],
188
+ "directives": [
189
+ "Project every source column into explicit Interactive Report column metadata.",
190
+ "Use declarative column links and submit every same-page bind used by the source."
191
+ ],
192
+ "guidance_paths": ["references/policies/memory-bank/30-pages/apex.interactive-report.md", "references/policies/memory-bank/20-data/apex.sql.md"],
193
+ "template_projections": [
194
+ {"path": "templates/region-components/interactive-report/interactive-report._common.md", "sections": ["Generation Rules", "Mandatory Rendering Rules", "Conditional Rendering Rules", "Guardrails"]}
195
+ ],
196
+ "template_routes": [
197
+ {"keywords": ["interactive report", "report page"], "path": "templates/region-components/interactive-report/interactive-report.standard.md", "sections": ["Output Template", "Example"]}
198
+ ]
199
+ },
200
+ {
201
+ "id": "classic-report",
202
+ "keywords": ["classic report", "report region", "report pagination"],
203
+ "rule_ids": ["CLASSIC_REPORT_DEFAULT_TEMPLATE_REQUIRED_001", "CLASSIC_REPORT_COMPONENT_APPEARANCE_REQUIRED_001", "CLASSIC_REPORT_HIDDEN_COLUMN_HEADING_FORBIDDEN_001", "REPORT_ESCAPE_REQUIRED_001"],
204
+ "directives": ["Keep Classic Report column, component appearance, pagination, and hidden-column rules separate from Interactive Report rules."],
205
+ "guidance_paths": ["references/policies/memory-bank/30-pages/apex.classic-report.md"],
206
+ "template_projections": [
207
+ {"path": "templates/region-components/classic-report/classic-report._common.md", "sections": ["Generation Rules", "Conditional Rendering Rules", "Guardrails"]}
208
+ ]
209
+ },
210
+ {
211
+ "id": "standalone-avatar",
212
+ "component_ids": ["standalone-avatar"],
213
+ "keywords": ["standalone avatar", "standalone avatar region", "avatar region", "avatar report", "avatar report region", "avatar template component", "theme template component avatar", "themetemplatecomponent avatar"],
214
+ "rule_ids": ["AVATAR_TYPE_PAYLOAD_REQUIRED_001", "AVATAR_INITIALS_COLUMN_REFERENCE_REQUIRED_001", "AVATAR_IMAGE_URL_COLUMN_REQUIRED_001", "AVATAR_IMAGE_URL_SAFETY_REQUIRED_001", "AVATAR_ICON_ALLOWLIST_REQUIRED_001", "AVATAR_ACCESSIBLE_DESCRIPTION_REQUIRED_001", "AVATAR_CSS_CLASSES_SAFE_REQUIRED_001", "AVATAR_COLUMN_IDENTIFIER_INVALID_001", "AVATAR_AUTHORIZATION_SCHEME_EVIDENCE_REQUIRED_001", "DB_OBJECT_EVIDENCE_REQUIRED_001"],
215
+ "directives": [
216
+ "Use the standalone themeTemplateComponent/avatar family rather than Classic Report or Interactive Report templates.",
217
+ "Select exactly one proven report scenario: initials, Font APEX icon, or URL-column image.",
218
+ "For initials, emit settings.initials as the direct uppercase source-column identifier without ampersand substitution syntax; free-text description may use `&COLUMN_NAME.`.",
219
+ "Declare every projection as a named template-component column using an uppercase snake_case external identifier plus source.databaseColumn and source.dataType; do not emit lowercase or hyphenated identifiers, columnName, or show properties.",
220
+ "Require a verified human-readable description for meaningful Avatars and record dynamic-source provenance as schema_doc, live_db, or user_asserted; decorative templates omit both description property and column.",
221
+ "For URL-column images, use canonical :APP_FILES or :APEX_FILES SQL bind concatenation with a static relative path; reject template/substitution tokens, AUTHENTICATED_URL_PREFIX, BLOB endpoints, traversal, raw, external, protocol-relative, javascript:, and data: sources.",
222
+ "Validate Avatar icon literals and source mappings against the canonical build-pinned Font APEX index; require exactly one icon and only optional catalog-listed modifiers.",
223
+ "Keep Avatar cssClasses static and component-scoped, require a comments rationale, and require explicit-request evidence for framework utilities.",
224
+ "When access is restricted, use mustNotBePublicUser or an @alias resolving to a declared shared authorization scheme in the validation set; never invent authorization names.",
225
+ "Do not apply an action template because the Avatar theme export declares actionTemplates: [].",
226
+ "Do not infer BLOB images, grouping, link actions, or partial mode until their standalone contracts are proven."
227
+ ],
228
+ "guidance_paths": ["references/policies/memory-bank/10-global/apex.global.md", "references/policies/memory-bank/40-components/apex.templates.md", "references/policies/memory-bank/40-components/apex.region-data-source.md"],
229
+ "template_projections": [
230
+ {"path": "templates/template-components/avatar/avatar._common.md", "sections": ["Generation Rules", "Variable Contract", "Conditional Rendering Rules", "Validation Checklist"]}
231
+ ],
232
+ "template_routes": [
233
+ {"keywords": ["initials", "initials avatar"], "path": "templates/template-components/avatar/avatar.report-initials.md", "sections": ["Output Template", "Conditional Rendering Rules", "Validation Checklist"]},
234
+ {"keywords": ["icon", "icon avatar", "font apex icon"], "path": "templates/template-components/avatar/avatar.report-icon.md", "sections": ["Output Template", "Conditional Rendering Rules", "Validation Checklist"]},
235
+ {"keywords": ["image", "image avatar", "url column", "url-column image"], "path": "templates/template-components/avatar/avatar.report-image-url-column.md", "sections": ["Output Template", "Conditional Rendering Rules", "Validation Checklist"]}
236
+ ]
237
+ },
238
+ {
239
+ "id": "media-list",
240
+ "component_ids": ["media-list"],
241
+ "keywords": ["media list", "media list template component", "media list region", "standalone media list", "theme template component media list", "themetemplatecomponent medialist"],
242
+ "rule_ids": ["MEDIA_LIST_TEMPLATE_COMPONENT_CONTRACT_REQUIRED_001", "MEDIA_LIST_SOURCE_CAPABILITY_REQUIRED_001", "MEDIA_LIST_PARENT_REGION_REQUIRED_001", "MEDIA_LIST_PARENT_SLOT_UNSUPPORTED_001", "MEDIA_LIST_GRAMMAR_COMPILER_CONFORMANCE_REQUIRED_001", "DB_OBJECT_EVIDENCE_REQUIRED_001"],
243
+ "directives": [
244
+ "Use themeTemplateComponent/mediaList in partial or report mode and select the narrowest Media List scenario that covers the request.",
245
+ "For report mode, resolve region.column under themeTemplateComponent/mediaList from the active target-build grammar contract and emit exactly that named or unnamed column variant for every projection.",
246
+ "Require a verified source, deterministic top-level orderBy, and complete source projection coverage in report mode; keep partial mode free of report-only structures.",
247
+ "Synchronize Avatar and Badge display toggles with their plugin blocks and apply their shared accessibility, icon, URL, datatype, and semantic-state rules.",
248
+ "Use native responsive layout values and at most one sequenced link action with a structured same-app target; reject triggerAction until an owning dynamic action can be proven; emit grouping or nested optional properties only when the active target-build component contract exposes them.",
249
+ "Reject custom structural HTML/CSS, arbitrary URLs, custom link attributes, and fabricated empty rows.",
250
+ "Route only the supported source adapter localDatabase/sqlQuery for report mode; return Missing Inputs for REST, JSON, property graph, function-body, and sample-data adapters until an explicit adapter exists.",
251
+ "For nested regions, resolve the existing parent's exact template and allowed slot from the target catalog; use regionBody by default and never create a parent implicitly.",
252
+ "Use Content Row guidance only as a semantic comparison for compact repeated media rows; it must not override an explicit Media List owner."
253
+ ],
254
+ "guidance_paths": ["references/policies/memory-bank/10-global/apex.global.md", "references/policies/memory-bank/20-data/apex.sql.md", "references/policies/memory-bank/40-components/apex.templates.md", "references/policies/memory-bank/40-components/apex.region-contracts.md", "references/policies/memory-bank/40-components/apex.region-data-source.md", "references/policies/memory-bank/40-components/apex.region-interactions.md", "templates/template-components/content-row/content-row._common.md"],
255
+ "template_projections": [
256
+ {"path": "templates/template-components/media-list/media-list._common.md", "sections": ["Generation Rules", "Variable Contract", "Conditional Rendering Rules", "Responsive and Accessibility Contract", "Validation Checklist"]}
257
+ ],
258
+ "template_routes": [
259
+ {"keywords": ["partial", "single item"], "path": "templates/template-components/media-list/media-list.partial.md", "sections": ["Output Template", "Conditional Rendering Rules", "Validation Checklist"]},
260
+ {"keywords": ["avatar", "badge", "initials", "user initials", "profile picture", "profile pictures", "profile image", "status indicator", "status indicators", "status value"], "featureSignals": ["avatar", "image", "badge"], "path": "templates/template-components/media-list/media-list.report-avatar-badge.md", "sections": ["Output Template", "Avatar Variants", "Badge Variants", "Conditional Rendering Rules", "Validation Checklist"]},
261
+ {"keywords": ["link", "navigation", "action"], "featureSignals": ["link"], "path": "templates/template-components/media-list/media-list.report-link.md", "sections": ["Output Template", "Interaction Contract", "Conditional Rendering Rules", "Validation Checklist"]},
262
+ {"keywords": ["group", "grouping", "grouped"], "featureSignals": ["grouping"], "path": "templates/template-components/media-list/media-list.report-grouped.md", "sections": ["Capability Gate", "Output Template", "Conditional Rendering Rules", "Validation Checklist"]},
263
+ {"keywords": ["layout", "responsive", "grid", "horizontal"], "featureSignals": ["layout"], "path": "templates/template-components/media-list/media-list.report-layouts.md", "sections": ["Output Template", "Responsive Selection Matrix", "Conditional Rendering Rules", "Validation Checklist"]}
264
+ ],
265
+ "routing": {
266
+ "owner": "media-list",
267
+ "selectorGroups": {"direct": ["themeTemplateComponent/mediaList", "Media List template component"], "list-region": ["list region", "list-region", "shared list", "list template"], "classic-report": ["classic report", "classic report region", "report template"]},
268
+ "precedence": ["direct", "list-region", "classic-report"], "selectorWeights": {"direct": 2, "classic-report": 1, "list-region": 0.5}, "competingOrder": ["cards", "content-row", "timeline", "classic-report", "interactive-report"], "suppressedCandidates": {"media-list": ["list-region"], "list-region": ["media-list"], "classic-report": ["list-region", "media-list"]},
269
+ "aliases": ["media list", "media-list", "themeTemplateComponent/mediaList", "Media List template component"],
270
+ "semanticFallback": {"requiredSignalGroups": ["collection", "compact", "media"], "requireRowEvidence": true},
271
+ "mode": {"default": "report", "partialSignals": ["partial", "single item", "one item", "current item", "individual item"]},
272
+ "signalGroups": {
273
+ "collection": ["list", "feed", "directory", "rows", "items", "entries", "records", "results"],
274
+ "compact": ["compact", "scannable", "recent", "activity", "people"],
275
+ "media": ["image", "images", "thumbnail", "thumbnails", "avatar", "avatars", "profile picture", "profile pictures", "icon", "icons", "badge", "badges", "status", "statuses", "status indicator", "status indicators"]
276
+ },
277
+ "rowEvidence": ["list", "feed", "directory", "row", "rows", "item", "items", "entry", "entries", "record", "records", "result", "results"],
278
+ "competingSignals": {
279
+ "cards": ["card", "cards", "cards region"],
280
+ "content-row": ["content row", "content rows", "content-row"],
281
+ "timeline": ["timeline", "activity timeline", "event timeline"],
282
+ "classic-report": ["classic report", "classic report region", "report template"],
283
+ "interactive-report": ["interactive report", "interactive report region", "interactive data table"],
284
+ "list-region": ["list region", "list-region", "shared list", "list template", "@/media-list"]
285
+ },
286
+ "featureSignals": {
287
+ "avatar": ["avatar", "avatars", "profile picture", "profile pictures", "profile image", "profile images", "initials"],
288
+ "badge": ["badge", "badges", "status", "statuses", "status value", "status indicator", "status indicators"],
289
+ "image": ["image", "images", "thumbnail", "thumbnails", "icon", "icons"],
290
+ "link": ["link", "links", "navigation", "navigate", "action", "actions"],
291
+ "layout": ["layout", "responsive", "grid", "horizontal", "two column", "three column"],
292
+ "grouping": ["group", "groups", "grouping", "grouped"]
293
+ },
294
+ "sourceAdapters": {"partial": ["sessionState"], "report": ["localDatabase/sqlQuery"]},
295
+ "unsupportedFeatures": ["grouping"],
296
+ "placement": {
297
+ "topLevel": {"slot": "body"},
298
+ "nested": {"requiresParentRegion": true, "defaultSlot": "regionBody", "parentTemplates": {"@/standard": ["regionBody", "subRegions"], "@/content-block": ["regionBody", "subRegions"]}}
299
+ },
300
+ "semanticSupport": ["references/policies/memory-bank/40-components/apex.region-contracts.md", "templates/template-components/content-row/content-row._common.md"]
301
+ }
302
+ },
303
+ {
304
+ "id": "dashboard",
305
+ "keywords": ["dashboard", "kpi", "metric card", "metric cards", "metric card region", "metric card template component", "scorecard"],
306
+ "rule_ids": ["DASHBOARD_KPI_METRIC_CARD_REQUIRED_001", "DASHBOARD_LAYOUT_ROW_PLAN_REQUIRED_001", "METRIC_CARD_REGION_NORMALIZATION_REQUIRED_001", "METRIC_CARD_STANDARD_TEMPLATE_FORBIDDEN_001", "METRIC_CARD_REPORT_CONTRACT_REQUIRED_001"],
307
+ "directives": ["Use one normalized Metric Card region for KPI strips and freeze the dashboard row plan before rendering.", "Require settings.metric, complete source-column coverage, compiler-backed attribute values, mode-correct report-only properties, valid conditional attributes, and link-only Metric Card actions."],
308
+ "guidance_paths": ["references/policies/memory-bank/30-pages/apex.dashboard.md", "references/policies/memory-bank/30-pages/apex.layout.md"],
309
+ "template_projections": [
310
+ {"path": "templates/template-components/metric-card/metric-card._common.md", "sections": ["Generation Rules", "Metric Card Column Data Types", "Guardrails"]}
311
+ ]
312
+ },
313
+ {
314
+ "id": "form",
315
+ "keywords": ["form", "modal form", "drawer form", "edit page", "create page"],
316
+ "rule_ids": ["FORM_DRAWER_DEFAULT_END_REQUIRED_001", "FORM_PRIMARY_KEY_REQUIRED_001", "APP_UX_FORM_CONTEXT_REQUIRED_001", "APP_UX_FORM_DEFAULT_REQUIRED_001", "APP_UX_FORM_VALIDATION_REQUIRED_001"],
317
+ "directives": ["Prove primary-key, source, defaulting, validation, and launcher mappings before drafting the form."],
318
+ "guidance_paths": ["references/policies/memory-bank/30-pages/apex.form.md"],
319
+ "template_projections": [
320
+ {"path": "templates/region-components/form/form._common.md", "sections": ["Generation Rules", "Conditional Rendering Rules", "Guardrails"]}
321
+ ]
322
+ },
323
+ {
324
+ "id": "faceted-search",
325
+ "keywords": ["faceted search", "facet", "filter facets"],
326
+ "rule_ids": ["FACETED_SEARCH_DEFAULT_SETTINGS_REQUIRED_001", "FACET_SOURCE_DATA_TYPE_REQUIRED_001", "FACET_LIST_ENTRIES_LIMIT_REQUIRED_001", "FACET_VALUE_FILTER_INITIAL_REQUIRED_001", "FACET_ENTITY_ID_DISPLAY_REQUIRED_001"],
327
+ "directives": ["Select facet types from column semantics, keep date/number data types runtime-safe, and bound high-cardinality lists."],
328
+ "guidance_paths": ["references/policies/memory-bank/30-pages/apex.faceted-search.md"],
329
+ "template_projections": [
330
+ {"path": "templates/region-components/faceted-search/faceted-search._common.md", "sections": ["Generation Rules", "Conditional Rendering Rules", "Guardrails"]}
331
+ ]
332
+ },
333
+ {
334
+ "id": "smart-filter-search",
335
+ "keywords": ["smart filter", "smart filters", "smart filter search", "smart filters region", "searchable attributes"],
336
+ "rule_ids": ["STRUCTURED_PATTERN_PACK_REQUIRED_001", "COMPILER_TRUTH_EVIDENCE_REQUIRED_001", "DEFAULT_GUIDANCE_LAYER_REQUIRED_001"],
337
+ "directives": [
338
+ "Bind exactly one Smart Filters region to exactly one secured base results region through its explicit static id.",
339
+ "Freeze the searchable-attribute allowlist, match semantics, length bounds, and tokenization policy before generation.",
340
+ "Keep suggestions, refinements, authorization, and server-side conditions within the base region's effective security scope.",
341
+ "Require index strategy, statistics status, and expected-cardinality evidence before declaring performance readiness.",
342
+ "Treat the ticket UI values as compiler-gated requirements and never emit unsupported Smart Filters settings."
343
+ ],
344
+ "guidance_paths": ["references/policies/memory-bank/30-pages/apex.smart-filter-search.md"],
345
+ "template_projections": [
346
+ {"path": "templates/region-components/smart-filter-search/smart-filter-search._common.md", "sections": ["Generation Rules", "Guardrails"]}
347
+ ]
348
+ },
349
+ {
350
+ "id": "dynamic-actions",
351
+ "keywords": ["dynamic action", "set value", "execute javascript", "dialog closed", "refresh action"],
352
+ "rule_ids": ["MODAL_REPORT_REFRESH_REQUIRED_001", "MASTER_DETAIL_DYNAMIC_ACTION_REQUIRED_001"],
353
+ "directives": [
354
+ "Select event, selection type, action capability, affected elements, and fire-on-initialization behavior explicitly.",
355
+ "Use the compiler-supported action vocabulary and settings payload for the selected action."
356
+ ],
357
+ "guidance_paths": ["references/policies/memory-bank/20-data/apex.logic.md", "references/domains/business-logic/dynamic-actions/workflow-dynamic-actions-batch.md"],
358
+ "template_projections": [
359
+ {"path": "templates/business-logic/dynamic-actions/dynamic-actions._common.md", "sections": ["Generation Rules", "Approved when.event Values", "Action Capability Matrix", "Conditional Rendering Rules", "Validation Checklist"]}
360
+ ]
361
+ },
362
+ {
363
+ "id": "cards",
364
+ "keywords": ["cards", "cards region", "visual summary", "people cards", "product cards", "status tiles", "card navigation", "card media", "clickable cards", "responsive cards"],
365
+ "rule_ids": ["TEMPLATE_OPTIONS_EMITTED_VALUES_001", "CARDS_VISUAL_SUMMARY_PATTERN_REQUIRED_001", "CARDS_SOURCE_MAPPING_REQUIRED_001", "CARDS_INTERACTION_BOUNDARY_REQUIRED_001", "CARDS_SECURITY_REQUIRED_001", "CARDS_CONDITIONAL_STYLE_ALLOWLIST_REQUIRED_001"],
366
+ "directives": [
367
+ "Select standard SQL versus REST Data Source, then freeze the source-to-attribute mapping before rendering.",
368
+ "Prefer native title, subtitle, body, media, icon, badge, and action mappings; use only compiler-proven allowlisted conditional style properties.",
369
+ "Default to the Universal Theme automatic responsive layout and add a targeted Cards refresh only when its trigger is known.",
370
+ "Apply authenticated page access, evidenced authorization schemes, escaped advanced HTML, safe URL targets, and shared REST Web Credentials with exact URL restrictions.",
371
+ "Do not add Faceted Search, Smart Filters, search fields, facets, or filter orchestration under the visual-summary Cards pattern."
372
+ ],
373
+ "guidance_paths": ["references/policies/memory-bank/30-pages/apex.cards-page.md", "references/policies/memory-bank/40-components/apex.templates.md", "references/policies/memory-bank/40-components/apex.region-data-source.md", "references/policies/memory-bank/40-components/apex.region-interactions.md"],
374
+ "template_projections": [
375
+ {"path": "templates/region-components/cards/cards._common.md", "sections": ["Generation Rules", "Media Source Shapes", "Row Navigation Action Shape", "Conditional Rendering Rules", "Guardrails"]}
376
+ ],
377
+ "template_routes": [
378
+ {"keywords": ["rest", "rest source"], "path": "templates/region-components/cards/cards.rest-source.md", "sections": ["Output Template", "Example"]},
379
+ {"keywords": ["cards", "cards region"], "path": "templates/region-components/cards/cards.standard.md", "sections": ["Output Template", "Example"]}
380
+ ]
381
+ },
382
+ {
383
+ "id": "map",
384
+ "keywords": ["map", "map layer", "markers", "bounding box"],
385
+ "rule_ids": ["MAP_INITIAL_VIEWPORT_BOUNDS_REQUIRED_001", "MAP_LAYER_CONTEXT_BIND_REQUIRED_001", "MAP_LAYER_CONTEXT_BIND_SUBMIT_REQUIRED_001"],
386
+ "directives": ["Use schema-proven coordinates, fit multi-marker views to bounds, and use normal bind variables for context-dependent layers."],
387
+ "guidance_paths": ["references/policies/memory-bank/30-pages/apex.map-page.md"],
388
+ "template_projections": [
389
+ {"path": "templates/region-components/map/map._common.md", "sections": ["Generation Rules", "Conditional Rendering Rules", "Guardrails"]}
390
+ ]
391
+ },
392
+ {
393
+ "id": "full-app",
394
+ "keywords": ["create app", "generate app", "complete app", "functional requirements", "multi page application"],
395
+ "rule_ids": ["APPLICATION_SPEC_REQUIRED_001", "COMPONENT_REGISTRY_ROUTING_REQUIRED_001", "ISOLATED_UNIT_CONTEXT_REQUIRED_001", "STAGED_APPLICATION_VALIDATION_REQUIRED_001", "STRUCTURED_PATTERN_PACK_REQUIRED_001", "SECURITY_BASELINE_REQUIRED_001", "APP_UX_CONTRACT_REQUIRED_001", "APP_UX_TRACEABILITY_REQUIRED_001"],
396
+ "directives": ["Freeze application spec, UX contract, page inventory, composition plan, and behavior plan before APEXlang rendering.", "Resolve a fresh task-specific context capsule for each implementation unit."],
397
+ "guidance_paths": ["references/workflows/apexlang/workflow-create-app-from-fr-and-model.md", "references/workflows/apexlang/application-spec.template.md"]
398
+ },
399
+ {
400
+ "id": "rest-data-source",
401
+ "keywords": ["rest data source", "rest source", "remote server", "data profile", "web source"],
402
+ "rule_ids": ["DB_OBJECT_EVIDENCE_REQUIRED_001"],
403
+ "directives": [
404
+ "Resolve the real REST source alias and remote-server origin; never guess either value.",
405
+ "Validate operations, parameters, and the complete data profile from an authoritative response or specification before generating consumers."
406
+ ],
407
+ "guidance_paths": ["references/policies/memory-bank/00-guard/ai.guard.md", "references/policies/memory-bank/40-components/apex.region-data-source.md"],
408
+ "template_projections": [
409
+ {"path": "templates/shared-components/rest-data-sources/example_rest_data_source.example.md", "sections": ["Generation Rules", "Variable Contract", "Output Template", "Guardrails"]}
410
+ ]
411
+ },
412
+ {
413
+ "id": "translation",
414
+ "keywords": ["translation", "translate", "localization", "localise", "multilingual", "messages apx", "app_text$"],
415
+ "rule_ids": [],
416
+ "directives": ["Generate shared text messages and rewire consuming attributes to APP_TEXT substitutions; never replace component attributes with direct translated literals."],
417
+ "guidance_paths": ["references/domains/shared-components/workflow-translations.md", "assets/domains/shared-components/translations/languages.json"]
418
+ }
419
+ ],
420
+ "rules": [
421
+ {
422
+ "rule_id": "AVATAR_AUTHORIZATION_SCHEME_EVIDENCE_REQUIRED_001",
423
+ "owner": "templates/template-components/avatar/avatar._common.md",
424
+ "applies_to": ["standalone avatar authorization", "restricted avatar region", "avatar AuthZ"],
425
+ "summary": "Restricted standalone Avatar regions use mustNotBePublicUser or an @alias resolving to a declared shared authorization scheme and never substitute visual hiding for access control.",
426
+ "phases": ["planning", "generation", "validation", "repair"],
427
+ "profile_ids": ["standalone-avatar"],
428
+ "component_ids": ["standalone-avatar"],
429
+ "stop_behavior": "Stop with Missing Inputs when restricted access is required but the exact shared authorization scheme cannot be resolved.",
430
+ "required_load_when": ["restricted standalone avatar", "avatar authorization", "avatar security"],
431
+ "enforced_by": ["references/workflows/apex-generation/agents/30-agent-critique.md"],
432
+ "details_doc": "templates/template-components/avatar/avatar._common.md",
433
+ "examples_doc": "templates/template-components/avatar/README.md"
434
+ },
435
+ {
436
+ "rule_id": "AVATAR_COLUMN_IDENTIFIER_INVALID_001",
437
+ "owner": "templates/template-components/avatar/avatar._common.md",
438
+ "applies_to": ["standalone avatar columns", "avatar child column identifiers"],
439
+ "summary": "Standalone Avatar child columns use uppercase snake_case external identifiers and preserve explicit source.databaseColumn mappings.",
440
+ "phases": ["generation", "validation", "repair"],
441
+ "profile_ids": ["standalone-avatar"],
442
+ "component_ids": ["standalone-avatar"],
443
+ "stop_behavior": "Reject lowercase or hyphenated Avatar child-column identifiers that the live compiler cannot accept.",
444
+ "required_load_when": ["standalone avatar generation", "avatar column validation"],
445
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py"],
446
+ "details_doc": "templates/template-components/avatar/avatar._common.md",
447
+ "examples_doc": "templates/template-components/avatar/README.md"
448
+ },
449
+ {
450
+ "rule_id": "AVATAR_INITIALS_COLUMN_REFERENCE_REQUIRED_001",
451
+ "owner": "templates/template-components/avatar/avatar.report-initials.md",
452
+ "applies_to": ["standalone avatar initials", "avatar initials column reference"],
453
+ "summary": "Standalone Avatar initials use a direct uppercase source-column identifier that resolves to a declared varchar2 Avatar child column, without substitution syntax.",
454
+ "phases": ["generation", "validation", "repair"],
455
+ "profile_ids": ["standalone-avatar"],
456
+ "component_ids": ["standalone-avatar"],
457
+ "stop_behavior": "Reject substitution syntax, undeclared initials columns, and non-varchar2 initials mappings.",
458
+ "required_load_when": ["standalone avatar initials generation", "avatar initials validation"],
459
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py"],
460
+ "details_doc": "templates/template-components/avatar/avatar.report-initials.md",
461
+ "examples_doc": "templates/template-components/avatar/avatar.report-initials.md"
462
+ },
463
+ {
464
+ "rule_id": "AVATAR_TYPE_PAYLOAD_REQUIRED_001",
465
+ "owner": "templates/template-components/avatar/avatar._common.md",
466
+ "applies_to": ["standalone avatar", "avatar report region", "theme template component avatar"],
467
+ "summary": "Standalone Avatar settings select exactly one initials, icon, or image type and emit only that type's required payload.",
468
+ "phases": ["generation", "validation", "repair"],
469
+ "profile_ids": ["standalone-avatar"],
470
+ "component_ids": ["standalone-avatar"],
471
+ "stop_behavior": "Reject missing, mixed, or inactive Avatar payload properties.",
472
+ "required_load_when": ["standalone avatar generation", "avatar validation"],
473
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py"],
474
+ "details_doc": "templates/template-components/avatar/avatar._common.md",
475
+ "examples_doc": "templates/template-components/avatar/avatar.report-initials.md"
476
+ },
477
+ {
478
+ "rule_id": "AVATAR_IMAGE_URL_COLUMN_REQUIRED_001",
479
+ "owner": "templates/template-components/avatar/avatar.report-image-url-column.md",
480
+ "applies_to": ["standalone avatar image", "Timeline nested avatar image", "Timeline avatar image", "Comments nested avatar image", "Comments avatar image", "avatar URL column image"],
481
+ "summary": "Standalone, Timeline-nested, and Comments-nested Avatar images use an image object with type urlColumn and a projected urlColumn value.",
482
+ "phases": ["generation", "validation", "repair"],
483
+ "profile_ids": ["standalone-avatar"],
484
+ "component_ids": ["standalone-avatar", "timeline", "comments"],
485
+ "stop_behavior": "Reject unproven BLOB or alternate standalone Avatar image structures.",
486
+ "required_load_when": ["standalone avatar image generation", "Timeline avatar image generation", "Comments avatar image generation", "Comments profile image", "Comments profile picture", "avatar image validation"],
487
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py"],
488
+ "details_doc": "templates/template-components/avatar/avatar.report-image-url-column.md",
489
+ "examples_doc": "templates/template-components/avatar/avatar.report-image-url-column.md"
490
+ },
491
+ {
492
+ "rule_id": "AVATAR_IMAGE_URL_SAFETY_REQUIRED_001",
493
+ "owner": "templates/template-components/avatar/avatar.report-image-url-column.md",
494
+ "applies_to": ["standalone avatar image URL", "Timeline nested avatar image URL", "Timeline avatar image", "Comments nested avatar image URL", "Comments avatar image", "avatar URL-column security", "avatar external image URL"],
495
+ "summary": "Avatar URL-column images use canonical :APP_FILES or :APEX_FILES SQL bind concatenation with a static relative path, never arbitrary rendered URL values.",
496
+ "phases": ["planning", "generation", "validation", "repair"],
497
+ "profile_ids": ["standalone-avatar"],
498
+ "component_ids": ["standalone-avatar", "timeline", "comments"],
499
+ "stop_behavior": "Reject template/substitution tokens, AUTHENTICATED_URL_PREFIX, BLOB endpoints, traversal, raw URL columns, javascript:, data:, protocol-relative URLs, and absolute external URLs.",
500
+ "required_load_when": ["standalone avatar image generation", "Timeline avatar image generation", "Comments avatar image generation", "Comments profile image", "Comments profile picture", "avatar image URL security", "avatar image validation"],
501
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py"],
502
+ "details_doc": "templates/template-components/avatar/avatar.report-image-url-column.md",
503
+ "examples_doc": "templates/template-components/avatar/avatar.report-image-url-column.md"
504
+ },
505
+ {
506
+ "rule_id": "COMMENTS_NESTED_BADGE_UNSUPPORTED_001",
507
+ "owner": "references/domains/template-components/comments.md",
508
+ "applies_to": ["Comments badge on each comment", "badge inside Comments", "badge within Comments", "nested Comments badge", "badge to every comment", "badge per comment", "badge with each comment", "badge beside every comment"],
509
+ "summary": "Comments does not expose a compiler-supported nested plugin-badge contract; standalone Badge guidance must not be applied to individual Comments rows.",
510
+ "phases": ["planning", "generation", "validation", "repair"],
511
+ "component_ids": ["comments"],
512
+ "stop_behavior": "Do not emit plugin-badge inside Comments; use plain trusted attributes text, a separate standalone Badge region, or a component family with compiler-supported nested Badge semantics.",
513
+ "required_load_when": ["Comments badge on each comment", "badge inside Comments", "badge within Comments", "nested Comments badge", "badge to every comment", "badge per comment", "badge with each comment", "badge beside every comment"],
514
+ "enforced_by": ["assets/component-attributes.json"],
515
+ "details_doc": "references/domains/template-components/comments.md",
516
+ "examples_doc": "templates/template-components/comments/comments._common.md"
517
+ },
518
+ {
519
+ "rule_id": "COMMENTS_GROUPING_UNSUPPORTED_001",
520
+ "owner": "references/domains/template-components/comments.md",
521
+ "applies_to": ["Comments grouping", "grouped Comments", "comment grouping", "grouped comments"],
522
+ "summary": "Comments grouping metadata is present in the theme inventory but has no valid generated APEXlang application-source shape in the pinned compiler.",
523
+ "phases": ["planning", "generation", "validation", "repair"],
524
+ "component_ids": ["comments"],
525
+ "stop_behavior": "Do not emit plugin-grouping; use an ungrouped Comments region or a separately proven region composition.",
526
+ "required_load_when": ["Comments grouping", "grouped Comments", "comment grouping", "grouped comments"],
527
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py"],
528
+ "details_doc": "references/domains/template-components/comments.md",
529
+ "examples_doc": "templates/template-components/comments/comments._common.md"
530
+ },
531
+ {
532
+ "rule_id": "AVATAR_ICON_ALLOWLIST_REQUIRED_001",
533
+ "owner": "templates/template-components/avatar/avatar.report-icon.md",
534
+ "applies_to": ["standalone avatar icon", "Font APEX avatar icon", "avatar icon source mapping"],
535
+ "summary": "Avatar icon values resolve to exactly one icon and only optional modifiers from the canonical build-pinned Font APEX index, including every output of a column-backed CASE mapping.",
536
+ "phases": ["planning", "generation", "validation", "repair"],
537
+ "profile_ids": ["standalone-avatar"],
538
+ "component_ids": ["standalone-avatar"],
539
+ "stop_behavior": "Reject unknown icons or modifiers, multiple-icon payloads, arbitrary classes, raw icon columns, and unverified dynamic icon expressions.",
540
+ "required_load_when": ["standalone avatar icon generation", "Font APEX avatar icon", "avatar icon validation"],
541
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py"],
542
+ "details_doc": "templates/template-components/avatar/avatar.report-icon.md",
543
+ "examples_doc": "templates/template-components/avatar/avatar.report-icon.md"
544
+ },
545
+ {
546
+ "rule_id": "AVATAR_ACCESSIBLE_DESCRIPTION_REQUIRED_001",
547
+ "owner": "templates/template-components/avatar/avatar._common.md",
548
+ "applies_to": ["standalone avatar accessibility", "avatar description", "decorative avatar"],
549
+ "summary": "Meaningful Avatars have a verified human-readable description with provenance for dynamic sources; decorative regions omit both the description setting and child column.",
550
+ "phases": ["planning", "generation", "validation", "repair"],
551
+ "profile_ids": ["standalone-avatar"],
552
+ "component_ids": ["standalone-avatar"],
553
+ "stop_behavior": "Reject missing, undeclared, non-varchar2, or unverified dynamic descriptions unless the exact decorative-purpose marker is present; reject contradictory decorative-plus-description declarations.",
554
+ "required_load_when": ["standalone avatar generation", "avatar accessibility", "decorative avatar"],
555
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py"],
556
+ "details_doc": "templates/template-components/avatar/avatar._common.md",
557
+ "examples_doc": "templates/template-components/avatar/README.md"
558
+ },
559
+ {
560
+ "rule_id": "AVATAR_CSS_CLASSES_SAFE_REQUIRED_001",
561
+ "owner": "templates/template-components/avatar/avatar._common.md",
562
+ "applies_to": ["standalone avatar CSS classes", "avatar custom CSS", "avatar framework utility class"],
563
+ "summary": "Avatar cssClasses are static, component-scoped, documented, and cannot silently introduce dynamic or visibility-changing behavior.",
564
+ "phases": ["planning", "generation", "validation", "repair"],
565
+ "profile_ids": ["standalone-avatar"],
566
+ "component_ids": ["standalone-avatar"],
567
+ "stop_behavior": "Reject substitutions, invalid or unscoped custom classes, visibility-changing classes, undocumented CSS, and framework utilities lacking explicit-request evidence.",
568
+ "required_load_when": ["avatar cssClasses", "avatar custom CSS", "standalone avatar styling"],
569
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py"],
570
+ "details_doc": "templates/template-components/avatar/avatar._common.md",
571
+ "examples_doc": "templates/template-components/avatar/README.md"
572
+ },
573
+ {
574
+ "rule_id": "GRAMMAR_FIRST_AUTHORITY_REQUIRED_001",
575
+ "owner": "references/policies/memory-bank/00-guard/ai.guard.md",
576
+ "applies_to": ["apexlang syntax", "dsl shape", "template inference", "property legality"],
577
+ "summary": "APEXlang syntax comes from the EBNF grammar and semantic property legality comes from compiler metadata before templates are used as exact examples.",
578
+ "phases": ["planning", "generation", "validation", "repair"],
579
+ "profile_ids": [],
580
+ "stop_behavior": "Stop with Missing Inputs when compiler-backed legality cannot be resolved or when authoritative syntax sources conflict.",
581
+ "required_load_when": ["apexlang generation", "dsl syntax", "property lookup", "template conflict", "compiler truth"],
582
+ "enforced_by": ["references/workflows/apex-generation/agents/30-agent-critique.md", "runtime/internal/python/validate_apexlang.py"],
583
+ "details_doc": "references/workflows/apexlang/prompt-contracts.md",
584
+ "examples_doc": "assets/grammar/apexlang.ebnf"
585
+ },
586
+ {
587
+ "rule_id": "PROGRESSIVE_DISCLOSURE_TRACE_REQUIRED_001",
588
+ "owner": "references/workflows/apexlang/prompt-contracts.md",
589
+ "applies_to": ["routing", "source trace", "progressive disclosure", "generation plan"],
590
+ "summary": "Non-trivial APEXlang work records the smallest source path from intent to rule/contract, grammar/compiler evidence, and exact template only when needed.",
591
+ "phases": ["intent_normalization", "planning", "generation", "validation", "repair"],
592
+ "profile_ids": [],
593
+ "stop_behavior": "Stop rather than widening context when the smallest authoritative route cannot support a required high-impact decision.",
594
+ "required_load_when": ["non-trivial generation", "multi-file generation", "page pattern selection", "agent critique"],
595
+ "enforced_by": ["references/workflows/apex-generation/agents/20-agent-draft.md", "references/workflows/apex-generation/agents/30-agent-critique.md"],
596
+ "details_doc": "references/workflows/apexlang/prompt-contracts.md",
597
+ "examples_doc": "references/workflows/apex-generation/nlu/nlu-routing-test-matrix.md"
598
+ },
599
+ {
600
+ "rule_id": "PROMPT_NORMALIZATION_REQUIRED_001",
601
+ "owner": "references/policies/governance/00-governance.md",
602
+ "summary": "Accept free-form requests, normalize explicit intent first, and use at most one simple clarification round for critical blockers.",
603
+ "phases": ["intent_normalization"],
604
+ "profile_ids": [],
605
+ "stop_behavior": "Stop with Missing Inputs when critical ambiguity remains after one clarification round.",
606
+ "enforced_by": ["SKILL.md"],
607
+ "details_doc": "references/policies/memory-bank/00-guard/ai.guard.md"
608
+ },
609
+ {
610
+ "rule_id": "TOOLING_REWRITE_ALIAS_LITERAL_REQUIRED_001",
611
+ "owner": "references/policies/governance/00-governance.md",
612
+ "summary": "Treat APEXlang @aliases as literal values during rewrites and avoid unescaped Perl interpolation.",
613
+ "phases": ["generation", "repair"],
614
+ "profile_ids": [],
615
+ "stop_behavior": "Stop an unsafe rewrite before it can erase or interpolate an @alias value.",
616
+ "enforced_by": ["references/policies/governance/00-governance.md"],
617
+ "details_doc": "references/policies/memory-bank/00-guard/ai.guard.md"
618
+ },
619
+ {
620
+ "rule_id": "ORACLE_DB_SKILLS_DELEGATION_REQUIRED_001",
621
+ "owner": "references/policies/memory-bank/00-guard/ai.guard.md",
622
+ "summary": "Keep APEXlang ownership limited to APEX artifact integration and delegate generic Oracle Database, PL/SQL, SQLcl, and utPLSQL guidance to Oracle DB skills.",
623
+ "phases": ["intent_normalization", "planning"],
624
+ "profile_ids": [],
625
+ "stop_behavior": "Stop generic DB-only work with Missing Inputs or an Oracle DB skills required notice when the upstream skills are unavailable.",
626
+ "enforced_by": ["SKILL.md"],
627
+ "details_doc": "references/policies/memory-bank/00-guard/ai.guard.md"
628
+ },
629
+ {
630
+ "rule_id": "SECURITY_BASELINE_REQUIRED_001",
631
+ "owner": "references/policies/memory-bank/10-global/apex.global.md",
632
+ "summary": "Generated business applications must use the authenticated-page, session-protection, Page 0, and session-timeout security baseline.",
633
+ "phases": ["planning", "generation", "validation", "repair"],
634
+ "profile_ids": ["full-app"],
635
+ "stop_behavior": "Block publish and completion until required application and page security defaults are present.",
636
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py"],
637
+ "details_doc": "references/policies/memory-bank/00-guard/ai.guard.md"
638
+ },
639
+ {
640
+ "rule_id": "PUBLIC_PAGE_REVIEW_REQUIRED_001",
641
+ "owner": "references/policies/memory-bank/10-global/apex.global.md",
642
+ "summary": "Treat the login page as the only default public page and require explicit review rationale for every other public page.",
643
+ "phases": ["planning", "generation", "validation", "repair"],
644
+ "profile_ids": ["full-app"],
645
+ "stop_behavior": "Block completion when a non-login public page lacks explicit security-review rationale.",
646
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py", "assets/validator-fix-recipes.json"],
647
+ "details_doc": "references/policies/memory-bank/00-guard/ai.guard.md"
648
+ },
649
+ {
650
+ "rule_id": "HIDDEN_ITEM_SSP_REQUIRED_001",
651
+ "owner": "references/policies/memory-bank/10-global/apex.global.md",
652
+ "summary": "Classify hidden items as protected server-owned data or explicitly justified same-page client-owned state and apply matching Session State Protection.",
653
+ "phases": ["generation", "validation", "repair"],
654
+ "profile_ids": ["form", "dynamic-actions"],
655
+ "stop_behavior": "Block finalization when hidden-item ownership and Session State Protection disagree.",
656
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py", "assets/validator-fix-recipes.json"],
657
+ "details_doc": "references/policies/memory-bank/00-guard/ai.guard.md"
658
+ },
659
+ {
660
+ "rule_id": "REPORT_ESCAPE_REQUIRED_001",
661
+ "owner": "references/policies/memory-bank/30-pages/apex.report-column-rendering.md",
662
+ "summary": "Keep report and grid output escaped unless a reviewed declarative column-formatting contract safely uses escaped substitutions.",
663
+ "phases": ["generation", "validation", "repair"],
664
+ "profile_ids": ["interactive-report", "classic-report"],
665
+ "stop_behavior": "Block finalization when report output disables escaping without an approved declarative rendering shape.",
666
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py", "assets/validator-fix-recipes.json"],
667
+ "details_doc": "references/policies/memory-bank/30-pages/apex.report-column-rendering.md"
668
+ },
669
+ {
670
+ "rule_id": "SECURE_COOKIE_DSL_UNVERIFIED_001",
671
+ "owner": "references/policies/governance/00-governance.md",
672
+ "summary": "Do not invent secure-cookie DSL attributes that cannot be proven against the active compiler/runtime contract.",
673
+ "phases": ["generation", "validation", "repair"],
674
+ "profile_ids": ["full-app"],
675
+ "stop_behavior": "Emit a blocking validation finding instead of speculative secure-cookie syntax.",
676
+ "enforced_by": ["references/workflows/apex-generation/agents/30-agent-critique.md"],
677
+ "details_doc": "references/policies/memory-bank/00-guard/ai.guard.md"
678
+ },
679
+ {
680
+ "rule_id": "APP_TEMPLATE_ARTIFACT_LEAK_001",
681
+ "owner": "SKILL.md",
682
+ "summary": "Publish only manifest-declared runtime artifacts and never copy template documentation, metadata, or the scaffold-example container into an application root.",
683
+ "phases": ["generation", "validation", "repair", "deployment"],
684
+ "profile_ids": ["full-app"],
685
+ "stop_behavior": "Block publish when template-only files or containers leak into a generated application.",
686
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py", "assets/validator-fix-recipes.json"],
687
+ "details_doc": "references/policies/memory-bank/00-guard/ai.guard.md"
688
+ },
689
+ {
690
+ "rule_id": "APEXLANG_LF_LINE_ENDINGS_REQUIRED_001",
691
+ "owner": "runtime/internal/python/validate_apexlang.py",
692
+ "summary": "Write and validate .apx artifacts with LF line endings only.",
693
+ "phases": ["generation", "validation", "repair"],
694
+ "profile_ids": [],
695
+ "stop_behavior": "Block validation and publish until CRLF line endings are normalized to LF.",
696
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py", "assets/validator-fix-recipes.json"],
697
+ "details_doc": "references/policies/memory-bank/00-guard/ai.guard.md"
698
+ },
699
+ {
700
+ "rule_id": "CALENDAR_CREATE_LINK_TARGET_REQUIRED_001",
701
+ "owner": "references/policies/memory-bank/30-pages/apex.calendar.md",
702
+ "summary": "Resolve whether a calendar create link uses an explicit existing form target or a new same-source modal form.",
703
+ "phases": ["planning", "generation", "validation", "repair"],
704
+ "profile_ids": [],
705
+ "stop_behavior": "Stop with Missing Inputs when the form target choice or required mapping remains unresolved.",
706
+ "enforced_by": ["references/domains/page-components/regions/calendar/workflow-calendar-link-targets.md"],
707
+ "details_doc": "references/policies/memory-bank/30-pages/apex.calendar.md"
708
+ },
709
+ {
710
+ "rule_id": "CALENDAR_VIEW_LINK_TARGET_REQUIRED_001",
711
+ "owner": "references/policies/memory-bank/30-pages/apex.calendar.md",
712
+ "summary": "Resolve whether a calendar view/edit link uses an explicit existing report target or a new report page.",
713
+ "phases": ["planning", "generation", "validation", "repair"],
714
+ "profile_ids": [],
715
+ "stop_behavior": "Stop with Missing Inputs when the report target choice or primary-key mapping remains unresolved.",
716
+ "enforced_by": ["references/domains/page-components/regions/calendar/workflow-calendar-link-targets.md"],
717
+ "details_doc": "references/policies/memory-bank/30-pages/apex.calendar.md"
718
+ },
719
+ {
720
+ "rule_id": "CALENDAR_REPORT_TYPE_REQUIRED_001",
721
+ "owner": "references/policies/memory-bank/30-pages/apex.calendar.md",
722
+ "summary": "Require an explicit Classic Report or Interactive Report choice when a calendar view/edit link creates a report page.",
723
+ "phases": ["planning", "generation"],
724
+ "profile_ids": [],
725
+ "stop_behavior": "Stop with Missing Inputs rather than defaulting the new report type.",
726
+ "enforced_by": ["references/domains/page-components/regions/calendar/workflow-calendar-link-targets.md"],
727
+ "details_doc": "references/policies/memory-bank/30-pages/apex.calendar.md"
728
+ },
729
+ {
730
+ "rule_id": "CALENDAR_REPORT_PK_FILTER_REQUIRED_001",
731
+ "owner": "references/policies/memory-bank/30-pages/apex.calendar.md",
732
+ "summary": "Give a calendar-linked report a dedicated primary-key page item and filter its SQL with that item.",
733
+ "phases": ["planning", "generation", "validation", "repair"],
734
+ "profile_ids": ["interactive-report", "classic-report"],
735
+ "stop_behavior": "Block finalization when the calendar primary-key receiver or report filter is missing.",
736
+ "enforced_by": ["references/domains/page-components/regions/calendar/workflow-calendar-link-targets.md"],
737
+ "details_doc": "references/policies/memory-bank/30-pages/apex.calendar.md"
738
+ },
739
+ {
740
+ "rule_id": "COMPOSITION_CONTRACT_REQUIRED_001",
741
+ "owner": "references/policies/memory-bank/40-components/apex.templates.md",
742
+ "summary": "Solve layout and visual composition through native templates, options, slots, and layout attributes before styling workarounds.",
743
+ "phases": ["planning", "generation", "validation", "repair"],
744
+ "profile_ids": ["dashboard", "form"],
745
+ "stop_behavior": "Stop for clarification when the requested composition cannot be expressed through the active native contract.",
746
+ "enforced_by": ["references/workflows/apex-generation/agents/30-agent-critique.md"],
747
+ "details_doc": "references/policies/memory-bank/40-components/apex.templates.md"
748
+ },
749
+ {
750
+ "rule_id": "GRID_SCOPE_REQUIRED_001",
751
+ "owner": "references/policies/memory-bank/40-components/apex.templates.md",
752
+ "summary": "Keep page-region grid scope separate from item-grid scope and validate child spans only within their parent item region.",
753
+ "phases": ["planning", "generation", "validation", "repair"],
754
+ "profile_ids": ["dashboard", "form"],
755
+ "stop_behavior": "Block finalization when layout spans are validated or emitted against the wrong grid scope.",
756
+ "enforced_by": ["references/workflows/apex-generation/agents/30-agent-critique.md"],
757
+ "details_doc": "references/policies/memory-bank/40-components/apex.templates.md"
758
+ },
759
+ {
760
+ "rule_id": "CSS_CLASS_INVENTION_FORBIDDEN_001",
761
+ "owner": "references/policies/memory-bank/40-components/apex.templates.md",
762
+ "summary": "Do not invent CSS classes or selector-level styling to solve structural layout problems.",
763
+ "phases": ["planning", "generation", "validation", "repair"],
764
+ "profile_ids": ["dashboard", "form"],
765
+ "stop_behavior": "Stop for clarification instead of improvising class-based structural styling.",
766
+ "enforced_by": ["references/workflows/apex-generation/agents/30-agent-critique.md"],
767
+ "details_doc": "references/policies/memory-bank/40-components/apex.templates.md"
768
+ },
769
+ {
770
+ "rule_id": "DB_MODE_PROMPT_REQUIRED_001",
771
+ "owner": "references/policies/memory-bank/20-data/db.connection.md",
772
+ "summary": "Discover offline schema metadata and saved SQLcl connections before asking for DB mode or connection input.",
773
+ "phases": ["intent_normalization", "planning", "runtime"],
774
+ "profile_ids": [],
775
+ "stop_behavior": "Stop with Missing Inputs when required DB mode, schema selection, connection, or workspace remains unresolved after deterministic discovery and one clarification.",
776
+ "enforced_by": ["references/ops/sqlcl.md", "references/ops/runtime-gates.md"],
777
+ "details_doc": "references/policies/memory-bank/20-data/db.connection.md"
778
+ },
779
+ {
780
+ "rule_id": "DB_OBJECT_EVIDENCE_REQUIRED_001",
781
+ "owner": "references/policies/memory-bank/00-guard/ai.guard.md",
782
+ "summary": "Prove every referenced database object and column through schema documentation, live metadata, or exact user assertion before emitting object-specific code.",
783
+ "phases": ["planning", "generation", "validation", "repair"],
784
+ "profile_ids": ["interactive-report", "classic-report", "form", "faceted-search", "rest-data-source"],
785
+ "stop_behavior": "Stop with Missing Inputs while any required object_evidence_source remains unresolved.",
786
+ "enforced_by": ["references/workflows/apex-generation/agents/30-agent-critique.md"],
787
+ "details_doc": "references/policies/memory-bank/00-guard/ai.guard.md"
788
+ },
789
+ {
790
+ "rule_id": "DB_METADATA_REQUIRED_REPORT_001",
791
+ "owner": "references/policies/memory-bank/20-data/apex.sql.md",
792
+ "summary": "Verify report source objects, projected columns, and sort columns against authoritative schema metadata before drafting report SQL.",
793
+ "phases": ["planning", "generation", "validation", "repair"],
794
+ "profile_ids": ["interactive-report", "classic-report", "faceted-search"],
795
+ "stop_behavior": "Stop with Missing Inputs when report object or column metadata cannot be verified.",
796
+ "enforced_by": ["references/workflows/apex-generation/agents/30-agent-critique.md"],
797
+ "details_doc": "references/policies/memory-bank/00-guard/ai.guard.md"
798
+ },
799
+ {
800
+ "rule_id": "DB_VERIFY_BEFORE_GENERATION_001",
801
+ "owner": "references/policies/memory-bank/00-guard/ai.guard.md",
802
+ "summary": "Resolve prerequisite metadata and confirm referenced objects and columns before generating DB-backed APEX artifacts.",
803
+ "phases": ["planning", "generation"],
804
+ "profile_ids": ["interactive-report", "classic-report", "form", "faceted-search"],
805
+ "stop_behavior": "Stop before drafting when prerequisite metadata or required object verification is unavailable.",
806
+ "enforced_by": ["references/workflows/apex-generation/agents/20-agent-draft.md", "references/workflows/apex-generation/agents/30-agent-critique.md"],
807
+ "details_doc": "references/policies/memory-bank/00-guard/ai.guard.md"
808
+ },
809
+ {
810
+ "rule_id": "DB_CONN_REQUIRED_001",
811
+ "owner": "references/policies/memory-bank/20-data/db.connection.md",
812
+ "summary": "Require an explicit resolved connection before live creation or update of database objects.",
813
+ "phases": ["planning", "runtime", "deployment"],
814
+ "profile_ids": [],
815
+ "stop_behavior": "Block live DB object changes when db_mode or db_connection_name is unresolved or ambiguous.",
816
+ "enforced_by": ["references/ops/sqlcl.md"],
817
+ "details_doc": "references/policies/memory-bank/20-data/db.connection.md"
818
+ },
819
+ {
820
+ "rule_id": "LIVE_RUNTIME_VALIDATION_REQUIRED_001",
821
+ "owner": "references/ops/runtime-gates.md",
822
+ "summary": "Require authoritative live APEX validation evidence for workflows that claim runtime completion.",
823
+ "phases": ["runtime"],
824
+ "profile_ids": [],
825
+ "stop_behavior": "Block completion when required runtime inputs or live validation evidence are missing.",
826
+ "enforced_by": ["tools/apexctl.mjs", "runtime/runtime.bundle.mjs"],
827
+ "details_doc": "references/ops/runtime-gates.md"
828
+ },
829
+ {
830
+ "rule_id": "RUNTIME_GATE_COMPLETION_REQUIRED_001",
831
+ "owner": "references/ops/runtime-gates.md",
832
+ "summary": "Allow completion only after the same resolved application path passes the required direct SQLcl validation path.",
833
+ "phases": ["runtime"],
834
+ "profile_ids": [],
835
+ "stop_behavior": "Block completion wording until the canonical validation gate succeeds.",
836
+ "enforced_by": ["tools/apexctl.mjs", "runtime/runtime.bundle.mjs"],
837
+ "details_doc": "references/ops/runtime-gates.md"
838
+ },
839
+ {
840
+ "rule_id": "ONLINE_IMPORT_CONDITIONAL_001",
841
+ "owner": "references/ops/runtime-gates.md",
842
+ "summary": "Treat an explicit post-check GUI choice as the only authority for live import and preserve validate/import session continuity.",
843
+ "phases": ["runtime", "deployment"],
844
+ "profile_ids": [],
845
+ "stop_behavior": "Stop after validation when import is not explicitly selected or when session or target identity is uncertain.",
846
+ "enforced_by": ["tools/apexctl.mjs", "runtime/runtime.bundle.mjs"],
847
+ "details_doc": "references/ops/runtime-gates.md"
848
+ },
849
+ {
850
+ "rule_id": "APEXLANG_BUILD_REFRESH_SCOPE_REQUIRED_001",
851
+ "owner": "references/policies/governance/00-governance.md",
852
+ "summary": "Classify packaged-build changes as narrow metadata deltas unless compiler evidence proves broader DSL drift.",
853
+ "phases": ["planning", "validation"],
854
+ "profile_ids": [],
855
+ "stop_behavior": "Do not broaden a component-local build delta into unrelated guidance without compiler-backed evidence.",
856
+ "enforced_by": ["references/policies/governance/00-governance.md"],
857
+ "details_doc": "references/policies/memory-bank/00-guard/ai.guard.md"
858
+ },
859
+ {
860
+ "rule_id": "REPORT_SQL_HTML_LITERAL_FORBIDDEN_001",
861
+ "owner": "references/policies/memory-bank/30-pages/apex.report-column-rendering.md",
862
+ "summary": "Return raw report data from SQL or PL/SQL and perform presentation through declarative column rendering.",
863
+ "phases": ["generation", "validation", "repair"],
864
+ "profile_ids": ["interactive-report", "classic-report"],
865
+ "stop_behavior": "Block finalization while report SQL or PL/SQL contains presentation HTML literals.",
866
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py", "assets/validator-fix-recipes.json"],
867
+ "details_doc": "references/policies/memory-bank/30-pages/apex.report-column-rendering.md"
868
+ },
869
+ {
870
+ "rule_id": "STATIC_ID_WHERE_LOWER_REQUIRED_001",
871
+ "owner": "references/policies/memory-bank/20-data/apex.sql.md",
872
+ "summary": "Normalize SQL comparisons against _static_id columns with LOWER on the column and matching value or bind.",
873
+ "phases": ["generation", "validation", "repair"],
874
+ "profile_ids": [],
875
+ "stop_behavior": "Block finalization while case-sensitive or mixed-case _static_id predicates remain.",
876
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py", "assets/validator-fix-recipes.json"],
877
+ "details_doc": "references/policies/memory-bank/20-data/apex.sql.md"
878
+ },
879
+ {
880
+ "rule_id": "ACL_ROLE_DECLARATION_REQUIRED_001",
881
+ "owner": "references/policies/memory-bank/20-data/apex.logic.md",
882
+ "summary": "Declare each referenced application ACL role exactly once with a lowercase kebab-case static ID.",
883
+ "phases": ["generation", "validation", "repair"],
884
+ "profile_ids": [],
885
+ "stop_behavior": "Block finalization when role checks lack matching valid acl-roles declarations.",
886
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py", "assets/validator-fix-recipes.json"],
887
+ "details_doc": "references/domains/README.md"
888
+ },
889
+ {
890
+ "rule_id": "PLSQL_INLINE_BLOCK_001",
891
+ "owner": "references/policies/memory-bank/20-data/apex.logic.md",
892
+ "summary": "Extract APEX artifact PL/SQL bodies over 4000 raw characters into a verified package API.",
893
+ "phases": ["generation", "validation", "repair"],
894
+ "profile_ids": ["dynamic-actions"],
895
+ "stop_behavior": "Block final output until oversized PL/SQL is extracted and referenced through the allowed process shape.",
896
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py", "assets/validator-fix-recipes.json"],
897
+ "details_doc": "references/policies/memory-bank/20-data/apex.logic.md"
898
+ },
899
+ {
900
+ "rule_id": "SQL_INLINE_BLOCK_001",
901
+ "owner": "references/policies/memory-bank/20-data/apex.sql.md",
902
+ "summary": "Extract APEX artifact SQL bodies over 4000 raw characters into a verified secure view.",
903
+ "phases": ["generation", "validation", "repair"],
904
+ "profile_ids": ["interactive-report", "classic-report", "form", "faceted-search"],
905
+ "stop_behavior": "Block final output until oversized SQL is extracted and the artifact references the verified view.",
906
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py", "assets/validator-fix-recipes.json"],
907
+ "details_doc": "references/policies/memory-bank/20-data/apex.sql.md"
908
+ },
909
+ {
910
+ "rule_id": "DEFAULT_GUIDANCE_LAYER_REQUIRED_001",
911
+ "owner": "references/policies/memory-bank/10-global/apex.global.md",
912
+ "applies_to": ["user-facing page", "form", "report", "item help", "column comments", "accessibility guidance"],
913
+ "summary": "User-facing pages need useful page help, behavior-aware item help, and specific developer-facing report/grid column comments by default.",
914
+ "directives": [
915
+ "Generate actually helpful guidance content, not placeholders.",
916
+ "Comment content must be specific to the column.",
917
+ "Reject placeholder or empty-value patterns such as `Help Text Here`, `Inline Help Text Here`, `No help is available for this page`.",
918
+ "Reject placeholder or generic filler language.",
919
+ "Auto-revise the draft to add helpful page help, item help, and column comments.",
920
+ "Replace placeholders and label-only restatements with concise, behavior-aware wording."
921
+ ],
922
+ "required_load_when": ["apexlang generation", "user-facing page", "form", "report", "help text"],
923
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py"],
924
+ "details_doc": "references/policies/memory-bank/10-global/apex.global.md",
925
+ "examples_doc": "templates/items/items._common.md"
926
+ },
927
+ {
928
+ "rule_id": "BUTTON_ICON_POSITION_DEFAULT_001",
929
+ "owner": "references/policies/memory-bank/40-components/apex.buttons.md",
930
+ "applies_to": ["button", "template-component-button", "buttons-container"],
931
+ "summary": "Icon-plus-text buttons default to t-Button--iconLeft; t-Button--iconRight is explicit-only; icon-only buttons omit left/right placement.",
932
+ "required_load_when": ["button icon", "text-with-icon button", "template component button icon", "buttons-container with icon button"],
933
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py"],
934
+ "details_doc": "references/policies/memory-bank/40-components/apex.buttons.md",
935
+ "examples_doc": "templates/buttons/buttons.appearance-icon.md"
936
+ },
937
+ {
938
+ "rule_id": "TEMPLATE_OPTIONS_EMITTED_VALUES_001",
939
+ "owner": "references/policies/memory-bank/40-components/apex.templates.md",
940
+ "applies_to": ["templateOptions", "universal-theme-template-options"],
941
+ "summary": "Template options must use accepted emitted values, keep #DEFAULT# atomic, and preserve documented composite values as one entry.",
942
+ "required_load_when": ["template options", "universal theme option", "template option repair"],
943
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py"],
944
+ "details_doc": "references/policies/memory-bank/40-components/apex.templates.md",
945
+ "examples_doc": "templates/buttons/buttons._common.md"
946
+ },
947
+ {
948
+ "rule_id": "FA_ICON_REQUIRED_001",
949
+ "owner": "runtime/internal/python/validate_apexlang.py",
950
+ "applies_to": ["icon-bearing property", "icon CSS class", "Font APEX icon", "fa-* token"],
951
+ "summary": "Icon-bearing properties must use exactly one pinned Font APEX catalogue icon, at most one optional fa base class, and unique catalogue-listed modifiers.",
952
+ "directives": ["Read the pinned Font APEX index, select one exact icon token, add at most one optional fa base class and unique optional catalogue-listed modifiers, and never invent fa-* names."],
953
+ "required_load_when": ["icon", "icon-only", "icon CSS class", "Font APEX", "fa-"],
954
+ "phases": ["planning", "generation", "validation", "repair"],
955
+ "profile_ids": ["icons"],
956
+ "stop_behavior": "Block final output until every static icon-bearing property has exactly one catalogue icon and only catalogue-listed modifiers.",
957
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py", "assets/validator-fix-recipes.json"],
958
+ "details_doc": "assets/indexes/font-apex-icon-index.json"
959
+ },
960
+ {
961
+ "rule_id": "BUTTON_BEHAVIOR_TARGET_CONTRACT_001",
962
+ "owner": "references/policies/memory-bank/40-components/apex.buttons.md",
963
+ "applies_to": ["button", "button behavior", "redirectThisApp", "redirectOtherApp"],
964
+ "summary": "Redirect buttons require declarative targets; submit and dynamic-action buttons omit targets; definedByDynamicAction omits warnOnUnsavedChanges.",
965
+ "required_load_when": ["button redirect", "button action", "button behavior", "button validation repair"],
966
+ "enforced_by": ["assets/component-policies.json", "runtime/internal/python/validate_apexlang.py"],
967
+ "details_doc": "references/policies/memory-bank/40-components/apex.buttons.md",
968
+ "examples_doc": "templates/buttons/buttons.redirect-this-app.md"
969
+ },
970
+ {
971
+ "rule_id": "FORM_DRAWER_DEFAULT_END_REQUIRED_001",
972
+ "owner": "references/policies/memory-bank/30-pages/apex.form.md",
973
+ "applies_to": ["modal form", "drawer form", "form page"],
974
+ "summary": "Report-to-form create/edit pages default to modal drawer forms with explicit end/right drawer positioning unless requirements prove another presentation.",
975
+ "required_load_when": ["modal form", "drawer form", "form page generation"],
976
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py"],
977
+ "details_doc": "references/policies/memory-bank/30-pages/apex.form.md",
978
+ "examples_doc": "templates/page-examples/form-page/form-page.example.md"
979
+ },
980
+ {
981
+ "rule_id": "INTERACTIVE_REPORT_COLUMN_COVERAGE_001",
982
+ "owner": "references/policies/memory-bank/30-pages/apex.interactive-report.md",
983
+ "applies_to": ["interactive report", "report columns"],
984
+ "summary": "SQL-backed report pages need explicit column coverage and report guidance aligned to the delivered projection.",
985
+ "required_load_when": ["interactive report", "report page", "report column validation"],
986
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py"],
987
+ "details_doc": "references/policies/memory-bank/30-pages/apex.interactive-report.md",
988
+ "examples_doc": "templates/region-components/interactive-report/interactive-report.standard.md"
989
+ },
990
+ {
991
+ "rule_id": "CARDS_VISUAL_SUMMARY_PATTERN_REQUIRED_001",
992
+ "owner": "references/policies/memory-bank/30-pages/apex.cards-page.md",
993
+ "applies_to": ["visual summary", "people cards", "person cards", "product cards", "status cards", "status tiles", "entity cards", "cards region"],
994
+ "component_ids": ["cards"],
995
+ "summary": "People, product, status, and entity visual summaries use the structured native Cards page pattern rather than Dashboard, Metric Card, or Interactive Grid synonym inference.",
996
+ "required_load_when": ["visual summary cards", "people cards", "product cards", "status tiles", "native cards page"],
997
+ "directives": ["Select SQL query or REST Data Source explicitly.", "Default to one native Cards region with Universal Theme automatic responsive layout.", "Keep filtering and search outside this pattern."],
998
+ "enforced_by": ["assets/contracts/page-patterns.json", "assets/contracts/page-construction-packs.json", "assets/apex-generation/components.registry.json", "assets/component-attributes.json", "runtime/internal/python/validate_apexlang.py"],
999
+ "details_doc": "references/policies/memory-bank/30-pages/apex.cards-page.md",
1000
+ "examples_doc": "templates/region-components/cards/cards._common.md"
1001
+ },
1002
+ {
1003
+ "rule_id": "CARDS_SOURCE_MAPPING_REQUIRED_001",
1004
+ "owner": "references/policies/memory-bank/30-pages/apex.cards-page.md",
1005
+ "applies_to": ["cards SQL source", "cards REST Data Source", "cards title", "cards subtitle", "cards body", "cards icon", "cards image", "cards badge", "conditional card style"],
1006
+ "component_ids": ["cards"],
1007
+ "summary": "Every requested Cards role must map to an evidenced SQL projection alias or authoritative REST data-profile column before APEXlang rendering.",
1008
+ "required_load_when": ["cards source mapping", "cards data mapping", "conditional card styling"],
1009
+ "directives": ["Record one source-to-attribute mapping for each requested role.", "Prefer native mappings over HTML expressions.", "Use only compiler-proven CSS-class properties and allowlisted semantic class tokens."],
1010
+ "enforced_by": ["assets/contracts/page-construction-packs.json", "references/workflows/apex-generation/agents/30-agent-critique.md", "runtime/internal/python/validate_apexlang.py"],
1011
+ "details_doc": "references/policies/memory-bank/30-pages/apex.cards-page.md",
1012
+ "examples_doc": "templates/region-components/cards/cards._common.md"
1013
+ },
1014
+ {
1015
+ "rule_id": "CARDS_INTERACTION_BOUNDARY_REQUIRED_001",
1016
+ "owner": "references/policies/memory-bank/30-pages/apex.cards-page.md",
1017
+ "applies_to": ["clickable cards", "cards refresh", "responsive cards", "cards filtering", "cards search"],
1018
+ "component_ids": ["cards"],
1019
+ "summary": "The visual-summary Cards pattern supports native card navigation, targeted refresh, and responsive layout but excludes Faceted Search and Smart Filters orchestration.",
1020
+ "required_load_when": ["clickable cards", "dynamic cards refresh", "responsive cards grid", "cards with filters"],
1021
+ "directives": ["Use declarative Cards targets with evidenced item mappings.", "Name the refresh trigger, Cards static ID, and page items to submit.", "Route filtering or search to its owning page pattern."],
1022
+ "enforced_by": ["assets/contracts/page-construction-packs.json", "references/workflows/apex-generation/agents/30-agent-critique.md", "runtime/internal/python/validate_apexlang.py"],
1023
+ "details_doc": "references/policies/memory-bank/30-pages/apex.cards-page.md",
1024
+ "examples_doc": "templates/region-components/cards/cards._common.md"
1025
+ },
1026
+ {
1027
+ "rule_id": "CARDS_SECURITY_REQUIRED_001",
1028
+ "owner": "references/policies/memory-bank/30-pages/apex.cards-page.md",
1029
+ "applies_to": ["cards", "clickable cards", "cards HTML", "cards authorization", "cards URL"],
1030
+ "component_ids": ["cards"],
1031
+ "summary": "Cards pages require authenticated access, evidenced authorization boundaries, escaped advanced HTML, and allowlisted navigation and media URLs.",
1032
+ "required_load_when": ["cards", "clickable cards", "cards advanced formatting", "cards media"],
1033
+ "directives": ["Authorize Cards data and navigation targets independently.", "Escape untrusted advanced-formatting values with !HTML.", "Reject active-content, protocol-relative, embedded-credential, and untrusted dynamic URLs."],
1034
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py", "references/workflows/apex-generation/agents/30-agent-critique.md"],
1035
+ "details_doc": "references/policies/memory-bank/30-pages/apex.cards-page.md",
1036
+ "examples_doc": "templates/region-components/cards/cards._common.md"
1037
+ },
1038
+ {
1039
+ "rule_id": "CARDS_REST_SECURITY_REQUIRED_001",
1040
+ "owner": "templates/region-components/cards/cards.rest-source.md",
1041
+ "applies_to": ["cards REST Data Source", "REST cards", "REST source", "Web Credential"],
1042
+ "component_ids": ["cards"],
1043
+ "summary": "REST-backed Cards use an existing shared REST Data Source and Web Credential, HTTPS, exact Valid for URLs restrictions, and authoritative profile constraints.",
1044
+ "required_load_when": ["cards REST Data Source", "REST cards", "REST source"],
1045
+ "directives": ["Never emit endpoint or credential literals in the Cards region.", "Restrict Web Credential Valid for URLs to exact HTTPS operation prefixes.", "Constrain REST media fields to documented safe origins."],
1046
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py", "references/workflows/apex-generation/agents/30-agent-critique.md", "templates/region-components/cards/cards.rest-source.md"],
1047
+ "details_doc": "templates/region-components/cards/cards.rest-source.md",
1048
+ "examples_doc": "templates/region-components/cards/cards.rest-source.md"
1049
+ },
1050
+ {
1051
+ "rule_id": "CARDS_CONDITIONAL_STYLE_ALLOWLIST_REQUIRED_001",
1052
+ "owner": "templates/region-components/cards/cards._common.md",
1053
+ "applies_to": ["conditional card style", "card CSS classes", "status card style"],
1054
+ "component_ids": ["cards"],
1055
+ "summary": "Conditional Cards classes must resolve only to the fixed Universal Theme semantic allowlist or NULL.",
1056
+ "required_load_when": ["conditional card styling", "card CSS classes", "status tiles"],
1057
+ "directives": ["Permit only u-normal, u-hot, u-info, u-success, u-warning, u-danger, or NULL.", "Reject raw user or service class values."],
1058
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py"],
1059
+ "details_doc": "templates/region-components/cards/cards._common.md",
1060
+ "examples_doc": "templates/region-components/cards/cards.standard.md"
1061
+ },
1062
+ {
1063
+ "rule_id": "DASHBOARD_KPI_METRIC_CARD_REQUIRED_001",
1064
+ "owner": "references/policies/memory-bank/30-pages/apex.dashboard.md",
1065
+ "applies_to": ["dashboard", "kpi", "metric card"],
1066
+ "summary": "Dashboard KPI strips use normalized Metric Card template components rather than KPI-like Classic Reports or static fake cards.",
1067
+ "required_load_when": ["dashboard", "kpi card", "metric card", "scorecard"],
1068
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py"],
1069
+ "details_doc": "references/policies/memory-bank/30-pages/apex.dashboard.md",
1070
+ "examples_doc": "templates/template-components/metric-card/metric-card._common.md"
1071
+ },
1072
+ {
1073
+ "rule_id": "METRIC_CARD_REPORT_CONTRACT_REQUIRED_001",
1074
+ "owner": "templates/template-components/metric-card/metric-card._common.md",
1075
+ "applies_to": ["metric card", "kpi card", "scorecard"],
1076
+ "summary": "Report-mode Metric Cards require settings.metric, complete child-column coverage, compiler-backed attributes, and correct text versus column-selector mappings.",
1077
+ "required_load_when": ["metric card", "metric cards", "kpi card", "scorecard"],
1078
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py"],
1079
+ "details_doc": "templates/template-components/metric-card/metric-card._common.md",
1080
+ "examples_doc": "templates/template-components/metric-card/metric-card.report-minimal.md"
1081
+ },
1082
+ {
1083
+ "rule_id": "METRIC_CARD_PARTIAL_SCOPE_REQUIRED_001",
1084
+ "owner": "templates/template-components/metric-card/metric-card.partial-minimal.md",
1085
+ "applies_to": ["partial metric card", "metric card partial mode", "metric card permutations"],
1086
+ "summary": "Partial-mode Metric Cards omit report-scoped layout, item classes, grouping, row selection, messages, and pagination while retaining valid component-scope content and link actions.",
1087
+ "required_load_when": ["partial metric card", "metric card partial mode", "metric card permutations"],
1088
+ "enforced_by": ["assets/component-attributes.json", "runtime/internal/python/validate_apexlang.py"],
1089
+ "details_doc": "templates/template-components/metric-card/metric-card._common.md",
1090
+ "examples_doc": "templates/template-components/metric-card/metric-card.partial-minimal.md"
1091
+ },
1092
+ {
1093
+ "rule_id": "METRIC_CARD_AVATAR_BADGE_REQUIRED_001",
1094
+ "owner": "templates/template-components/metric-card/metric-card.report-avatar-badge.md",
1095
+ "applies_to": ["metric card avatar", "metric card badge", "kpi avatar", "kpi badge"],
1096
+ "summary": "Metric Card nested Avatar and Badge groups require compiler-backed properties, matching Avatar payloads, image-safe Avatar style dependencies, complete Badge label/value fields, and projected bare-alias selectors.",
1097
+ "required_load_when": ["metric card avatar", "metric card badge", "metric card avatar and badge", "kpi avatar", "kpi badge"],
1098
+ "enforced_by": ["assets/component-attributes.json", "runtime/internal/python/validate_apexlang.py"],
1099
+ "details_doc": "templates/template-components/metric-card/metric-card._common.md",
1100
+ "examples_doc": "templates/template-components/metric-card/metric-card.report-avatar-badge.md"
1101
+ },
1102
+ {
1103
+ "rule_id": "METRIC_CARD_LINK_ACTION_REQUIRED_001",
1104
+ "owner": "templates/template-components/metric-card/metric-card.report-link.md",
1105
+ "applies_to": ["metric card link", "metric card navigation", "kpi drilldown"],
1106
+ "summary": "Metric Card row navigation uses only action.position link with declarative behavior and no action template.",
1107
+ "directives": [
1108
+ "Use redirectThisApp or redirectOtherApp with a structured target, redirectUrl with a reviewed safe targetUrl, or triggerAction with no target.",
1109
+ "Reject targetUrl substitutions outside query parameters so the scheme, host, path, and fragment remain static; also reject unsafe URL schemes and linkAttributes containing inline handlers, URL overrides, scriptable CSS, unsafe dynamic substitutions, or unsafe new-window attributes."
1110
+ ],
1111
+ "required_load_when": ["metric card link", "metric card drilldown", "kpi navigation"],
1112
+ "enforced_by": ["assets/component-policies.json", "runtime/internal/python/validate_apexlang.py"],
1113
+ "details_doc": "templates/template-components/metric-card/metric-card._common.md",
1114
+ "examples_doc": "templates/template-components/metric-card/metric-card.report-link.md"
1115
+ },
1116
+ {
1117
+ "rule_id": "METRIC_CARD_SELECTION_ITEMS_REQUIRED_001",
1118
+ "owner": "templates/template-components/metric-card/metric-card.report-grouping-selection.md",
1119
+ "applies_to": ["metric card selection", "metric card grouping", "selectable kpi cards"],
1120
+ "summary": "Metric Card selection modes require stable row identity and mode-specific same-page item wiring; grouped output requires grouped columns and deterministic ordering.",
1121
+ "required_load_when": ["metric card selection", "grouped metric cards", "selectable metric cards"],
1122
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py"],
1123
+ "details_doc": "templates/template-components/metric-card/metric-card._common.md",
1124
+ "examples_doc": "templates/template-components/metric-card/metric-card.report-grouping-selection.md"
1125
+ },
1126
+ {
1127
+ "rule_id": "BADGE_TEMPLATE_COMPONENT_CONTRACT_REQUIRED_001",
1128
+ "owner": "templates/template-components/badge/badge._common.md",
1129
+ "applies_to": ["badge", "badge template component", "badge region", "standalone badge"],
1130
+ "summary": "Standalone Badge regions use the native report-mode Badge template component with verified source mappings, exact attributes, an optional link action, and independent authorization enforcement.",
1131
+ "component_ids": ["badge"],
1132
+ "required_load_when": ["badge", "badge template component", "badge region", "standalone badge", "themeTemplateComponent/badge"],
1133
+ "directives": [
1134
+ "Support the full compiler-valid source matrix: localDatabase/restEnabledSql with tableView, sqlQuery, functionBody, or propertyGraph, plus restSource, jsonDualityView, jsonSource, and sampleData; require label and value mappings and emit explicit child columns for delivered source projections.",
1135
+ "Limit the column mapped by Badge settings.value to varchar2, number, date, intervalYearToMonth, or intervalDayToSecond; auxiliary columns retain compiler-supported datatypes.",
1136
+ "Treat Badge state as explicit user intent: when unspecified, omit settings.state and its projected child column so the native Badge uses its normal state; when requested, require a projected varchar2 column whose source contract guarantees exact lowercase danger, warning, success, or info, with SQL proof as an additional check.",
1137
+ "Before assigning a Badge icon, load and consult the pinned Font APEX catalogue; require exactly one catalogue icon and only catalogue-listed modifiers.",
1138
+ "Reject targetUrl and custom linkAttributes unless a future application-specific allowlist contract explicitly models them.",
1139
+ "Allow at most one Badge action, require the link position, and do not invent action templates.",
1140
+ "Keep Badge SQL free of presentation HTML and enforce authorization on both the region and any target page."
1141
+ ],
1142
+ "enforced_by": ["assets/apex-generation/components.registry.json", "runtime/internal/python/validate_apexlang.py"],
1143
+ "details_doc": "templates/template-components/badge/badge._common.md",
1144
+ "examples_doc": "templates/template-components/badge/badge.report-minimal.md"
1145
+ },
1146
+ {
1147
+ "rule_id": "MEDIA_LIST_TEMPLATE_COMPONENT_CONTRACT_REQUIRED_001",
1148
+ "owner": "templates/template-components/media-list/media-list._common.md",
1149
+ "component_ids": ["media-list"],
1150
+ "applies_to": ["media list", "media list template component", "media list region", "standalone media list"],
1151
+ "summary": "Media List regions use the native partial or report template component with target-build-resolved report columns, native responsive layouts, and capability-gated Avatar, Badge, grouping, and single-link composition.",
1152
+ "required_load_when": ["media list template component", "media list region", "standalone media list", "themeTemplateComponent/mediaList"],
1153
+ "directives": [
1154
+ "Resolve the Media List report-column declaration and properties from the active target-build grammar and component contracts; never mix named and unnamed variants.",
1155
+ "Require source, deterministic orderBy, and complete projection coverage in report mode; omit report-only blocks and settings in partial mode.",
1156
+ "Keep settings.displayAvatar and settings.displayBadge synchronized with their native plugin blocks and apply the shared Avatar and Badge safety and accessibility contracts.",
1157
+ "Intersect theme inventory with the active target-build component contract before emitting grouping or nested Avatar/Badge properties; use only pinned Font APEX icons in supported features.",
1158
+ "Allow at most one link-position action, require layout.sequence, use a reviewed structured same-app target, reject triggerAction until owning dynamic-action validation exists, and reject targetUrl and custom linkAttributes.",
1159
+ "Use only native layout values for responsive presentation and do not inject structural HTML or CSS into SQL or template settings."
1160
+ ],
1161
+ "enforced_by": ["assets/apex-generation/components.registry.json", "runtime/internal/python/validate_apexlang.py"],
1162
+ "details_doc": "templates/template-components/media-list/media-list._common.md",
1163
+ "examples_doc": "templates/template-components/media-list/media-list.report-base.md"
1164
+ },
1165
+ {
1166
+ "rule_id": "MEDIA_LIST_SOURCE_CAPABILITY_REQUIRED_001",
1167
+ "owner": "templates/template-components/media-list/media-list._common.md",
1168
+ "component_ids": ["media-list"],
1169
+ "applies_to": ["media list source", "media list REST source", "media list JSON source"],
1170
+ "summary": "Media List report generation currently supports only localDatabase/sqlQuery; unsupported source adapters stop with Missing Inputs.",
1171
+ "required_load_when": ["media list source", "media list REST source", "media list JSON source"],
1172
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py", "runtime/lib/catalogs.mjs"],
1173
+ "details_doc": "templates/template-components/media-list/media-list._common.md"
1174
+ },
1175
+ {
1176
+ "rule_id": "MEDIA_LIST_PARENT_REGION_REQUIRED_001",
1177
+ "owner": "templates/template-components/media-list/media-list._common.md",
1178
+ "component_ids": ["media-list"],
1179
+ "applies_to": ["nested media list", "media list parent region"],
1180
+ "summary": "Nested Media List regions require an existing, unambiguous Standard or Content Block parent with a verified supported slot.",
1181
+ "required_load_when": ["nested media list", "media list parent region"],
1182
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py"],
1183
+ "details_doc": "templates/template-components/media-list/media-list._common.md"
1184
+ },
1185
+ {
1186
+ "rule_id": "MEDIA_LIST_PARENT_SLOT_UNSUPPORTED_001",
1187
+ "owner": "templates/template-components/media-list/media-list._common.md",
1188
+ "component_ids": ["media-list"],
1189
+ "applies_to": ["media list parent slot", "nested media list slot"],
1190
+ "summary": "Nested Media List content uses regionBody by default and accepts subRegions only when explicitly requested and supported by the parent template.",
1191
+ "required_load_when": ["media list parent slot", "nested media list slot"],
1192
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py"],
1193
+ "details_doc": "templates/template-components/media-list/media-list._common.md"
1194
+ },
1195
+ {
1196
+ "rule_id": "MEDIA_LIST_GRAMMAR_COMPILER_CONFORMANCE_REQUIRED_001",
1197
+ "owner": "runtime/grammar_contract.mjs",
1198
+ "component_ids": ["media-list"],
1199
+ "applies_to": ["media list grammar", "media list target build"],
1200
+ "summary": "Media List grammar-required properties must agree with target compiler metadata; a required-versus-defaulted mismatch blocks generation.",
1201
+ "required_load_when": ["media list grammar", "media list target build"],
1202
+ "enforced_by": ["runtime/grammar_contract.mjs", "runtime/runtime.bundle.mjs"],
1203
+ "details_doc": "runtime/grammar_contract.mjs"
1204
+ },
1205
+ {
1206
+ "rule_id": "REGION_DISPLAY_SELECTOR_CONTRACT_REQUIRED_001",
1207
+ "owner": "references/domains/page-components/regions/region-display-selector/workflow-region-display-selector.md",
1208
+ "applies_to": ["region display selector", "RDS", "switch between regions", "view single region", "scroll window"],
1209
+ "summary": "A Region Display Selector is one data-free controller for at least two explicitly opted-in sibling regions, with mode-dependent settings and no header or breadcrumb targets.",
1210
+ "phases": ["planning", "generation", "validation", "repair"],
1211
+ "component_ids": ["region-display-selector"],
1212
+ "stop_behavior": "Reject ambiguous membership, multiple controllers, fewer than two targets, data sources, invalid Show All use, and header or breadcrumb targets.",
1213
+ "required_load_when": ["Region Display Selector generation", "RDS generation", "Region Display Selector validation"],
1214
+ "directives": [
1215
+ "Resolve the exact controlled-region list before generation.",
1216
+ "Set advanced.regionDisplaySelector: true only on selected sibling regions.",
1217
+ "Omit settings.includeShowAll for scrollWindow mode.",
1218
+ "Treat RDS visibility as presentation, never authorization."
1219
+ ],
1220
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py"],
1221
+ "details_doc": "references/domains/page-components/regions/region-display-selector/workflow-region-display-selector.md",
1222
+ "examples_doc": "templates/region-components/region-display-selector/region-display-selector.standard.md"
1223
+ },
1224
+ {
1225
+ "rule_id": "APPLICATION_SPEC_REQUIRED_001",
1226
+ "owner": "references/workflows/apexlang/application-spec.template.md",
1227
+ "applies_to": ["complete app", "functional requirements", "data model"],
1228
+ "summary": "Complete app generation from functional requirements plus model/schema evidence must produce an implementation-ready application spec before drafting non-trivial .apx artifacts.",
1229
+ "required_load_when": ["create app from fr and model", "complete app generation", "functional requirements plus model"],
1230
+ "enforced_by": ["runtime/internal/python/validate_apexlang.py"],
1231
+ "details_doc": "references/workflows/apexlang/application-spec.template.md",
1232
+ "examples_doc": "references/workflows/apexlang/workflow-create-app-from-fr-and-model.md"
1233
+ },
1234
+ {
1235
+ "rule_id": "APPLICATION_CAPSULE_SET_REQUIRED_001",
1236
+ "owner": "runtime/lib/catalogs.mjs",
1237
+ "applies_to": ["complete app", "multi-page generation", "application capsule set"],
1238
+ "summary": "Full-app generation must use one small application-plan capsule plus adaptive page-first units, splitting oversized pages into shell, region, and logic units only when needed.",
1239
+ "required_load_when": ["complete app generation", "multi-page generation", "application capsule set"],
1240
+ "directives": ["Load the application-plan capsule once.", "Retrieve exactly one manifest unit by unit_id.", "Use a fresh context and never concatenate or retain prior unit capsules."],
1241
+ "enforced_by": ["tools/apexctl.mjs", "assets/routing-load-policy.json"],
1242
+ "details_doc": "runtime/lib/catalogs.mjs",
1243
+ "examples_doc": "references/workflows/apexlang/workflow-create-app-from-fr-and-model.md"
1244
+ },
1245
+ {
1246
+ "rule_id": "STRUCTURED_PATTERN_PACK_REQUIRED_001",
1247
+ "owner": "assets/contracts/page-construction-packs.json",
1248
+ "applies_to": ["page patterns", "visual summary cards", "report modal form", "dashboard", "master-detail", "smart filter", "smart filters", "smart filter search", "faceted search", "lov-backed form"],
1249
+ "summary": "Common page workflows should be selected from structured pattern packs before falling back to Markdown template inference.",
1250
+ "required_load_when": ["page pattern selection", "visual summary cards", "report modal form", "dashboard", "master-detail", "smart filter", "smart filters", "smart filter search", "faceted search", "lov-backed form"],
1251
+ "enforced_by": ["assets/contracts/page-patterns.json", "assets/contracts/page-construction-packs.json"],
1252
+ "details_doc": "assets/contracts/page-construction-packs.json",
1253
+ "examples_doc": "assets/contracts/page-patterns.json"
1254
+ },
1255
+ {
1256
+ "rule_id": "COMPONENT_REGISTRY_ROUTING_REQUIRED_001",
1257
+ "owner": "assets/apex-generation/components.registry.json",
1258
+ "applies_to": ["component generation", "page generation", "full app generation"],
1259
+ "summary": "Resolve requested component families through the component registry and expose only their exact rules, templates, requirements, and workflow routes.",
1260
+ "required_load_when": ["component selection", "page component inventory", "unknown page pattern"],
1261
+ "directives": ["Do not scan template folders to discover components.", "Stop when neither a structured pattern nor a component-registry route supports the requested shape."],
1262
+ "enforced_by": ["runtime/lib/catalogs.mjs"],
1263
+ "details_doc": "assets/apex-generation/components.registry.json",
1264
+ "examples_doc": "runtime/lib/catalogs.mjs"
1265
+ },
1266
+ {
1267
+ "rule_id": "ISOLATED_UNIT_CONTEXT_REQUIRED_001",
1268
+ "owner": "assets/routing-load-policy.json",
1269
+ "applies_to": ["full app generation", "multi-page generation", "application capsule set"],
1270
+ "summary": "Each manifest unit must run in a fresh model context containing the plan, one unit capsule, its symbol projection, and necessary tool results only.",
1271
+ "required_load_when": ["complete app generation", "unit capsule generation"],
1272
+ "directives": ["Resolve a fresh task-specific context capsule for each implementation unit.", "Do not retain previous unit context."],
1273
+ "enforced_by": ["references/workflows/apex-generation/agents/20-agent-draft.md", "tools/apexctl.mjs"],
1274
+ "details_doc": "assets/routing-load-policy.json",
1275
+ "examples_doc": "references/workflows/apex-generation/agents/20-agent-draft.md"
1276
+ },
1277
+ {
1278
+ "rule_id": "STAGED_APPLICATION_VALIDATION_REQUIRED_001",
1279
+ "owner": "references/workflows/apexlang/workflow-create-app-from-fr-and-model.md",
1280
+ "applies_to": ["full app generation", "multi-page validation", "runtime validation"],
1281
+ "summary": "Use unit-local checks during generation, one full-app local/compiler integration pass after assembly, and one live validation after local success unless a repair changes the artifact.",
1282
+ "required_load_when": ["complete app validation", "multi-page generation"],
1283
+ "enforced_by": ["references/workflows/apex-generation/agents/30-agent-critique.md"],
1284
+ "details_doc": "references/workflows/apexlang/workflow-create-app-from-fr-and-model.md",
1285
+ "examples_doc": "references/workflows/apex-generation/agents/30-agent-critique.md"
1286
+ },
1287
+ {
1288
+ "rule_id": "VALIDATOR_REPAIR_RECIPE_REQUIRED_001",
1289
+ "owner": "assets/validator-fix-recipes.json",
1290
+ "applies_to": ["validation repair", "runtime repair", "lint repair"],
1291
+ "summary": "Validation findings must map to the exact rule ID, deterministic fix, owning guidance, and rerun evidence before revision.",
1292
+ "required_load_when": ["validator failure", "runtime failure", "problems.json repair", "lint repair"],
1293
+ "enforced_by": ["references/workflows/apex-generation/agents/40-agent-revision.md"],
1294
+ "details_doc": "assets/validator-fix-recipes.json",
1295
+ "examples_doc": "references/workflows/apex-generation/agents/40-agent-revision.md"
1296
+ }
1297
+ ]
1298
+ }