@salesforce/afv-skills 1.14.0 → 1.16.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 (365) hide show
  1. package/package.json +1 -1
  2. package/skills/activating-datacloud/SKILL.md +0 -1
  3. package/skills/analyzing-omnistudio-dependencies/SKILL.md +0 -1
  4. package/skills/applying-slds/SKILL.md +322 -0
  5. package/skills/applying-slds/checklists.md +83 -0
  6. package/skills/applying-slds/examples.md +283 -0
  7. package/skills/applying-slds/guidance/README.md +83 -0
  8. package/skills/applying-slds/guidance/blueprints-index.md +213 -0
  9. package/skills/applying-slds/guidance/icons-guidance.md +186 -0
  10. package/skills/applying-slds/guidance/overviews/borders.md +236 -0
  11. package/skills/applying-slds/guidance/overviews/color.md +266 -0
  12. package/skills/applying-slds/guidance/overviews/display-density.md +366 -0
  13. package/skills/applying-slds/guidance/overviews/icons.md +240 -0
  14. package/skills/applying-slds/guidance/overviews/illustrations.md +235 -0
  15. package/skills/applying-slds/guidance/overviews/shadows.md +176 -0
  16. package/skills/applying-slds/guidance/overviews/spacing.md +216 -0
  17. package/skills/applying-slds/guidance/overviews/typography.md +323 -0
  18. package/skills/applying-slds/guidance/overviews/utilities.md +542 -0
  19. package/skills/applying-slds/guidance/slds-development-guide.md +288 -0
  20. package/skills/applying-slds/guidance/styling-hooks/borders.md +202 -0
  21. package/skills/applying-slds/guidance/styling-hooks/color/expressive-palette-hooks.md +153 -0
  22. package/skills/applying-slds/guidance/styling-hooks/color/index.md +171 -0
  23. package/skills/applying-slds/guidance/styling-hooks/color/semantic/accent-hooks.md +204 -0
  24. package/skills/applying-slds/guidance/styling-hooks/color/semantic/feedback-hooks.md +768 -0
  25. package/skills/applying-slds/guidance/styling-hooks/color/semantic/surface-hooks.md +337 -0
  26. package/skills/applying-slds/guidance/styling-hooks/color/system-hooks.md +132 -0
  27. package/skills/applying-slds/guidance/styling-hooks/index.md +327 -0
  28. package/skills/applying-slds/guidance/styling-hooks/shadows.md +238 -0
  29. package/skills/applying-slds/guidance/styling-hooks/spacing.md +254 -0
  30. package/skills/applying-slds/guidance/styling-hooks/typography.md +448 -0
  31. package/skills/applying-slds/guidance/utilities/alignment.md +119 -0
  32. package/skills/applying-slds/guidance/utilities/borders.md +131 -0
  33. package/skills/applying-slds/guidance/utilities/box.md +125 -0
  34. package/skills/applying-slds/guidance/utilities/color.md +165 -0
  35. package/skills/applying-slds/guidance/utilities/dark-mode.md +111 -0
  36. package/skills/applying-slds/guidance/utilities/description-list.md +168 -0
  37. package/skills/applying-slds/guidance/utilities/floats.md +117 -0
  38. package/skills/applying-slds/guidance/utilities/grid.md +264 -0
  39. package/skills/applying-slds/guidance/utilities/horizontal-list.md +110 -0
  40. package/skills/applying-slds/guidance/utilities/hyphenation.md +84 -0
  41. package/skills/applying-slds/guidance/utilities/index.md +205 -0
  42. package/skills/applying-slds/guidance/utilities/interactions.md +89 -0
  43. package/skills/applying-slds/guidance/utilities/layout.md +109 -0
  44. package/skills/applying-slds/guidance/utilities/line-clamp.md +131 -0
  45. package/skills/applying-slds/guidance/utilities/margin.md +155 -0
  46. package/skills/applying-slds/guidance/utilities/media-object.md +161 -0
  47. package/skills/applying-slds/guidance/utilities/name-value-list.md +152 -0
  48. package/skills/applying-slds/guidance/utilities/padding.md +155 -0
  49. package/skills/applying-slds/guidance/utilities/position.md +177 -0
  50. package/skills/applying-slds/guidance/utilities/print.md +114 -0
  51. package/skills/applying-slds/guidance/utilities/scrollable.md +126 -0
  52. package/skills/applying-slds/guidance/utilities/sizing.md +190 -0
  53. package/skills/applying-slds/guidance/utilities/themes.md +121 -0
  54. package/skills/applying-slds/guidance/utilities/truncate.md +127 -0
  55. package/skills/applying-slds/guidance/utilities/typography.md +166 -0
  56. package/skills/applying-slds/guidance/utilities/vertical-list.md +166 -0
  57. package/skills/applying-slds/guidance/utilities/visibility.md +228 -0
  58. package/skills/applying-slds/metadata/README.md +84 -0
  59. package/skills/applying-slds/metadata/blueprints/components/accordion.yaml +304 -0
  60. package/skills/applying-slds/metadata/blueprints/components/activity-timeline.yaml +92 -0
  61. package/skills/applying-slds/metadata/blueprints/components/alert.yaml +103 -0
  62. package/skills/applying-slds/metadata/blueprints/components/app-launcher.yaml +94 -0
  63. package/skills/applying-slds/metadata/blueprints/components/avatar-group.yaml +81 -0
  64. package/skills/applying-slds/metadata/blueprints/components/avatar.yaml +97 -0
  65. package/skills/applying-slds/metadata/blueprints/components/badges.yaml +102 -0
  66. package/skills/applying-slds/metadata/blueprints/components/brand-band.yaml +198 -0
  67. package/skills/applying-slds/metadata/blueprints/components/breadcrumbs.yaml +95 -0
  68. package/skills/applying-slds/metadata/blueprints/components/builder-header.yaml +192 -0
  69. package/skills/applying-slds/metadata/blueprints/components/button-groups.yaml +82 -0
  70. package/skills/applying-slds/metadata/blueprints/components/button-icons.yaml +295 -0
  71. package/skills/applying-slds/metadata/blueprints/components/buttons.yaml +230 -0
  72. package/skills/applying-slds/metadata/blueprints/components/cards.yaml +124 -0
  73. package/skills/applying-slds/metadata/blueprints/components/carousel.yaml +140 -0
  74. package/skills/applying-slds/metadata/blueprints/components/chat.yaml +179 -0
  75. package/skills/applying-slds/metadata/blueprints/components/checkbox-button-group.yaml +192 -0
  76. package/skills/applying-slds/metadata/blueprints/components/checkbox-button.yaml +204 -0
  77. package/skills/applying-slds/metadata/blueprints/components/checkbox-toggle.yaml +177 -0
  78. package/skills/applying-slds/metadata/blueprints/components/checkbox.yaml +108 -0
  79. package/skills/applying-slds/metadata/blueprints/components/color-picker.yaml +172 -0
  80. package/skills/applying-slds/metadata/blueprints/components/combobox.yaml +136 -0
  81. package/skills/applying-slds/metadata/blueprints/components/counter.yaml +147 -0
  82. package/skills/applying-slds/metadata/blueprints/components/data-tables.yaml +157 -0
  83. package/skills/applying-slds/metadata/blueprints/components/datepickers.yaml +130 -0
  84. package/skills/applying-slds/metadata/blueprints/components/datetime-picker.yaml +155 -0
  85. package/skills/applying-slds/metadata/blueprints/components/docked-composer.yaml +201 -0
  86. package/skills/applying-slds/metadata/blueprints/components/docked-form-footer.yaml +161 -0
  87. package/skills/applying-slds/metadata/blueprints/components/docked-utility-bar.yaml +175 -0
  88. package/skills/applying-slds/metadata/blueprints/components/drop-zone.yaml +115 -0
  89. package/skills/applying-slds/metadata/blueprints/components/dueling-picklist.yaml +196 -0
  90. package/skills/applying-slds/metadata/blueprints/components/dynamic-icons.yaml +128 -0
  91. package/skills/applying-slds/metadata/blueprints/components/dynamic-menu.yaml +141 -0
  92. package/skills/applying-slds/metadata/blueprints/components/expandable-section.yaml +115 -0
  93. package/skills/applying-slds/metadata/blueprints/components/expression.yaml +143 -0
  94. package/skills/applying-slds/metadata/blueprints/components/feeds.yaml +125 -0
  95. package/skills/applying-slds/metadata/blueprints/components/file-selector.yaml +154 -0
  96. package/skills/applying-slds/metadata/blueprints/components/files.yaml +119 -0
  97. package/skills/applying-slds/metadata/blueprints/components/form-element.yaml +145 -0
  98. package/skills/applying-slds/metadata/blueprints/components/global-header.yaml +120 -0
  99. package/skills/applying-slds/metadata/blueprints/components/global-navigation.yaml +100 -0
  100. package/skills/applying-slds/metadata/blueprints/components/icons.yaml +138 -0
  101. package/skills/applying-slds/metadata/blueprints/components/illustration.yaml +205 -0
  102. package/skills/applying-slds/metadata/blueprints/components/input.yaml +151 -0
  103. package/skills/applying-slds/metadata/blueprints/components/list-builder.yaml +127 -0
  104. package/skills/applying-slds/metadata/blueprints/components/lookups.yaml +132 -0
  105. package/skills/applying-slds/metadata/blueprints/components/map.yaml +118 -0
  106. package/skills/applying-slds/metadata/blueprints/components/menus.yaml +134 -0
  107. package/skills/applying-slds/metadata/blueprints/components/modals.yaml +152 -0
  108. package/skills/applying-slds/metadata/blueprints/components/notifications.yaml +88 -0
  109. package/skills/applying-slds/metadata/blueprints/components/page-headers.yaml +135 -0
  110. package/skills/applying-slds/metadata/blueprints/components/panels.yaml +149 -0
  111. package/skills/applying-slds/metadata/blueprints/components/path.yaml +154 -0
  112. package/skills/applying-slds/metadata/blueprints/components/picklist.yaml +125 -0
  113. package/skills/applying-slds/metadata/blueprints/components/pills.yaml +154 -0
  114. package/skills/applying-slds/metadata/blueprints/components/popovers.yaml +120 -0
  115. package/skills/applying-slds/metadata/blueprints/components/progress-bar.yaml +110 -0
  116. package/skills/applying-slds/metadata/blueprints/components/progress-indicator.yaml +133 -0
  117. package/skills/applying-slds/metadata/blueprints/components/progress-ring.yaml +102 -0
  118. package/skills/applying-slds/metadata/blueprints/components/prompt.yaml +126 -0
  119. package/skills/applying-slds/metadata/blueprints/components/publishers.yaml +178 -0
  120. package/skills/applying-slds/metadata/blueprints/components/radio-button-group.yaml +172 -0
  121. package/skills/applying-slds/metadata/blueprints/components/radio-group.yaml +112 -0
  122. package/skills/applying-slds/metadata/blueprints/components/rich-text-editor.yaml +135 -0
  123. package/skills/applying-slds/metadata/blueprints/components/scoped-notifications.yaml +188 -0
  124. package/skills/applying-slds/metadata/blueprints/components/scoped-tabs.yaml +97 -0
  125. package/skills/applying-slds/metadata/blueprints/components/select.yaml +127 -0
  126. package/skills/applying-slds/metadata/blueprints/components/setup-assistant.yaml +152 -0
  127. package/skills/applying-slds/metadata/blueprints/components/slider.yaml +111 -0
  128. package/skills/applying-slds/metadata/blueprints/components/spinners.yaml +135 -0
  129. package/skills/applying-slds/metadata/blueprints/components/split-view.yaml +112 -0
  130. package/skills/applying-slds/metadata/blueprints/components/summary-detail.yaml +103 -0
  131. package/skills/applying-slds/metadata/blueprints/components/tabs.yaml +138 -0
  132. package/skills/applying-slds/metadata/blueprints/components/textarea.yaml +116 -0
  133. package/skills/applying-slds/metadata/blueprints/components/tiles.yaml +108 -0
  134. package/skills/applying-slds/metadata/blueprints/components/timepicker.yaml +111 -0
  135. package/skills/applying-slds/metadata/blueprints/components/toast.yaml +154 -0
  136. package/skills/applying-slds/metadata/blueprints/components/tooltips.yaml +107 -0
  137. package/skills/applying-slds/metadata/blueprints/components/tree-grid.yaml +116 -0
  138. package/skills/applying-slds/metadata/blueprints/components/trees.yaml +116 -0
  139. package/skills/applying-slds/metadata/blueprints/components/trial-bar.yaml +112 -0
  140. package/skills/applying-slds/metadata/blueprints/components/vertical-navigation.yaml +130 -0
  141. package/skills/applying-slds/metadata/blueprints/components/vertical-tabs.yaml +140 -0
  142. package/skills/applying-slds/metadata/blueprints/components/visual-picker.yaml +150 -0
  143. package/skills/applying-slds/metadata/blueprints/components/welcome-mat.yaml +136 -0
  144. package/skills/applying-slds/metadata/hooks-index.json +6272 -0
  145. package/skills/applying-slds/metadata/icon-metadata.json +38466 -0
  146. package/skills/applying-slds/metadata/utilities-index.json +21912 -0
  147. package/skills/applying-slds/references/component-selection.md +112 -0
  148. package/skills/applying-slds/references/icons-decision-guide.md +124 -0
  149. package/skills/applying-slds/references/styling-decision-guide.md +228 -0
  150. package/skills/applying-slds/references/utilities-quick-ref.md +125 -0
  151. package/skills/applying-slds/scripts/search-blueprints.cjs +117 -0
  152. package/skills/applying-slds/scripts/search-hooks.cjs +139 -0
  153. package/skills/applying-slds/scripts/search-icons.cjs +174 -0
  154. package/skills/applying-slds/scripts/search-utilities.cjs +161 -0
  155. package/skills/building-mobile-apps/SKILL.md +0 -1
  156. package/skills/building-omnistudio-callable-apex/SKILL.md +0 -1
  157. package/skills/building-omnistudio-datamapper/SKILL.md +0 -1
  158. package/skills/building-omnistudio-flexcard/SKILL.md +0 -1
  159. package/skills/building-omnistudio-integration-procedure/SKILL.md +0 -1
  160. package/skills/building-omnistudio-omniscript/SKILL.md +0 -1
  161. package/skills/building-sf-integrations/SKILL.md +0 -1
  162. package/skills/configuring-connected-apps/SKILL.md +0 -1
  163. package/skills/connecting-datacloud/SKILL.md +0 -1
  164. package/skills/creating-b2b-commerce-store/SKILL.md +0 -1
  165. package/skills/debugging-apex-logs/SKILL.md +0 -1
  166. package/skills/deploying-metadata/SKILL.md +0 -1
  167. package/skills/deploying-omnistudio-datapacks/SKILL.md +0 -1
  168. package/skills/developing-agentforce/SKILL.md +0 -1
  169. package/skills/fetching-salesforce-docs/SKILL.md +0 -1
  170. package/skills/generating-custom-lightning-type/SKILL.md +17 -39
  171. package/skills/generating-custom-lightning-type/assets/primitive-types-and-constraints.md +41 -0
  172. package/skills/generating-custom-lightning-type/references/widget-rendition.md +124 -0
  173. package/skills/generating-lwc-components/SKILL.md +0 -1
  174. package/skills/generating-mermaid-diagrams/SKILL.md +0 -1
  175. package/skills/generating-visual-diagrams/SKILL.md +0 -1
  176. package/skills/handling-sf-data/SKILL.md +0 -1
  177. package/skills/harmonizing-datacloud/SKILL.md +0 -1
  178. package/skills/integrating-b2b-commerce-open-code-components/SKILL.md +0 -1
  179. package/skills/investigating-agentforce-architecture/README.md +156 -0
  180. package/skills/investigating-agentforce-architecture/SKILL.md +230 -0
  181. package/skills/investigating-agentforce-architecture/assets/cli/describe_sobject.yaml +16 -0
  182. package/skills/investigating-agentforce-architecture/assets/cli/describe_tooling_sobject.yaml +17 -0
  183. package/skills/investigating-agentforce-architecture/assets/cli/list_metadata_genaiprompttemplate.yaml +17 -0
  184. package/skills/investigating-agentforce-architecture/assets/cli/org_display.yaml +15 -0
  185. package/skills/investigating-agentforce-architecture/assets/cli/retrieve_genai_plugin.yaml +18 -0
  186. package/skills/investigating-agentforce-architecture/assets/cli/show_access_token.yaml +27 -0
  187. package/skills/investigating-agentforce-architecture/assets/mermaid/action_tree.mmd +20 -0
  188. package/skills/investigating-agentforce-architecture/assets/mermaid/data_flow.mmd +19 -0
  189. package/skills/investigating-agentforce-architecture/assets/mermaid/dependency_graph.mmd +19 -0
  190. package/skills/investigating-agentforce-architecture/assets/mermaid/invocation_sequence.mmd +20 -0
  191. package/skills/investigating-agentforce-architecture/assets/mermaid/planner_state.mmd +18 -0
  192. package/skills/investigating-agentforce-architecture/assets/soql/apex_class_bodies_by_ids.soql +3 -0
  193. package/skills/investigating-agentforce-architecture/assets/soql/apex_class_bodies_by_names.soql +3 -0
  194. package/skills/investigating-agentforce-architecture/assets/soql/bot_definition_details.soql +3 -0
  195. package/skills/investigating-agentforce-architecture/assets/soql/bot_version_lookup.soql +4 -0
  196. package/skills/investigating-agentforce-architecture/assets/soql/flow_definition_by_ids.soql +3 -0
  197. package/skills/investigating-agentforce-architecture/assets/soql/flow_definition_ids_by_names.soql +3 -0
  198. package/skills/investigating-agentforce-architecture/assets/soql/flow_definition_view_by_durable_ids.soql +4 -0
  199. package/skills/investigating-agentforce-architecture/assets/soql/flow_metadata_by_id.soql +3 -0
  200. package/skills/investigating-agentforce-architecture/assets/soql/functions_by_plugins.soql +5 -0
  201. package/skills/investigating-agentforce-architecture/assets/soql/planner_attrs_by_parent_ids.soql +3 -0
  202. package/skills/investigating-agentforce-architecture/assets/soql/planner_bundle_functions.soql +3 -0
  203. package/skills/investigating-agentforce-architecture/assets/soql/planner_definition_by_agent_chain.soql +3 -0
  204. package/skills/investigating-agentforce-architecture/assets/soql/plugin_functions_by_plugin_ids.soql +3 -0
  205. package/skills/investigating-agentforce-architecture/assets/soql/plugin_instructions_by_plugin_ids.soql +3 -0
  206. package/skills/investigating-agentforce-architecture/assets/soql/plugins_by_planner.soql +4 -0
  207. package/skills/investigating-agentforce-architecture/references/architecture_sections.md +243 -0
  208. package/skills/investigating-agentforce-architecture/references/contract.json +244 -0
  209. package/skills/investigating-agentforce-architecture/references/soql_fields.md +512 -0
  210. package/skills/investigating-agentforce-architecture/scripts/_shared/__init__.py +1 -0
  211. package/skills/investigating-agentforce-architecture/scripts/_shared/fs_guard.py +329 -0
  212. package/skills/investigating-agentforce-architecture/scripts/_shared/paths.py +110 -0
  213. package/skills/investigating-agentforce-architecture/scripts/_shared/runtime.py +59 -0
  214. package/skills/investigating-agentforce-architecture/scripts/_shared/sql.py +10 -0
  215. package/skills/investigating-agentforce-architecture/scripts/cache_check.py +234 -0
  216. package/skills/investigating-agentforce-architecture/scripts/config.py +131 -0
  217. package/skills/investigating-agentforce-architecture/scripts/fetch_soql.py +689 -0
  218. package/skills/investigating-agentforce-architecture/scripts/finalize.py +295 -0
  219. package/skills/investigating-agentforce-architecture/scripts/main.py +2835 -0
  220. package/skills/investigating-agentforce-architecture/scripts/metadata_listing.py +265 -0
  221. package/skills/investigating-agentforce-architecture/scripts/parallel_retrieve.py +69 -0
  222. package/skills/investigating-agentforce-architecture/scripts/parse_bundle.py +215 -0
  223. package/skills/investigating-agentforce-architecture/scripts/parse_wave.py +845 -0
  224. package/skills/investigating-agentforce-architecture/scripts/probe_channels.py +302 -0
  225. package/skills/investigating-agentforce-architecture/scripts/render_architecture.py +1043 -0
  226. package/skills/investigating-agentforce-architecture/scripts/resolve_bot.py +255 -0
  227. package/skills/investigating-agentforce-architecture/scripts/resolve_invocation_target.py +130 -0
  228. package/skills/investigating-agentforce-architecture/scripts/rest_client.py +763 -0
  229. package/skills/investigating-agentforce-architecture/scripts/retrieve_planner.py +13 -0
  230. package/skills/investigating-agentforce-architecture/scripts/sf_cli.py +242 -0
  231. package/skills/investigating-agentforce-architecture/scripts/soql_loader.py +253 -0
  232. package/skills/investigating-agentforce-architecture/scripts/summarize_tree.py +143 -0
  233. package/skills/investigating-agentforce-architecture/scripts/tests/__init__.py +0 -0
  234. package/skills/investigating-agentforce-architecture/scripts/tests/_bootstrap.py +23 -0
  235. package/skills/investigating-agentforce-architecture/scripts/tests/fixtures/__init__.py +0 -0
  236. package/skills/investigating-agentforce-architecture/scripts/tests/fixtures/genai_payloads.py +400 -0
  237. package/skills/investigating-agentforce-architecture/scripts/tests/test_cache_check.py +307 -0
  238. package/skills/investigating-agentforce-architecture/scripts/tests/test_cache_check_main.py +283 -0
  239. package/skills/investigating-agentforce-architecture/scripts/tests/test_config.py +115 -0
  240. package/skills/investigating-agentforce-architecture/scripts/tests/test_end_to_end_fixture.py +651 -0
  241. package/skills/investigating-agentforce-architecture/scripts/tests/test_finalize.py +278 -0
  242. package/skills/investigating-agentforce-architecture/scripts/tests/test_flow_children_inflation.py +582 -0
  243. package/skills/investigating-agentforce-architecture/scripts/tests/test_fs_guard.py +113 -0
  244. package/skills/investigating-agentforce-architecture/scripts/tests/test_iterative_wave_b.py +478 -0
  245. package/skills/investigating-agentforce-architecture/scripts/tests/test_main_pipeline.py +3359 -0
  246. package/skills/investigating-agentforce-architecture/scripts/tests/test_parallel_retrieve.py +131 -0
  247. package/skills/investigating-agentforce-architecture/scripts/tests/test_parse_bundle.py +400 -0
  248. package/skills/investigating-agentforce-architecture/scripts/tests/test_parse_wave.py +644 -0
  249. package/skills/investigating-agentforce-architecture/scripts/tests/test_parse_wave_classifiers.py +224 -0
  250. package/skills/investigating-agentforce-architecture/scripts/tests/test_parse_wave_helpers.py +380 -0
  251. package/skills/investigating-agentforce-architecture/scripts/tests/test_parse_wave_main.py +397 -0
  252. package/skills/investigating-agentforce-architecture/scripts/tests/test_per_branch_visited.py +244 -0
  253. package/skills/investigating-agentforce-architecture/scripts/tests/test_probe_channels.py +359 -0
  254. package/skills/investigating-agentforce-architecture/scripts/tests/test_probe_cli_recipes.py +185 -0
  255. package/skills/investigating-agentforce-architecture/scripts/tests/test_render_architecture.py +810 -0
  256. package/skills/investigating-agentforce-architecture/scripts/tests/test_resolve_bot.py +203 -0
  257. package/skills/investigating-agentforce-architecture/scripts/tests/test_resolve_creds.py +157 -0
  258. package/skills/investigating-agentforce-architecture/scripts/tests/test_resolve_invocation_target.py +145 -0
  259. package/skills/investigating-agentforce-architecture/scripts/tests/test_rest_client.py +1253 -0
  260. package/skills/investigating-agentforce-architecture/scripts/tests/test_runtime_override.py +100 -0
  261. package/skills/investigating-agentforce-architecture/scripts/tests/test_sf_cli.py +261 -0
  262. package/skills/investigating-agentforce-architecture/scripts/tests/test_signature_stamping.py +466 -0
  263. package/skills/investigating-agentforce-architecture/scripts/tests/test_soql_loader.py +501 -0
  264. package/skills/investigating-agentforce-architecture/scripts/tests/test_summarize_tree.py +241 -0
  265. package/skills/investigating-agentforce-architecture/scripts/tests/test_write_emit_ctx.py +480 -0
  266. package/skills/investigating-agentforce-architecture/tools/emit_env.py +157 -0
  267. package/skills/investigating-agentforce-architecture/tools/emit_result.py +262 -0
  268. package/skills/investigating-agentforce-architecture/tools/sanitize.py +33 -0
  269. package/skills/investigating-agentforce-architecture/tools/write_emit_ctx.py +332 -0
  270. package/skills/investigating-agentforce-d360/README.md +123 -0
  271. package/skills/investigating-agentforce-d360/SKILL.md +163 -0
  272. package/skills/investigating-agentforce-d360/assets/dc/app_generation.sql +51 -0
  273. package/skills/investigating-agentforce-d360/assets/dc/content_category.sql +44 -0
  274. package/skills/investigating-agentforce-d360/assets/dc/content_quality.sql +41 -0
  275. package/skills/investigating-agentforce-d360/assets/dc/discover_sessions.sql +36 -0
  276. package/skills/investigating-agentforce-d360/assets/dc/feedback.sql +47 -0
  277. package/skills/investigating-agentforce-d360/assets/dc/feedback_details.sql +38 -0
  278. package/skills/investigating-agentforce-d360/assets/dc/gateway_records.sql +45 -0
  279. package/skills/investigating-agentforce-d360/assets/dc/gateway_request_llm.sql +50 -0
  280. package/skills/investigating-agentforce-d360/assets/dc/gateway_request_metadata.sql +44 -0
  281. package/skills/investigating-agentforce-d360/assets/dc/gateway_request_tags.sql +42 -0
  282. package/skills/investigating-agentforce-d360/assets/dc/gateway_requests.sql +89 -0
  283. package/skills/investigating-agentforce-d360/assets/dc/gateway_responses.sql +43 -0
  284. package/skills/investigating-agentforce-d360/assets/dc/generations.sql +52 -0
  285. package/skills/investigating-agentforce-d360/assets/dc/interactions.sql +53 -0
  286. package/skills/investigating-agentforce-d360/assets/dc/messages.sql +53 -0
  287. package/skills/investigating-agentforce-d360/assets/dc/messaging_session.sql +37 -0
  288. package/skills/investigating-agentforce-d360/assets/dc/moment_interactions.sql +34 -0
  289. package/skills/investigating-agentforce-d360/assets/dc/moments.sql +39 -0
  290. package/skills/investigating-agentforce-d360/assets/dc/participants.sql +48 -0
  291. package/skills/investigating-agentforce-d360/assets/dc/sessions.sql +78 -0
  292. package/skills/investigating-agentforce-d360/assets/dc/steps.sql +64 -0
  293. package/skills/investigating-agentforce-d360/assets/dc/tag_associations.sql +46 -0
  294. package/skills/investigating-agentforce-d360/assets/dc/tag_definition_associations.sql +37 -0
  295. package/skills/investigating-agentforce-d360/assets/dc/tag_definitions.sql +50 -0
  296. package/skills/investigating-agentforce-d360/assets/dc/tags.sql +37 -0
  297. package/skills/investigating-agentforce-d360/assets/dc/telemetry_spans.sql +55 -0
  298. package/skills/investigating-agentforce-d360/references/artifacts.md +50 -0
  299. package/skills/investigating-agentforce-d360/references/dc_dmo_fields.md +823 -0
  300. package/skills/investigating-agentforce-d360/references/dc_pipeline_contract.md +608 -0
  301. package/skills/investigating-agentforce-d360/scripts/_shared/__init__.py +2 -0
  302. package/skills/investigating-agentforce-d360/scripts/_shared/cli_override.py +98 -0
  303. package/skills/investigating-agentforce-d360/scripts/_shared/fs_guard.py +334 -0
  304. package/skills/investigating-agentforce-d360/scripts/_shared/paths.py +155 -0
  305. package/skills/investigating-agentforce-d360/scripts/_shared/runtime.py +59 -0
  306. package/skills/investigating-agentforce-d360/scripts/_shared/sql.py +14 -0
  307. package/skills/investigating-agentforce-d360/scripts/assemble_dc.py +1624 -0
  308. package/skills/investigating-agentforce-d360/scripts/config.py +45 -0
  309. package/skills/investigating-agentforce-d360/scripts/dc.py +188 -0
  310. package/skills/investigating-agentforce-d360/scripts/discover_sessions.py +556 -0
  311. package/skills/investigating-agentforce-d360/scripts/fetch_dc.py +1045 -0
  312. package/skills/investigating-agentforce-d360/scripts/render_dc.py +1750 -0
  313. package/skills/investigating-agentforce-d360/scripts/resolve_session.py +264 -0
  314. package/skills/investigating-agentforce-d360/scripts/storage.py +92 -0
  315. package/skills/investigating-agentforce-d360/scripts/tests/__init__.py +0 -0
  316. package/skills/investigating-agentforce-d360/scripts/tests/_bootstrap.py +15 -0
  317. package/skills/investigating-agentforce-d360/scripts/tests/fixtures/__init__.py +0 -0
  318. package/skills/investigating-agentforce-d360/scripts/tests/fixtures/synthetic_session.py +424 -0
  319. package/skills/investigating-agentforce-d360/scripts/tests/test_assemble_dc_bootstrap_and_mode.py +115 -0
  320. package/skills/investigating-agentforce-d360/scripts/tests/test_assemble_dc_gateway_direct.py +220 -0
  321. package/skills/investigating-agentforce-d360/scripts/tests/test_assemble_dc_gateway_direct_integration.py +158 -0
  322. package/skills/investigating-agentforce-d360/scripts/tests/test_assemble_dc_helpers.py +287 -0
  323. package/skills/investigating-agentforce-d360/scripts/tests/test_assemble_dc_integration.py +247 -0
  324. package/skills/investigating-agentforce-d360/scripts/tests/test_dc_and_resolve_session.py +433 -0
  325. package/skills/investigating-agentforce-d360/scripts/tests/test_discover_sessions.py +458 -0
  326. package/skills/investigating-agentforce-d360/scripts/tests/test_discover_sessions_grep_ci.py +193 -0
  327. package/skills/investigating-agentforce-d360/scripts/tests/test_fetch_dc_helpers.py +266 -0
  328. package/skills/investigating-agentforce-d360/scripts/tests/test_fetch_dc_identity.py +528 -0
  329. package/skills/investigating-agentforce-d360/scripts/tests/test_fetch_dc_main.py +251 -0
  330. package/skills/investigating-agentforce-d360/scripts/tests/test_fetch_dc_waterfall.py +229 -0
  331. package/skills/investigating-agentforce-d360/scripts/tests/test_fetch_dc_waterfall_full.py +283 -0
  332. package/skills/investigating-agentforce-d360/scripts/tests/test_identity_coherence.py +327 -0
  333. package/skills/investigating-agentforce-d360/scripts/tests/test_render_dc_branches.py +256 -0
  334. package/skills/investigating-agentforce-d360/scripts/tests/test_render_dc_gateway_direct.py +130 -0
  335. package/skills/investigating-agentforce-d360/scripts/tests/test_render_dc_helpers.py +291 -0
  336. package/skills/investigating-agentforce-d360/scripts/tests/test_render_dc_integration.py +220 -0
  337. package/skills/investigating-agentforce-d360/scripts/tests/test_render_dc_planner_llm_calls.py +284 -0
  338. package/skills/investigating-agentforce-d360/scripts/tests/test_render_dc_show_prompts_gating.py +215 -0
  339. package/skills/investigating-agentforce-d360/scripts/tests/test_resolve_from_disk.py +100 -0
  340. package/skills/investigating-agentforce-d360/scripts/tests/test_resolve_session_main.py +149 -0
  341. package/skills/investigating-agentforce-d360/scripts/tests/test_runtime_override.py +104 -0
  342. package/skills/investigating-agentforce-d360/scripts/tests/test_session_shape.py +95 -0
  343. package/skills/investigating-agentforce-d360/scripts/tests/test_session_shape_dropped_by_stdm.py +85 -0
  344. package/skills/managing-managed-event-subscription/SKILL.md +152 -0
  345. package/skills/managing-managed-event-subscription/assets/managed-event-subscription-template.xml +20 -0
  346. package/skills/managing-managed-event-subscription/references/delete-guide.md +57 -0
  347. package/skills/managing-managed-event-subscription/references/topic-name-formats.md +26 -0
  348. package/skills/managing-managed-event-subscription/references/update-constraints.md +30 -0
  349. package/skills/modeling-omnistudio-epc-catalog/SKILL.md +0 -1
  350. package/skills/observing-agentforce/SKILL.md +0 -1
  351. package/skills/orchestrating-datacloud/SKILL.md +0 -1
  352. package/skills/preparing-datacloud/SKILL.md +0 -1
  353. package/skills/querying-soql/SKILL.md +0 -1
  354. package/skills/retrieving-datacloud/SKILL.md +0 -1
  355. package/skills/running-apex-tests/SKILL.md +0 -1
  356. package/skills/running-code-analyzer/SKILL.md +0 -1
  357. package/skills/segmenting-datacloud/SKILL.md +0 -1
  358. package/skills/testing-agentforce/SKILL.md +0 -1
  359. package/skills/uplifting-components-to-slds2/SKILL.md +3 -2
  360. package/skills/uplifting-components-to-slds2/references/color-hooks-decision-guide.md +30 -9
  361. package/skills/uplifting-components-to-slds2/references/examples.md +24 -6
  362. package/skills/validating-slds/SKILL.md +262 -0
  363. package/skills/validating-slds/references/quality-checks.md +308 -0
  364. package/skills/validating-slds/references/report-format.md +302 -0
  365. package/skills/validating-slds/scripts/analyze-quality.cjs +521 -0
