@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.
- package/package.json +1 -1
- package/skills/activating-datacloud/SKILL.md +0 -1
- package/skills/analyzing-omnistudio-dependencies/SKILL.md +0 -1
- package/skills/applying-slds/SKILL.md +322 -0
- package/skills/applying-slds/checklists.md +83 -0
- package/skills/applying-slds/examples.md +283 -0
- package/skills/applying-slds/guidance/README.md +83 -0
- package/skills/applying-slds/guidance/blueprints-index.md +213 -0
- package/skills/applying-slds/guidance/icons-guidance.md +186 -0
- package/skills/applying-slds/guidance/overviews/borders.md +236 -0
- package/skills/applying-slds/guidance/overviews/color.md +266 -0
- package/skills/applying-slds/guidance/overviews/display-density.md +366 -0
- package/skills/applying-slds/guidance/overviews/icons.md +240 -0
- package/skills/applying-slds/guidance/overviews/illustrations.md +235 -0
- package/skills/applying-slds/guidance/overviews/shadows.md +176 -0
- package/skills/applying-slds/guidance/overviews/spacing.md +216 -0
- package/skills/applying-slds/guidance/overviews/typography.md +323 -0
- package/skills/applying-slds/guidance/overviews/utilities.md +542 -0
- package/skills/applying-slds/guidance/slds-development-guide.md +288 -0
- package/skills/applying-slds/guidance/styling-hooks/borders.md +202 -0
- package/skills/applying-slds/guidance/styling-hooks/color/expressive-palette-hooks.md +153 -0
- package/skills/applying-slds/guidance/styling-hooks/color/index.md +171 -0
- package/skills/applying-slds/guidance/styling-hooks/color/semantic/accent-hooks.md +204 -0
- package/skills/applying-slds/guidance/styling-hooks/color/semantic/feedback-hooks.md +768 -0
- package/skills/applying-slds/guidance/styling-hooks/color/semantic/surface-hooks.md +337 -0
- package/skills/applying-slds/guidance/styling-hooks/color/system-hooks.md +132 -0
- package/skills/applying-slds/guidance/styling-hooks/index.md +327 -0
- package/skills/applying-slds/guidance/styling-hooks/shadows.md +238 -0
- package/skills/applying-slds/guidance/styling-hooks/spacing.md +254 -0
- package/skills/applying-slds/guidance/styling-hooks/typography.md +448 -0
- package/skills/applying-slds/guidance/utilities/alignment.md +119 -0
- package/skills/applying-slds/guidance/utilities/borders.md +131 -0
- package/skills/applying-slds/guidance/utilities/box.md +125 -0
- package/skills/applying-slds/guidance/utilities/color.md +165 -0
- package/skills/applying-slds/guidance/utilities/dark-mode.md +111 -0
- package/skills/applying-slds/guidance/utilities/description-list.md +168 -0
- package/skills/applying-slds/guidance/utilities/floats.md +117 -0
- package/skills/applying-slds/guidance/utilities/grid.md +264 -0
- package/skills/applying-slds/guidance/utilities/horizontal-list.md +110 -0
- package/skills/applying-slds/guidance/utilities/hyphenation.md +84 -0
- package/skills/applying-slds/guidance/utilities/index.md +205 -0
- package/skills/applying-slds/guidance/utilities/interactions.md +89 -0
- package/skills/applying-slds/guidance/utilities/layout.md +109 -0
- package/skills/applying-slds/guidance/utilities/line-clamp.md +131 -0
- package/skills/applying-slds/guidance/utilities/margin.md +155 -0
- package/skills/applying-slds/guidance/utilities/media-object.md +161 -0
- package/skills/applying-slds/guidance/utilities/name-value-list.md +152 -0
- package/skills/applying-slds/guidance/utilities/padding.md +155 -0
- package/skills/applying-slds/guidance/utilities/position.md +177 -0
- package/skills/applying-slds/guidance/utilities/print.md +114 -0
- package/skills/applying-slds/guidance/utilities/scrollable.md +126 -0
- package/skills/applying-slds/guidance/utilities/sizing.md +190 -0
- package/skills/applying-slds/guidance/utilities/themes.md +121 -0
- package/skills/applying-slds/guidance/utilities/truncate.md +127 -0
- package/skills/applying-slds/guidance/utilities/typography.md +166 -0
- package/skills/applying-slds/guidance/utilities/vertical-list.md +166 -0
- package/skills/applying-slds/guidance/utilities/visibility.md +228 -0
- package/skills/applying-slds/metadata/README.md +84 -0
- package/skills/applying-slds/metadata/blueprints/components/accordion.yaml +304 -0
- package/skills/applying-slds/metadata/blueprints/components/activity-timeline.yaml +92 -0
- package/skills/applying-slds/metadata/blueprints/components/alert.yaml +103 -0
- package/skills/applying-slds/metadata/blueprints/components/app-launcher.yaml +94 -0
- package/skills/applying-slds/metadata/blueprints/components/avatar-group.yaml +81 -0
- package/skills/applying-slds/metadata/blueprints/components/avatar.yaml +97 -0
- package/skills/applying-slds/metadata/blueprints/components/badges.yaml +102 -0
- package/skills/applying-slds/metadata/blueprints/components/brand-band.yaml +198 -0
- package/skills/applying-slds/metadata/blueprints/components/breadcrumbs.yaml +95 -0
- package/skills/applying-slds/metadata/blueprints/components/builder-header.yaml +192 -0
- package/skills/applying-slds/metadata/blueprints/components/button-groups.yaml +82 -0
- package/skills/applying-slds/metadata/blueprints/components/button-icons.yaml +295 -0
- package/skills/applying-slds/metadata/blueprints/components/buttons.yaml +230 -0
- package/skills/applying-slds/metadata/blueprints/components/cards.yaml +124 -0
- package/skills/applying-slds/metadata/blueprints/components/carousel.yaml +140 -0
- package/skills/applying-slds/metadata/blueprints/components/chat.yaml +179 -0
- package/skills/applying-slds/metadata/blueprints/components/checkbox-button-group.yaml +192 -0
- package/skills/applying-slds/metadata/blueprints/components/checkbox-button.yaml +204 -0
- package/skills/applying-slds/metadata/blueprints/components/checkbox-toggle.yaml +177 -0
- package/skills/applying-slds/metadata/blueprints/components/checkbox.yaml +108 -0
- package/skills/applying-slds/metadata/blueprints/components/color-picker.yaml +172 -0
- package/skills/applying-slds/metadata/blueprints/components/combobox.yaml +136 -0
- package/skills/applying-slds/metadata/blueprints/components/counter.yaml +147 -0
- package/skills/applying-slds/metadata/blueprints/components/data-tables.yaml +157 -0
- package/skills/applying-slds/metadata/blueprints/components/datepickers.yaml +130 -0
- package/skills/applying-slds/metadata/blueprints/components/datetime-picker.yaml +155 -0
- package/skills/applying-slds/metadata/blueprints/components/docked-composer.yaml +201 -0
- package/skills/applying-slds/metadata/blueprints/components/docked-form-footer.yaml +161 -0
- package/skills/applying-slds/metadata/blueprints/components/docked-utility-bar.yaml +175 -0
- package/skills/applying-slds/metadata/blueprints/components/drop-zone.yaml +115 -0
- package/skills/applying-slds/metadata/blueprints/components/dueling-picklist.yaml +196 -0
- package/skills/applying-slds/metadata/blueprints/components/dynamic-icons.yaml +128 -0
- package/skills/applying-slds/metadata/blueprints/components/dynamic-menu.yaml +141 -0
- package/skills/applying-slds/metadata/blueprints/components/expandable-section.yaml +115 -0
- package/skills/applying-slds/metadata/blueprints/components/expression.yaml +143 -0
- package/skills/applying-slds/metadata/blueprints/components/feeds.yaml +125 -0
- package/skills/applying-slds/metadata/blueprints/components/file-selector.yaml +154 -0
- package/skills/applying-slds/metadata/blueprints/components/files.yaml +119 -0
- package/skills/applying-slds/metadata/blueprints/components/form-element.yaml +145 -0
- package/skills/applying-slds/metadata/blueprints/components/global-header.yaml +120 -0
- package/skills/applying-slds/metadata/blueprints/components/global-navigation.yaml +100 -0
- package/skills/applying-slds/metadata/blueprints/components/icons.yaml +138 -0
- package/skills/applying-slds/metadata/blueprints/components/illustration.yaml +205 -0
- package/skills/applying-slds/metadata/blueprints/components/input.yaml +151 -0
- package/skills/applying-slds/metadata/blueprints/components/list-builder.yaml +127 -0
- package/skills/applying-slds/metadata/blueprints/components/lookups.yaml +132 -0
- package/skills/applying-slds/metadata/blueprints/components/map.yaml +118 -0
- package/skills/applying-slds/metadata/blueprints/components/menus.yaml +134 -0
- package/skills/applying-slds/metadata/blueprints/components/modals.yaml +152 -0
- package/skills/applying-slds/metadata/blueprints/components/notifications.yaml +88 -0
- package/skills/applying-slds/metadata/blueprints/components/page-headers.yaml +135 -0
- package/skills/applying-slds/metadata/blueprints/components/panels.yaml +149 -0
- package/skills/applying-slds/metadata/blueprints/components/path.yaml +154 -0
- package/skills/applying-slds/metadata/blueprints/components/picklist.yaml +125 -0
- package/skills/applying-slds/metadata/blueprints/components/pills.yaml +154 -0
- package/skills/applying-slds/metadata/blueprints/components/popovers.yaml +120 -0
- package/skills/applying-slds/metadata/blueprints/components/progress-bar.yaml +110 -0
- package/skills/applying-slds/metadata/blueprints/components/progress-indicator.yaml +133 -0
- package/skills/applying-slds/metadata/blueprints/components/progress-ring.yaml +102 -0
- package/skills/applying-slds/metadata/blueprints/components/prompt.yaml +126 -0
- package/skills/applying-slds/metadata/blueprints/components/publishers.yaml +178 -0
- package/skills/applying-slds/metadata/blueprints/components/radio-button-group.yaml +172 -0
- package/skills/applying-slds/metadata/blueprints/components/radio-group.yaml +112 -0
- package/skills/applying-slds/metadata/blueprints/components/rich-text-editor.yaml +135 -0
- package/skills/applying-slds/metadata/blueprints/components/scoped-notifications.yaml +188 -0
- package/skills/applying-slds/metadata/blueprints/components/scoped-tabs.yaml +97 -0
- package/skills/applying-slds/metadata/blueprints/components/select.yaml +127 -0
- package/skills/applying-slds/metadata/blueprints/components/setup-assistant.yaml +152 -0
- package/skills/applying-slds/metadata/blueprints/components/slider.yaml +111 -0
- package/skills/applying-slds/metadata/blueprints/components/spinners.yaml +135 -0
- package/skills/applying-slds/metadata/blueprints/components/split-view.yaml +112 -0
- package/skills/applying-slds/metadata/blueprints/components/summary-detail.yaml +103 -0
- package/skills/applying-slds/metadata/blueprints/components/tabs.yaml +138 -0
- package/skills/applying-slds/metadata/blueprints/components/textarea.yaml +116 -0
- package/skills/applying-slds/metadata/blueprints/components/tiles.yaml +108 -0
- package/skills/applying-slds/metadata/blueprints/components/timepicker.yaml +111 -0
- package/skills/applying-slds/metadata/blueprints/components/toast.yaml +154 -0
- package/skills/applying-slds/metadata/blueprints/components/tooltips.yaml +107 -0
- package/skills/applying-slds/metadata/blueprints/components/tree-grid.yaml +116 -0
- package/skills/applying-slds/metadata/blueprints/components/trees.yaml +116 -0
- package/skills/applying-slds/metadata/blueprints/components/trial-bar.yaml +112 -0
- package/skills/applying-slds/metadata/blueprints/components/vertical-navigation.yaml +130 -0
- package/skills/applying-slds/metadata/blueprints/components/vertical-tabs.yaml +140 -0
- package/skills/applying-slds/metadata/blueprints/components/visual-picker.yaml +150 -0
- package/skills/applying-slds/metadata/blueprints/components/welcome-mat.yaml +136 -0
- package/skills/applying-slds/metadata/hooks-index.json +6272 -0
- package/skills/applying-slds/metadata/icon-metadata.json +38466 -0
- package/skills/applying-slds/metadata/utilities-index.json +21912 -0
- package/skills/applying-slds/references/component-selection.md +112 -0
- package/skills/applying-slds/references/icons-decision-guide.md +124 -0
- package/skills/applying-slds/references/styling-decision-guide.md +228 -0
- package/skills/applying-slds/references/utilities-quick-ref.md +125 -0
- package/skills/applying-slds/scripts/search-blueprints.cjs +117 -0
- package/skills/applying-slds/scripts/search-hooks.cjs +139 -0
- package/skills/applying-slds/scripts/search-icons.cjs +174 -0
- package/skills/applying-slds/scripts/search-utilities.cjs +161 -0
- package/skills/building-mobile-apps/SKILL.md +0 -1
- package/skills/building-omnistudio-callable-apex/SKILL.md +0 -1
- package/skills/building-omnistudio-datamapper/SKILL.md +0 -1
- package/skills/building-omnistudio-flexcard/SKILL.md +0 -1
- package/skills/building-omnistudio-integration-procedure/SKILL.md +0 -1
- package/skills/building-omnistudio-omniscript/SKILL.md +0 -1
- package/skills/building-sf-integrations/SKILL.md +0 -1
- package/skills/configuring-connected-apps/SKILL.md +0 -1
- package/skills/connecting-datacloud/SKILL.md +0 -1
- package/skills/creating-b2b-commerce-store/SKILL.md +0 -1
- package/skills/debugging-apex-logs/SKILL.md +0 -1
- package/skills/deploying-metadata/SKILL.md +0 -1
- package/skills/deploying-omnistudio-datapacks/SKILL.md +0 -1
- package/skills/developing-agentforce/SKILL.md +0 -1
- package/skills/fetching-salesforce-docs/SKILL.md +0 -1
- package/skills/generating-custom-lightning-type/SKILL.md +17 -39
- package/skills/generating-custom-lightning-type/assets/primitive-types-and-constraints.md +41 -0
- package/skills/generating-custom-lightning-type/references/widget-rendition.md +124 -0
- package/skills/generating-lwc-components/SKILL.md +0 -1
- package/skills/generating-mermaid-diagrams/SKILL.md +0 -1
- package/skills/generating-visual-diagrams/SKILL.md +0 -1
- package/skills/handling-sf-data/SKILL.md +0 -1
- package/skills/harmonizing-datacloud/SKILL.md +0 -1
- package/skills/integrating-b2b-commerce-open-code-components/SKILL.md +0 -1
- package/skills/investigating-agentforce-architecture/README.md +156 -0
- package/skills/investigating-agentforce-architecture/SKILL.md +230 -0
- package/skills/investigating-agentforce-architecture/assets/cli/describe_sobject.yaml +16 -0
- package/skills/investigating-agentforce-architecture/assets/cli/describe_tooling_sobject.yaml +17 -0
- package/skills/investigating-agentforce-architecture/assets/cli/list_metadata_genaiprompttemplate.yaml +17 -0
- package/skills/investigating-agentforce-architecture/assets/cli/org_display.yaml +15 -0
- package/skills/investigating-agentforce-architecture/assets/cli/retrieve_genai_plugin.yaml +18 -0
- package/skills/investigating-agentforce-architecture/assets/cli/show_access_token.yaml +27 -0
- package/skills/investigating-agentforce-architecture/assets/mermaid/action_tree.mmd +20 -0
- package/skills/investigating-agentforce-architecture/assets/mermaid/data_flow.mmd +19 -0
- package/skills/investigating-agentforce-architecture/assets/mermaid/dependency_graph.mmd +19 -0
- package/skills/investigating-agentforce-architecture/assets/mermaid/invocation_sequence.mmd +20 -0
- package/skills/investigating-agentforce-architecture/assets/mermaid/planner_state.mmd +18 -0
- package/skills/investigating-agentforce-architecture/assets/soql/apex_class_bodies_by_ids.soql +3 -0
- package/skills/investigating-agentforce-architecture/assets/soql/apex_class_bodies_by_names.soql +3 -0
- package/skills/investigating-agentforce-architecture/assets/soql/bot_definition_details.soql +3 -0
- package/skills/investigating-agentforce-architecture/assets/soql/bot_version_lookup.soql +4 -0
- package/skills/investigating-agentforce-architecture/assets/soql/flow_definition_by_ids.soql +3 -0
- package/skills/investigating-agentforce-architecture/assets/soql/flow_definition_ids_by_names.soql +3 -0
- package/skills/investigating-agentforce-architecture/assets/soql/flow_definition_view_by_durable_ids.soql +4 -0
- package/skills/investigating-agentforce-architecture/assets/soql/flow_metadata_by_id.soql +3 -0
- package/skills/investigating-agentforce-architecture/assets/soql/functions_by_plugins.soql +5 -0
- package/skills/investigating-agentforce-architecture/assets/soql/planner_attrs_by_parent_ids.soql +3 -0
- package/skills/investigating-agentforce-architecture/assets/soql/planner_bundle_functions.soql +3 -0
- package/skills/investigating-agentforce-architecture/assets/soql/planner_definition_by_agent_chain.soql +3 -0
- package/skills/investigating-agentforce-architecture/assets/soql/plugin_functions_by_plugin_ids.soql +3 -0
- package/skills/investigating-agentforce-architecture/assets/soql/plugin_instructions_by_plugin_ids.soql +3 -0
- package/skills/investigating-agentforce-architecture/assets/soql/plugins_by_planner.soql +4 -0
- package/skills/investigating-agentforce-architecture/references/architecture_sections.md +243 -0
- package/skills/investigating-agentforce-architecture/references/contract.json +244 -0
- package/skills/investigating-agentforce-architecture/references/soql_fields.md +512 -0
- package/skills/investigating-agentforce-architecture/scripts/_shared/__init__.py +1 -0
- package/skills/investigating-agentforce-architecture/scripts/_shared/fs_guard.py +329 -0
- package/skills/investigating-agentforce-architecture/scripts/_shared/paths.py +110 -0
- package/skills/investigating-agentforce-architecture/scripts/_shared/runtime.py +59 -0
- package/skills/investigating-agentforce-architecture/scripts/_shared/sql.py +10 -0
- package/skills/investigating-agentforce-architecture/scripts/cache_check.py +234 -0
- package/skills/investigating-agentforce-architecture/scripts/config.py +131 -0
- package/skills/investigating-agentforce-architecture/scripts/fetch_soql.py +689 -0
- package/skills/investigating-agentforce-architecture/scripts/finalize.py +295 -0
- package/skills/investigating-agentforce-architecture/scripts/main.py +2835 -0
- package/skills/investigating-agentforce-architecture/scripts/metadata_listing.py +265 -0
- package/skills/investigating-agentforce-architecture/scripts/parallel_retrieve.py +69 -0
- package/skills/investigating-agentforce-architecture/scripts/parse_bundle.py +215 -0
- package/skills/investigating-agentforce-architecture/scripts/parse_wave.py +845 -0
- package/skills/investigating-agentforce-architecture/scripts/probe_channels.py +302 -0
- package/skills/investigating-agentforce-architecture/scripts/render_architecture.py +1043 -0
- package/skills/investigating-agentforce-architecture/scripts/resolve_bot.py +255 -0
- package/skills/investigating-agentforce-architecture/scripts/resolve_invocation_target.py +130 -0
- package/skills/investigating-agentforce-architecture/scripts/rest_client.py +763 -0
- package/skills/investigating-agentforce-architecture/scripts/retrieve_planner.py +13 -0
- package/skills/investigating-agentforce-architecture/scripts/sf_cli.py +242 -0
- package/skills/investigating-agentforce-architecture/scripts/soql_loader.py +253 -0
- package/skills/investigating-agentforce-architecture/scripts/summarize_tree.py +143 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/__init__.py +0 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/_bootstrap.py +23 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/fixtures/__init__.py +0 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/fixtures/genai_payloads.py +400 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_cache_check.py +307 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_cache_check_main.py +283 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_config.py +115 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_end_to_end_fixture.py +651 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_finalize.py +278 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_flow_children_inflation.py +582 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_fs_guard.py +113 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_iterative_wave_b.py +478 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_main_pipeline.py +3359 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_parallel_retrieve.py +131 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_parse_bundle.py +400 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_parse_wave.py +644 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_parse_wave_classifiers.py +224 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_parse_wave_helpers.py +380 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_parse_wave_main.py +397 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_per_branch_visited.py +244 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_probe_channels.py +359 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_probe_cli_recipes.py +185 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_render_architecture.py +810 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_resolve_bot.py +203 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_resolve_creds.py +157 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_resolve_invocation_target.py +145 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_rest_client.py +1253 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_runtime_override.py +100 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_sf_cli.py +261 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_signature_stamping.py +466 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_soql_loader.py +501 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_summarize_tree.py +241 -0
- package/skills/investigating-agentforce-architecture/scripts/tests/test_write_emit_ctx.py +480 -0
- package/skills/investigating-agentforce-architecture/tools/emit_env.py +157 -0
- package/skills/investigating-agentforce-architecture/tools/emit_result.py +262 -0
- package/skills/investigating-agentforce-architecture/tools/sanitize.py +33 -0
- package/skills/investigating-agentforce-architecture/tools/write_emit_ctx.py +332 -0
- package/skills/investigating-agentforce-d360/README.md +123 -0
- package/skills/investigating-agentforce-d360/SKILL.md +163 -0
- package/skills/investigating-agentforce-d360/assets/dc/app_generation.sql +51 -0
- package/skills/investigating-agentforce-d360/assets/dc/content_category.sql +44 -0
- package/skills/investigating-agentforce-d360/assets/dc/content_quality.sql +41 -0
- package/skills/investigating-agentforce-d360/assets/dc/discover_sessions.sql +36 -0
- package/skills/investigating-agentforce-d360/assets/dc/feedback.sql +47 -0
- package/skills/investigating-agentforce-d360/assets/dc/feedback_details.sql +38 -0
- package/skills/investigating-agentforce-d360/assets/dc/gateway_records.sql +45 -0
- package/skills/investigating-agentforce-d360/assets/dc/gateway_request_llm.sql +50 -0
- package/skills/investigating-agentforce-d360/assets/dc/gateway_request_metadata.sql +44 -0
- package/skills/investigating-agentforce-d360/assets/dc/gateway_request_tags.sql +42 -0
- package/skills/investigating-agentforce-d360/assets/dc/gateway_requests.sql +89 -0
- package/skills/investigating-agentforce-d360/assets/dc/gateway_responses.sql +43 -0
- package/skills/investigating-agentforce-d360/assets/dc/generations.sql +52 -0
- package/skills/investigating-agentforce-d360/assets/dc/interactions.sql +53 -0
- package/skills/investigating-agentforce-d360/assets/dc/messages.sql +53 -0
- package/skills/investigating-agentforce-d360/assets/dc/messaging_session.sql +37 -0
- package/skills/investigating-agentforce-d360/assets/dc/moment_interactions.sql +34 -0
- package/skills/investigating-agentforce-d360/assets/dc/moments.sql +39 -0
- package/skills/investigating-agentforce-d360/assets/dc/participants.sql +48 -0
- package/skills/investigating-agentforce-d360/assets/dc/sessions.sql +78 -0
- package/skills/investigating-agentforce-d360/assets/dc/steps.sql +64 -0
- package/skills/investigating-agentforce-d360/assets/dc/tag_associations.sql +46 -0
- package/skills/investigating-agentforce-d360/assets/dc/tag_definition_associations.sql +37 -0
- package/skills/investigating-agentforce-d360/assets/dc/tag_definitions.sql +50 -0
- package/skills/investigating-agentforce-d360/assets/dc/tags.sql +37 -0
- package/skills/investigating-agentforce-d360/assets/dc/telemetry_spans.sql +55 -0
- package/skills/investigating-agentforce-d360/references/artifacts.md +50 -0
- package/skills/investigating-agentforce-d360/references/dc_dmo_fields.md +823 -0
- package/skills/investigating-agentforce-d360/references/dc_pipeline_contract.md +608 -0
- package/skills/investigating-agentforce-d360/scripts/_shared/__init__.py +2 -0
- package/skills/investigating-agentforce-d360/scripts/_shared/cli_override.py +98 -0
- package/skills/investigating-agentforce-d360/scripts/_shared/fs_guard.py +334 -0
- package/skills/investigating-agentforce-d360/scripts/_shared/paths.py +155 -0
- package/skills/investigating-agentforce-d360/scripts/_shared/runtime.py +59 -0
- package/skills/investigating-agentforce-d360/scripts/_shared/sql.py +14 -0
- package/skills/investigating-agentforce-d360/scripts/assemble_dc.py +1624 -0
- package/skills/investigating-agentforce-d360/scripts/config.py +45 -0
- package/skills/investigating-agentforce-d360/scripts/dc.py +188 -0
- package/skills/investigating-agentforce-d360/scripts/discover_sessions.py +556 -0
- package/skills/investigating-agentforce-d360/scripts/fetch_dc.py +1045 -0
- package/skills/investigating-agentforce-d360/scripts/render_dc.py +1750 -0
- package/skills/investigating-agentforce-d360/scripts/resolve_session.py +264 -0
- package/skills/investigating-agentforce-d360/scripts/storage.py +92 -0
- package/skills/investigating-agentforce-d360/scripts/tests/__init__.py +0 -0
- package/skills/investigating-agentforce-d360/scripts/tests/_bootstrap.py +15 -0
- package/skills/investigating-agentforce-d360/scripts/tests/fixtures/__init__.py +0 -0
- package/skills/investigating-agentforce-d360/scripts/tests/fixtures/synthetic_session.py +424 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_assemble_dc_bootstrap_and_mode.py +115 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_assemble_dc_gateway_direct.py +220 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_assemble_dc_gateway_direct_integration.py +158 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_assemble_dc_helpers.py +287 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_assemble_dc_integration.py +247 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_dc_and_resolve_session.py +433 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_discover_sessions.py +458 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_discover_sessions_grep_ci.py +193 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_fetch_dc_helpers.py +266 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_fetch_dc_identity.py +528 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_fetch_dc_main.py +251 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_fetch_dc_waterfall.py +229 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_fetch_dc_waterfall_full.py +283 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_identity_coherence.py +327 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_render_dc_branches.py +256 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_render_dc_gateway_direct.py +130 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_render_dc_helpers.py +291 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_render_dc_integration.py +220 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_render_dc_planner_llm_calls.py +284 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_render_dc_show_prompts_gating.py +215 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_resolve_from_disk.py +100 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_resolve_session_main.py +149 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_runtime_override.py +104 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_session_shape.py +95 -0
- package/skills/investigating-agentforce-d360/scripts/tests/test_session_shape_dropped_by_stdm.py +85 -0
- package/skills/managing-managed-event-subscription/SKILL.md +152 -0
- package/skills/managing-managed-event-subscription/assets/managed-event-subscription-template.xml +20 -0
- package/skills/managing-managed-event-subscription/references/delete-guide.md +57 -0
- package/skills/managing-managed-event-subscription/references/topic-name-formats.md +26 -0
- package/skills/managing-managed-event-subscription/references/update-constraints.md +30 -0
- package/skills/modeling-omnistudio-epc-catalog/SKILL.md +0 -1
- package/skills/observing-agentforce/SKILL.md +0 -1
- package/skills/orchestrating-datacloud/SKILL.md +0 -1
- package/skills/preparing-datacloud/SKILL.md +0 -1
- package/skills/querying-soql/SKILL.md +0 -1
- package/skills/retrieving-datacloud/SKILL.md +0 -1
- package/skills/running-apex-tests/SKILL.md +0 -1
- package/skills/running-code-analyzer/SKILL.md +0 -1
- package/skills/segmenting-datacloud/SKILL.md +0 -1
- package/skills/testing-agentforce/SKILL.md +0 -1
- package/skills/uplifting-components-to-slds2/SKILL.md +3 -2
- package/skills/uplifting-components-to-slds2/references/color-hooks-decision-guide.md +30 -9
- package/skills/uplifting-components-to-slds2/references/examples.md +24 -6
- package/skills/validating-slds/SKILL.md +262 -0
- package/skills/validating-slds/references/quality-checks.md +308 -0
- package/skills/validating-slds/references/report-format.md +302 -0
- 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.
|