@@ -0,0 +1,608 @@
1
+ # DC Pipeline Contract
2
+
3
+ The DC pipeline for a single Agentforce session runs as three stages in
4
+ sequence:
5
+
6
+ ```
7
+ fetch_dc.py → 24 dc.<name>.json artifacts + dc._session_manifest.json
8
+ assemble_dc.py → dc._session_tree.json (pure in-memory join)
9
+ render_dc.py → dc._session_summary.md (pure tree reader)
10
+ ```
11
+
12
+ Each stage is independently runnable. `fetch_dc.py` chains the two
13
+ downstream stages by default; `--no-assemble` / `--no-render` opt out of
14
+ each. The renderer can also run standalone against a tree produced by a
15
+ prior invocation.
16
+
17
+ This document owns the shape + invariants of stages 2 and 3. For per-DMO
18
+ field reference of what stage 1 produces, see
19
+ [`dc_dmo_fields.md`](./dc_dmo_fields.md).
20
+
21
+ ---
22
+
23
+ ## 1. Pipeline overview
24
+
25
+ | Stage | Script | Input | Output | Scope |
26
+ |---|---|---|---|---|
27
+ | Fetch | `scripts/fetch_dc.py` | org + session id | 24 `dc.<name>.json` + `dc._session_manifest.json` | DC Query REST API, 5-wave waterfall |
28
+ | Assemble | `scripts/assemble_dc.py` | fetch outputs | `dc._session_tree.json` | pure in-memory join, no fetches |
29
+ | Render | `scripts/render_dc.py` | tree + manifest | `dc._session_summary.md` | pure tree reader, no DMO loads |
30
+
31
+ Nothing downstream of fetch issues DC queries. Everything after fetch is
32
+ pure compute over files on disk, which means the renderer can iterate
33
+ on markdown format without re-fetching.
34
+
35
+ ---
36
+
37
+ ## 2. Assembly stage
38
+
39
+ `scripts/assemble_dc.py` joins the fetched DC rows into a hierarchical
40
+ tree.
41
+
42
+ ### 2.1 Purpose + scope
43
+
44
+ **Inputs:** 24 `dc.<name>.json` artifacts + `dc._session_manifest.json`
45
+ produced by `scripts/fetch_dc.py`, under `DATA_ROOT/<sid>/`.
46
+
47
+ **Output:** `dc._session_tree.json` — session-rooted hierarchical view.
48
+ Interaction → Step → Generation → GatewayRequest; audit rows (Tag,
49
+ ObjRecord, Metadata, LLM, Quality, Category, Feedback, FeedbackDetail)
50
+ nested under the right parent.
51
+
52
+ **Contract:** pure in-memory compute, no new DMO queries, forward-only
53
+ joins on already-fetched rows. Chain-orphan GW calls fall through to a
54
+ timestamp-window rule with an explicit `binding_method` flag.
55
+
56
+ ### 2.2 Inputs
57
+
58
+ The assembler does **not** hard-code the 24 template names. It reads
59
+ `dc._session_manifest.json` first, then iterates
60
+ `manifest["queries"][*]["name"]` to populate the row map. When
61
+ `fetch_dc.py` adds a 25th template, the row loader picks it up
62
+ automatically — the tree logic only references names it knows how to
63
+ place, so a new DMO is loaded but not rendered until the assembler is
64
+ taught what to do with it.
65
+
66
+ Per-field schema for every DMO lives in
67
+ [`dc_dmo_fields.md`](./dc_dmo_fields.md).
68
+
69
+ ### 2.3 Declared binding chain
70
+
71
+ The "normal" path that nests a `GatewayRequest` under its owning
72
+ `LLM_STEP` in the tree. Every edge is a platform-sanctioned forward FK:
73
+
74
+ ```
75
+ Step.ssot__GenerationId__c → Generation.generationId__c
76
+ Generation.generationResponseId__c → GatewayResponse.generationResponseId__c
77
+ GatewayResponse.generationRequestId__c → GatewayRequest.gatewayRequestId__c
78
+ ```
79
+
80
+ **Which Step types populate `ssot__GenerationId__c`?** Only `LLM_STEP`
81
+ (verified live). `ACTION_STEP`, `TOPIC_STEP`, `TRUST_GUARDRAILS_STEP`,
82
+ and `SESSION_END` always have `NOT_SET` here; the chain never resolves
83
+ for them.
84
+
85
+ **Expected declared-share on typical Agentforce sessions:** minority.
86
+ Most gateway calls on a real session land via the timestamp-window
87
+ fallback, not the declared chain. Sessions that rely on Flow-invoked
88
+ prompt-template actions produce zero declared bindings and many
89
+ timestamp_window bindings — normal, not a defect.
90
+
91
+ ### 2.4 Timestamp-window fallback
92
+
93
+ Any `GatewayRequest` not reached via the declared chain is placed by
94
+ timestamp containment.
95
+
96
+ **Window semantics:**
97
+ - **Closed-closed:** `start_ts <= gw_req.timestamp__c <= end_ts`.
98
+ - **Null end_ts** (active session / interaction / step) is treated as
99
+ `+∞`.
100
+ - **Missing start_ts**: fall through to the next preference tier; never
101
+ match on start alone.
102
+ - Boundary ties bind to the earlier parent (Step) in preference to the
103
+ later one (Interaction).
104
+
105
+ **Tier dominates containment.** Selection order is:
106
+
107
+ 1. Find all Step windows containing the GW timestamp.
108
+ 2. Restrict to the highest-preference tier present: `ACTION_STEP` →
109
+ `TOPIC_STEP` → `TRUST_GUARDRAILS_STEP` → any other (catch-all:
110
+ LLM_STEP without declared binding, SESSION_END, unknown types —
111
+ never excluded).
112
+ 3. Among those, pick the innermost (shortest-window) Step.
113
+ 4. On exact window-size ties, pick the latest `start_ts`.
114
+
115
+ Example: if both a wide `ACTION_STEP` and a narrower nested `TOPIC_STEP`
116
+ contain the GW timestamp, the `ACTION_STEP` wins because its tier
117
+ dominates — even though TOPIC is innermost.
118
+
119
+ **Placement fallbacks:**
120
+ - If no Step window matches, attach to the enclosing `Interaction` as a
121
+ `timestamp_bound_gateway_calls[]` entry (`bound_to_step_id` is null).
122
+ - If no Interaction window matches, land in
123
+ `session.unbound_gateway_calls[]`.
124
+
125
+ **Never declared-bound twice.** A Step that already owns a GW via the
126
+ declared chain is excluded from timestamp-window candidates.
127
+
128
+ ### 2.5 `binding_method` enum
129
+
130
+ Every GatewayRequest in the tree carries exactly one of these:
131
+
132
+ | Value | When emitted |
133
+ |---|---|
134
+ | `declared` | Placed under a Step via the declared chain in §2.3. |
135
+ | `timestamp_window` | Placed by §2.4 (under a Step or an Interaction). |
136
+ | `unbound` | Neither chain nor window matched; landed in `session.unbound_gateway_calls[]`. |
137
+
138
+ **Collision handling.** When two Steps' Generation chains resolve to
139
+ the same GatewayRequest (`Step.ssot__GenerationId__c` collisions at the
140
+ upstream DMO), first-step-wins: the earlier Step in walk order claims
141
+ the GW. Subsequent Steps get `"gateway_request": null` with an adjacent
142
+ `"gateway_request_collision": true` marker on the Step view, so readers
143
+ can see why the GW is absent. The session-level
144
+ `counts.gw_binding.declared_collisions` integer tracks the aggregate.
145
+ On observed data this is 0; non-zero values indicate a real defect in
146
+ the upstream DMO writers.
147
+
148
+ ### 2.6 Moment placement
149
+
150
+ `session.moments[]` lives at the root of the session, not nested under
151
+ `Interaction`. Each moment carries `interaction_ids[]`, a sorted list
152
+ derived from `MomentInteraction` (the junction table). Rationale: the
153
+ schema supports many-to-many (one moment can span multiple
154
+ interactions; one interaction can belong to multiple moments), even
155
+ though observed live data is 1:N. Nesting under Interaction would
156
+ duplicate rows.
157
+
158
+ Moments are absent on orgs without Agent Optimization enabled; the
159
+ assembler never requires their presence.
160
+
161
+ ### 2.7 1:1 audit chain invariant
162
+
163
+ For every `GatewayRequest` in the session, exactly one
164
+ `GatewayResponse` exists (in live data, modulo in-flight calls at
165
+ fetch time). `counts.audit_chain_1to1_ok` is `true` iff
166
+ `len(gateway_requests) == len(gateway_responses)`. Drift is flagged in
167
+ the counts block but does not crash the assembler — a caller
168
+ re-fetching during an active session can still produce a partial tree.
169
+
170
+ Note: this is Req↔Resp 1:1, not Req↔LLM_STEP. The typical session has
171
+ more GatewayRequests than LLM_STEPs because prompt-template /
172
+ plannerservice calls emit GatewayRequest rows without owning Step rows.
173
+
174
+ ### 2.8 `session_shape` enum
175
+
176
+ Lifted verbatim from `dc._session_manifest.json.session_shape` into
177
+ `dc._session_tree.json counts.session_shape`. Six values, classified
178
+ by `fetch_dc.py` after the 5-wave waterfall; rules evaluated
179
+ top-to-bottom, first match wins:
180
+
181
+ | Value | Rule | Added |
182
+ |---|---|---|
183
+ | `session_not_found` | `sessions.json` returned 0 rows (bad sid or STDM not yet materialized) | original |
184
+ | `interactions_not_materialized_yet` | sessions row present, but interactions/steps/messages all 0 (fresh session — STDM hierarchy hasn't materialized yet, but gateway_requests may exist) — assembler takes the gateway-direct path; see §2.9 | |
185
+ | `gateway_requests_dropped_by_stdm` | DC `gateway_requests == 0` while runtime telemetry outside Data Cloud confirms ≥1 LLM call for the session — i.e. the STDM exporter has dropped writes the platform did emit. Distinct from `planner_ran_no_gateway_logs` (which means logging disabled at the source). This skill cannot disambiguate this state by itself; the operator must check runtime telemetry to reclassify. | |
186
+ | `abandoned_before_llm` | steps > 0, LLM_STEP count == 0, gw_reqs == 0 (user typed, planner didn't reach an LLM call) | original |
187
+ | `planner_ran_no_gateway_logs` | LLM_STEP > 0 AND steps_with_generation_id > 0 AND gw_reqs == 0 (Trust Layer gateway logging disabled; extra guard prevents misclassification from broken generations-IN clauses) | original |
188
+ | `complete` | everything else (the "normal" bucket, including partial chain-orphan sessions) | original |
189
+
190
+ The enum names only the operator-actionable states. For finer shape,
191
+ read `counts.gw_binding`: if `declared == 0` but `gateway_requests > 0`,
192
+ the session relied entirely on prompt-template / Flow-invoked LLM
193
+ calls — normal but worth noticing.
194
+
195
+ `gateway_requests_dropped_by_stdm` is the only shape that this skill
196
+ cannot definitively classify on its own — disambiguating from
197
+ `planner_ran_no_gateway_logs` requires a runtime telemetry probe
198
+ outside Data Cloud. In this skill the session is reported as
199
+ `planner_ran_no_gateway_logs`; the operator with access to the
200
+ platform's runtime LLM-gateway telemetry can check for a matching
201
+ gateway-call event to distinguish a real STDM exporter defect from
202
+ "logging genuinely disabled at the source."
203
+
204
+ ### 2.9 Output: `dc._session_tree.json` schema
205
+
206
+ Root shape:
207
+
208
+ ```jsonc
209
+ {
210
+ "session": {
211
+ "id": "<sid>",
212
+ "_schema_version": 1, // see §2.9b
213
+ "identity": { ... }, // see §2.9a
214
+ "org": { "alias": "...", "instance_url": "..." },
215
+ "start_ts": "...",
216
+ "end_ts": null, // null while active
217
+ "end_type": "Completed | Abandoned | ...",
218
+ "channel": "...",
219
+ "participants": [
220
+ { "participant_id": "...", "role": "USER | AGENT",
221
+ "agent_api_name": "<null for USER>",
222
+ "agent_version": "...", "agent_type": "..." }
223
+ ],
224
+ "moments": [
225
+ { "moment_id": "...",
226
+ "agent_api_name": "...", "agent_version": "...",
227
+ "request_summary_text": "...", "response_summary_text": "...",
228
+ "interaction_ids": ["..."], // [] if no bridging rows; never omitted
229
+ "start_ts": "...", "end_ts": "...",
230
+ "tag_associations": [ ... ] // moment-scope only
231
+ }
232
+ ],
233
+ "interactions": [
234
+ {
235
+ "id": "...", "type": "TURN | SESSION_END", "topic": "...",
236
+ "trace_id": "...", // primary column or extracted from AttributeText
237
+ "start_ts": "...", "end_ts": "...",
238
+ "messages": [
239
+ { "message_id": "...", "type": "Input | Output",
240
+ "role": "USER | AGENT", // derived via participant join
241
+ "participant_id": "...", "text": "...",
242
+ "content_type": "...", "modality": "...", "ts": "..." }
243
+ ],
244
+ "telemetry_spans": [ ... ], // usually []
245
+ "steps": [
246
+ {
247
+ "id": "...",
248
+ "type": "LLM_STEP | ACTION_STEP | TOPIC_STEP | TRUST_GUARDRAILS_STEP | SESSION_END",
249
+ "name": "...",
250
+ "start_ts": "...", "end_ts": "...",
251
+ "error_text": null, // NOT_SET → null
252
+ "generation": { // present iff ssot__GenerationId__c != NOT_SET
253
+ "generation_id": "...",
254
+ "response_id": "...",
255
+ "response_text": "...", "masked_response_text": "...",
256
+ "feature": "...",
257
+ "quality": [ ... ], // ContentQuality rows parented on generationId__c
258
+ "categories": [ ... ], // ContentCategory rows parented on generationId__c
259
+ "feedback": [
260
+ { "feedback_id": "...", "feedback": "UP | DOWN", "action": "...",
261
+ "details": [ ... ], "records": [ ... ] }
262
+ ]
263
+ },
264
+ "gateway_request": { // present only when declared chain resolves
265
+ "binding_method": "declared",
266
+ "gateway_request_id": "...",
267
+ "feature": "...", "model": "...", "provider": "...",
268
+ "prompt_template_dev_name": "...", // "prompt_tokens": 0, "completion_tokens": 0, "total_tokens": 0,
269
+ "prompt_text": "...", // raw input prompt
270
+ "response": { ... },
271
+ "tags": [ ... ], "records": [ ... ],
272
+ "metadata": [ ... ], "llm": []
273
+ },
274
+ "gateway_request_collision": true // present only when a prior step
275
+ // claimed this step's declared GW;
276
+ // gateway_request is null in this case
277
+ }
278
+ ],
279
+ "timestamp_bound_gateway_calls": [ // chain-orphans placed by ts-window
280
+ { "binding_method": "timestamp_window",
281
+ "bound_to_step_id": "...", // null if bound to Interaction, not a Step
282
+ "gateway_request_id": "...", "feature": "...", "model": "...",
283
+ "response": { ... }, "tags": [...], "records": [...],
284
+ "metadata": [...], "llm": [] }
285
+ ],
286
+ "tag_associations": [ ... ] // interaction-scope only
287
+ }
288
+ ],
289
+ "session_tag_associations": [ ... ], // session-scope only
290
+ "unbound_gateway_calls": [ // chain-orphans with no window match
291
+ { "binding_method": "unbound", "gateway_request_id": "...", /* ... */ }
292
+ ],
293
+ "counts": {
294
+ "interactions_total": 0, "interactions_turn": 0, "interactions_session_end": 0,
295
+ "steps_total": 0,
296
+ "steps_by_type": { "LLM_STEP": 0, "ACTION_STEP": 0, "TOPIC_STEP": 0,
297
+ "TRUST_GUARDRAILS_STEP": 0, "SESSION_END": 0 },
298
+ "generations": 0,
299
+ "gateway_requests": 0, "gateway_responses": 0,
300
+ "gateway_metadata": 0, "gateway_llm": 0,
301
+ "gateway_records_grounded": 0, "gateway_records_feedback": 0,
302
+ "feedback": 0,
303
+ "audit_chain_1to1_ok": true,
304
+ "gw_binding": { "declared": 0, "timestamp_window": 0, "unbound": 0,
305
+ "declared_collisions": 0 },
306
+ "session_shape": "complete | abandoned_before_llm | planner_ran_no_gateway_logs | gateway_requests_dropped_by_stdm | interactions_not_materialized_yet | session_not_found",
307
+ "pk_collisions": [ ], // {dmo, key} records; first-write-wins applied
308
+ "parse_warnings": [ ] // dc.<name>.json files that failed to parse
309
+ }
310
+ },
311
+ "catalog": { // session-filtered, not full org vocabulary
312
+ "agents_observed": [ "..." ],
313
+ "tag_definitions": [ ... ],
314
+ "tag_definition_associations": [ ... ],
315
+ "tags": [ ... ]
316
+ },
317
+ "_doc": "Assembled from DATA_ROOT/<sid>/dc.*.json. See dc._session_manifest.json."
318
+ }
319
+ ```
320
+
321
+ **Polymorphic dispatch:**
322
+ - `GenAIGtwyObjRecord.parent__c` — if in `gw_req_by_id` → attached as
323
+ `GatewayRequest.records[]` (grounded attachments); if in
324
+ `feedback_by_id` → attached as `Feedback.records[]`; else silently
325
+ dropped.
326
+ - `GenAIContentCategory.parent__c` — if in `generations_by_id` →
327
+ attached as `Generation.categories[]` (non-TOXICITY detectors); if
328
+ in `quality_by_id` → nested under the Quality row as
329
+ `_toxicity_subcategories[]`; else silently dropped.
330
+ - `GenAIAiAgentTagAssociation` — routed by which of the three scope FKs
331
+ (`SessionId`, `InteractionId`, `MomentId`) is populated. Rows with
332
+ none are silently dropped.
333
+
334
+ **Polymorphic dispatch failures are silent by design.** If these id
335
+ spaces collide in future (they don't today — `gatewayRequestId__c`,
336
+ `feedbackId__c`, `generationId__c`, and `quality.id__c` are all
337
+ distinct UUID namespaces), the first-branch-wins behavior records the
338
+ defect nowhere. Revisit if a real org ever shows a cross-namespace id.
339
+
340
+ #### 2.9a `session.identity` sub-object
341
+
342
+ Harvested from already-fetched rows. Fields that require values absent
343
+ from every observed DMO row come out as `null`. Every string harvested
344
+ from `tagValue__c` is piped through `html.unescape()` → quote-strip →
345
+ `_clean()` to coerce `""`/`NOT_SET`/`UNSET_VALUE` to `None`.
346
+
347
+ | Field | Source DMO | Source column / lookup |
348
+ |---|---|---|
349
+ | `org_id` | gateway_requests | `orgId__c`, first non-null after sort |
350
+ | `platform_user_id` | gateway_requests | `userId__c`, first non-null after sort |
351
+ | `planner_id` | gateway_requests | `plannerId__c`, first non-null after sort |
352
+ | `bot_version_id` | gateway_requests | `botVersionId__c`, first non-null after sort |
353
+ | `app_type` | gateway_requests | `appType__c`, first non-null after sort |
354
+ | `bot_id` | gateway_request_tags | `tagValue__c` where `tag__c == "bot_id"` |
355
+ | `bot_name` | gateway_request_tags | `tagValue__c` where `tag__c == "bot_name"` |
356
+ | `agent_api_name` | gateway_request_tags | `tagValue__c` where `tag__c == "agent_developer_name"` (no fallback; MyAgent has no developer-name tag — look at `bot_name` + `agent_label` instead) |
357
+ | `agent_label` | gateway_request_tags | `tagValue__c` where `tag__c == "agent_label"` |
358
+ | `agent_version` | gateway_request_tags | `tagValue__c` where `tag__c == "agent_version_api_name"`, fallback `"version_api_name"` |
359
+ | `agent_type` | gateway_request_tags | `tagValue__c` where `tag__c == "agent_type"` |
360
+ | `planner_name` | gateway_request_tags | `tagValue__c` where `tag__c == "planner_name"` |
361
+ | `planner_type` | gateway_request_tags | `tagValue__c` where `tag__c == "planner_type"` |
362
+ | `configured_model` | gateway_request_tags | `tagValue__c` where `tag__c == "configured_model_name"` |
363
+ | `messaging_session_id` | sessions[0] | `ssot__RelatedMessagingSessionId__c` |
364
+ | `messaging_end_user_id` | participants | `ssot__ParticipantId__c` on the first USER-role row (sorted by `ssot__Id__c`) |
365
+ | `voice_call_id` | sessions[0] | `ssot__RelatedVoiceCallId__c` |
366
+ | `individual_id` | sessions[0] | `ssot__IndividualId__c` |
367
+ | `bootstrap_variables` | sessions[0] | parsed from `ssot__VariableText__c` — channel-specific bootstrap key→value dict (e.g. `__resolved_locale__`, `__supports_result_display__`); empty `{}` when the column is null/empty/unparseable |
368
+ | `mode` | derived | one of `production_messaging` / `builder_previewer` / `voice` / `unknown` — derived from `(channel, RelatedMessagingSessionId__c, RelatedVoiceCallId__c, bootstrap_variables.keys)`. See `_derive_mode` + `_BUILDER_PREVIEWER_INDICATOR_KEYS` in `assemble_dc.py`. |
369
+
370
+ **Sorting (required for idempotence):**
371
+ - `gateway_requests` — sort by `(timestamp__c, gatewayRequestId__c)`
372
+ ascending, then take first non-null.
373
+ - `gateway_request_tags` — sort by `(parent__c, tag__c, tagValue__c)`
374
+ ascending, then filter by tag name and take first non-null.
375
+ - `participants` — sort by `ssot__Id__c` ascending, then take the first
376
+ USER-role row.
377
+ - `sessions[0]` — by contract, one row per session; no sort needed.
378
+
379
+ **Trimmed fields:** `user_location`, `user_context` are not promoted
380
+ (low debugging value, opaque without a decoder ring).
381
+
382
+ **Minimal tree exclusion.** The session-not-found short-circuit path
383
+ (§2.11) does **not** emit an `identity` sub-object — identity
384
+ harvesters need non-empty gateway rows, which are guaranteed empty in
385
+ this branch. Renderer's minimal branch handles absent identity
386
+ gracefully.
387
+
388
+ #### 2.9b `session._schema_version`
389
+
390
+ Current value: `1`. Emitted on both the full tree and the minimal
391
+ session-not-found tree. Additive changes (new sub-objects, new fields)
392
+ do NOT bump this. Breaking changes (rename or remove a top-level key,
393
+ change the shape of `interactions[]`, etc.) bump it.
394
+
395
+ Renderer refuses to render a tree with an incompatible version; see
396
+ §3.10.
397
+
398
+ ### 2.10 Idempotence
399
+
400
+ Running the assembler N times on the same `DATA_ROOT/<sid>/` produces
401
+ a byte-identical `dc._session_tree.json`. Rules:
402
+
403
+ - Arrays sort by source timestamp ascending; on ties, by primary-key
404
+ string.
405
+ - Any set-derived array (`agents_observed`, `interaction_ids[]`, etc.)
406
+ is emitted via `sorted(...)` before serialization.
407
+ - `json.dumps(..., sort_keys=True)` for all dict output.
408
+ - Identity harvest uses the explicit sort keys in §2.9a for
409
+ first-non-null picks.
410
+ - Verified on the live test fixture: `diff` of two runs returns empty.
411
+
412
+ ### 2.11 Session-not-found short-circuit
413
+
414
+ If `sessions.json` returned 0 rows, the assembler writes a minimal
415
+ tree with only `session.id`, `session.org`,
416
+ `session._schema_version: 1`, and
417
+ `counts.session_shape = "session_not_found"`. No `identity`, no
418
+ `interactions[]`, no `catalog{}`.
419
+
420
+ ---
421
+
422
+ ## 3. Render stage
423
+
424
+ `scripts/render_dc.py` turns `dc._session_tree.json` into a human
425
+ markdown file.
426
+
427
+ ### 3.1 Purpose + scope
428
+
429
+ **Input:** `dc._session_tree.json` + `dc._session_manifest.json` (the
430
+ latter only for the Empties diagnostics section).
431
+
432
+ **Output:** `dc._session_summary.md` — 11 top-level sections, with `Session bootstrap` and `Planner LLM calls` conditionally suppressed (see §3.3).
433
+
434
+ **Contract:** pure tree reader. No DMO loads. No fetches. Everything
435
+ the renderer displays either lives directly on `tree.session.*` or is
436
+ composed from tree fields in the renderer's presentation layer.
437
+
438
+ ### 3.2 Inputs
439
+
440
+ - `dc._session_tree.json` — primary input. Renderer SystemExits with a
441
+ clear "tree not found" message if absent.
442
+ - `dc._session_manifest.json` — consulted for the Empties diagnostics
443
+ section. If absent, that section renders empty.
444
+
445
+ The 24 raw `dc.<name>.json` artifacts are NOT loaded by the renderer.
446
+
447
+ ### 3.3 Output: section order
448
+
449
+ The full-tree branch emits these top-level sections in order. The
450
+ gateway-direct branch (§2.8 `interactions_not_materialized_yet`) and
451
+ the minimal session-not-found branch use abbreviated section sets;
452
+ see `_render_gateway_direct` / `_render_minimal` in `render_dc.py`.
453
+
454
+ 1. `## Session identity` — identity fields from `tree.session.identity`
455
+ plus display-only cells (Agent, Total duration) composed in-renderer.
456
+ 2. `## Session bootstrap` — channel mode + bootstrap variables
457
+ (`identity.mode`, `identity.bootstrap_variables`). Surfaces these to
458
+ make MIAW vs Builder Previewer distinguishable at-a-glance —
459
+ `ssot__AiAgentChannelType__c` alone collides between the two. Section
460
+ is suppressed (not rendered) when both `mode` and `bootstrap_variables`
461
+ are absent — backwards-compat with older trees.
462
+ 3. `## ID reference` — full UUIDs for everything truncated in the
463
+ hierarchical trace.
464
+ 4. `## Transcript` — USER ↔ AGENT narrative per TURN interaction.
465
+ SESSION_END interactions have no messages and are skipped.
466
+ 5. `## Complete hierarchical trace` — Interaction → Step → Generation →
467
+ GatewayRequest, with `+start + duration = +end` math on Interaction
468
+ and Step lines. Single timestamps on Generation and GatewayRequest
469
+ (no computed latencies; see §3.6). UUIDs truncated to 8 chars + `…`;
470
+ full forms in §2 above.
471
+ 6. `## Per-turn summary` — one row per interaction.
472
+ 7. `## Planner LLM calls (full prompts + responses)` — **opt-in via
473
+ `--show-prompts`; suppressed by default**. Walks `interactions[].steps[]`, builds one
474
+ `#### LLM call N — <short-id>` block per step that has a
475
+ `gateway_request`. Renders the full input prompt (from
476
+ `gateway_request.prompt_text`) and full response (from
477
+ `generation.response_text`, HTML-unescaped) inside fenced code
478
+ blocks. Per-payload display capped at 64 KB; full payloads always
479
+ remain authoritative on disk in `dc.gateway_requests.json` /
480
+ `dc.generations.json`. Off by default because multi-turn sessions
481
+ with 30 KB+ prompts would dominate the summary.
482
+ 8. `## Visual analysis` — gantt + LLM-call overlay.
483
+ 9. `## Session counts` — engineer-facing table of manifest counts.
484
+ 10. `## Empties diagnostics` — one row per DMO with `rows == 0` and a
485
+ populated `_unavailable_reason` lifted verbatim from the manifest.
486
+ 11. `## Catalog (session-filtered)` — TagDefinitions /
487
+ TagDefinitionAssociations / Tags filtered to agents observed in the
488
+ session.
489
+
490
+ DC alone does not expose per-turn LLM latency in a useful form, so this
491
+ skill emits no `## Latency rollups` section. Generation and
492
+ GatewayRequest carry single-write timestamps (see §3.6); they are not
493
+ start/end pairs.
494
+
495
+ ### 3.4 Ellipsis rule
496
+
497
+ In the `## Complete hierarchical trace`:
498
+
499
+ - All UUIDs (interaction_id, step_id, generation_id,
500
+ gateway_request_id) render as the first 8 characters followed by `…`.
501
+ - Full UUIDs live in the `## ID reference` table above, keyed by the
502
+ same 8-char prefix.
503
+
504
+ This keeps the trace scannable while preserving the ability to
505
+ cross-reference by ID.
506
+
507
+ ### 3.5 Session-end derivation
508
+
509
+ `session.end_ts` can be null for two reasons:
510
+
511
+ 1. The session is still active.
512
+ 2. The session ended but STDM hasn't materialized the `end_ts` column
513
+ yet.
514
+
515
+ Renderer display rule: if `session.end_ts` is non-null, render it
516
+ directly with `✓ materialized` suffix. If null, look at the last
517
+ interaction by timestamp:
518
+
519
+ - If a SESSION_END interaction exists, use its `start_ts` as the
520
+ derived end with `from SESSION_END interaction` suffix.
521
+ - Otherwise, use the last TURN interaction's `end_ts` (or `start_ts`
522
+ if its end is null) with `session still open (last TURN)` suffix.
523
+
524
+ The derivation is display-only; the tree's `session.end_ts` is not
525
+ modified.
526
+
527
+ ### 3.6 Why we don't compute latencies on generation/gateway_request
528
+
529
+ `Generation.timestamp__c` and `GatewayRequest.timestamp__c` are
530
+ single timestamps representing when the DC row was written. They are
531
+ NOT `start_ts`/`end_ts` pairs. Treating the delta between two of them
532
+ as a "latency" is misleading — the gap reflects how DC serialized the
533
+ audit, not how long the LLM call took.
534
+
535
+ Interaction and Step DMOs DO expose start_ts + end_ts pairs; the
536
+ renderer computes `+offset + duration = +end` math for those.
537
+
538
+ ### 3.7 Empties diagnostics
539
+
540
+ Walk `manifest["queries"]` for entries with `rows == 0` and a
541
+ populated `_unavailable_reason`. Render each as a row:
542
+ `| <dmo_name> | <rows> | <verbatim reason> |`. The renderer does not
543
+ infer reasons.
544
+
545
+ Artifacts that failed to parse go into `tree.counts.parse_warnings` and
546
+ surface in the `## Session counts` section, not here.
547
+
548
+ ### 3.8 Idempotence
549
+
550
+ Running `render_dc.py --session <sid>` N times on the same
551
+ `dc._session_tree.json` produces a byte-identical
552
+ `dc._session_summary.md`. Rules:
553
+
554
+ - All section builders walk tree arrays in the order the tree provides
555
+ them; the tree itself is already sorted.
556
+ - No timestamps of "now" embedded in the output.
557
+ - No set-derived ordering; any set-to-list conversion goes through
558
+ `sorted(...)`.
559
+ - Verified on the live test fixture: `diff` of two runs returns empty.
560
+
561
+ ### 3.9 Session-not-found short-path
562
+
563
+ If the tree has `_schema_version: 1` but no `interactions[]` key, the
564
+ renderer emits a minimal markdown file:
565
+
566
+ ```markdown
567
+ # Session <sid>
568
+
569
+ ## Session identity
570
+
571
+ | Field | Value |
572
+ |---|---|
573
+ | Session id | <sid> |
574
+ | Session shape | session_not_found |
575
+
576
+ _No interactions resolved in Data Cloud. Check the session id, or
577
+ wait for STDM materialization._
578
+ ```
579
+
580
+ No transcript, no trace, no counts, no catalog.
581
+
582
+ ### 3.10 Tree schema version check
583
+
584
+ First check in `main_for_session()`:
585
+
586
+ - `tree.session._schema_version == 1` → render.
587
+ - `tree.session._schema_version` missing → stderr WARN, render anyway
588
+ (treat as best-effort for older trees).
589
+ - Any other value → `SystemExit("render_dc: unsupported tree
590
+ _schema_version=<v>; expected 1")`. Refuses rather than risking a
591
+ silent schema mismatch.
592
+
593
+ ---
594
+
595
+ ## 4. Reading order for a new skill author
596
+
597
+ 1. Read this file (contract).
598
+ 2. Run the pipeline once against a fresh session: `python3
599
+ scripts/fetch_dc.py --session <sid> --org <alias>`. Inspect
600
+ `DATA_ROOT/<sid>/` — you get the 24 `dc.<name>.json`, the manifest,
601
+ the tree, and the summary.
602
+ 3. Open `dc._session_tree.json` and trace the declared chain for one
603
+ LLM_STEP end-to-end.
604
+ 4. Read the matching `dc._session_summary.md`.
605
+ 5. Read `scripts/assemble_dc.py` (module docstring points back here),
606
+ then `scripts/render_dc.py`.
607
+ 6. Cross-reference [`dc_dmo_fields.md`](./dc_dmo_fields.md) when you
608
+ hit a field whose origin is unclear.
@@ -0,0 +1,2 @@
1
+ # Shared module for the investigating-agentforce-d360 skill.
2
+ # Three siblings live in this package: paths, fs_guard, sql.