tools/AsterGraph.ConsumerSample.Avalonia is the medium hosted-UI sample on the canonical session/runtime route, after the starter scaffold and the smallest HelloWorld.Avalonia route, and before the full AsterGraph.Demo showcase host. It opens the Content Review Release Lane scenario graph by default.
For trust-policy review and local evidence, pair this route with Plugin Manifest and Trust Policy Contract v1 and Beta Support Bundle.
It is the host seam example for these host-owned seams:
- action rail / command projection
- plugin trust workflow
- selected-node parameter read/write seam
- snippet catalog and connected-node insertion seam
For the inspector metadata recipe, pair this route with Authoring Inspector Recipe. This sample stays focused on the host-owned seams and the shipped inspector surface; it does not own the metadata vocabulary. The canonical recipe carries the full defaultValue, isAdvanced, helpText, placeholderText, and read-only vocabulary.
For copyable custom node, port, and edge presentation on the same route, pair it with Authoring Surface Recipe.
For searchable grouped stencil, SVG/PNG/JPEG export breadth, and shared node or edge quick tools on the same route, pair it with Capability Breadth Recipe.
For one copyable hosted tuning handoff that keeps those widened surfaces tied to defended ScaleSmoke budgets, pair it with Widened Surface Performance Recipe.
For one copyable hosted keyboard, focus, and accessibility handoff on the same route, pair it with Hosted Accessibility Recipe.
This is the defended beta route for copying host-owned seams into your own host. Keep action projection, trust workflow, and the selected-node parameter read/write seam host-owned; copy only the sample-owned presentation.
It stays on the canonical session/runtime model only. It does not introduce a second editor model, a sandbox, or a broader plugin ecosystem.
Its final experience handoff markers summarize existing proof lines only: EXPERIENCE_POLISH_HANDOFF_OK:True, FEATURE_ENHANCEMENT_PROOF_OK:True, and EXPERIENCE_SCOPE_BOUNDARY_OK:True.
Its authoring depth handoff markers summarize the completed v0.58 convenience polish without widening the support boundary: AUTHORING_DEPTH_HANDOFF_OK:True, AUTHORING_DEPTH_SCOPE_BOUNDARY_OK:True, and V058_MILESTONE_PROOF_OK:True.
Its large-graph UX baseline markers summarize existing hosted performance and LOD evidence only: LARGE_GRAPH_UX_POLICY_OK:True, LARGE_GRAPH_UX_SCOPE_BOUNDARY_OK:True, and LARGE_GRAPH_UX_PROOF_BASELINE_OK:True.
Its viewport LOD markers prove selected/hovered affordances stay bounded to hosted workbench policy: VIEWPORT_LOD_POLICY_OK:True, SELECTED_HOVERED_ADORNER_SCOPE_OK:True, LARGE_GRAPH_BALANCED_UX_OK:True, and VIEWPORT_LOD_SCOPE_BOUNDARY_OK:True.
Its edge interaction markers summarize hosted edge quick-tool, toolbar, and geometry evidence without creating a runtime renderer contract: EDGE_INTERACTION_CACHE_OK:True, EDGE_DRAG_ROUTE_SIMPLIFICATION_OK:True, SELECTED_EDGE_FEEDBACK_OK:True, and EDGE_RENDERING_SCOPE_BOUNDARY_OK:True.
Its panel projection markers keep mini-map and inspector evidence narrow: MINIMAP_LIGHTWEIGHT_PROJECTION_OK:True, INSPECTOR_NARROW_PROJECTION_OK:True, LARGE_GRAPH_PANEL_SCOPE_OK:True, and PROJECTION_PERFORMANCE_EVIDENCE_OK:True.
Its v0.59 handoff markers aggregate the Large Graph UX phases without widening graph-size support claims: LARGE_GRAPH_UX_HANDOFF_OK:True, LARGE_GRAPH_UX_SCOPE_BOUNDARY_OK:True, and V059_MILESTONE_PROOF_OK:True.
Its v0.62 interaction reliability handoff markers aggregate live canvas refresh, interaction feedback, and Demo/Consumer gesture proof without creating a runtime renderer contract: INTERACTION_RELIABILITY_HANDOFF_OK:True, INTERACTION_SCOPE_BOUNDARY_OK:True, and V062_MILESTONE_PROOF_OK:True.
Its v0.63 workbench discoverability handoff markers aggregate layout presets, panel state, unified discovery, and recents/favorites proof without creating a new runtime route, macro/query system, remote sync, marketplace state, WPF parity, or GA claim: WORKBENCH_DISCOVERABILITY_HANDOFF_OK:True, WORKBENCH_DISCOVERABILITY_SCOPE_BOUNDARY_OK:True, and V063_MILESTONE_PROOF_OK:True.
Its v0.64 hosted workbench friction markers record local synthetic workflow evidence only, with explicit priority and scope-boundary text, not external adopter reports or a GA claim: WORKBENCH_FRICTION_EVIDENCE_OK:True, WORKBENCH_FRICTION_PRIORITIZATION_OK:True, and WORKBENCH_FRICTION_SCOPE_BOUNDARY_OK:True.
Its bounded affordance polish markers prove one copyable layout-resume action through AsterGraphWorkbenchOptions.ResetLayout, not a new runtime route or broader workbench model: WORKBENCH_AFFORDANCE_POLISH_OK:True, WORKBENCH_AFFORDANCE_ROUTE_OK:True, and WORKBENCH_AFFORDANCE_SCOPE_BOUNDARY_OK:True.
Its workbench evidence bundle markers prove the friction rows and selected affordance can travel in the local support bundle without remote telemetry or sync: WORKBENCH_FRICTION_SUPPORT_BUNDLE_OK:True, WORKBENCH_ADOPTER_EVIDENCE_ATTACHMENT_OK:True, and WORKBENCH_EVIDENCE_SCOPE_BOUNDARY_OK:True.
Its v0.64 adopter polish handoff markers aggregate phases 392-394 without widening scope: WORKBENCH_ADOPTER_POLISH_HANDOFF_OK:True, WORKBENCH_ADOPTER_POLISH_SCOPE_BOUNDARY_OK:True, and V064_MILESTONE_PROOF_OK:True.
Its authoring flow handoff summarizes quick-add connected nodes, insert-on-wire, reconnect editing, edge multiselect, and wire slicing on the existing session command path: AUTHORING_FLOW_PROOF_OK:True, AUTHORING_FLOW_HANDOFF_OK:True, and AUTHORING_FLOW_SCOPE_BOUNDARY_OK:True.
The hosted route ladder is Starter.Avalonia -> HelloWorld.Avalonia -> ConsumerSample.Avalonia.
HostSample is the post-ladder proof harness.
This sample keeps one realistic host window without turning into a full showcase shell. It demonstrates:
- one host-owned action rail projected from shared command descriptors through
AsterGraphHostedActionFactory.CreateCommandActions(...)andAsterGraphHostedActionFactory.CreateProjection(...) - one host-defined node family that is intentionally sample-owned and replaceable
- one plugin-contributed command flowing through the same action path instead of a sample-only menu placeholder
- one selected-node parameter read/write seam through
IGraphEditorSession.Queries.GetSelectedNodeParameterSnapshots()andIGraphEditorSession.Commands.TrySetSelectedNodeParameterValue(...) - one host-owned snippet catalog that inserts the sample review queue lane through
StartConnection(...)andTryCreateConnectedNodeFromPendingConnection(...) - one trusted plugin registration with visible provenance, trust reasons, and allowlist import or export
- one support-bundle proof path with onboarding markers for the scenario graph, host-owned actions, canonical graph readiness evidence, support-bundle payload readiness, and five-minute handoff health
- one authoring flow proof handoff that keeps quick-add, insert-on-wire, reconnect editing, edge multiselect, and wire slicing on the existing session command path
- one final handoff marker set that ties UX polish, feature enhancement proof, and scope-boundary evidence together without adding runtime APIs, marketplace behavior, sandboxing, or WPF parity
- one runtime feedback proof handoff with
RUNTIME_DEBUG_PANEL_INTERACTION_OK:True,RUNTIME_LOG_LOCATE_OK:True, andRUNTIME_LOG_EXPORT_OK:True, paired with Demo'sAI_PIPELINE_MOCK_RUNNER_POLISH_OK:True,AI_PIPELINE_PAYLOAD_PREVIEW_OK:True, andAI_PIPELINE_ERROR_DEBUG_EVIDENCE_OK:True; these are host-owned debug/support markers, not an execution engine, workflow scripting UI, marketplace, sandbox, WPF parity, or GA claim - one host-owned navigation proof handoff with
NAVIGATION_HISTORY_OK:True,SCOPE_BREADCRUMB_NAVIGATION_OK:True,FOCUS_RESTORE_OK:True,NAVIGATION_PRODUCTIVITY_PROOF_OK:True,NAVIGATION_PRODUCTIVITY_HANDOFF_OK:True, andNAVIGATION_SCOPE_BOUNDARY_OK:Truewithout introducing a command macro engine, background graph index, WPF parity, or a new runtime navigation API - one hosted workbench friction evidence set with prioritized local synthetic rows for layout resume, node discovery, command feedback, and support triage; these rows stay on the existing hosted/session routes and are not external adopter reports
- one bounded workbench affordance polish action that maps the highest-priority
layout-resumefriction row to a hosted reset-layout action on existing workbench options - one local support-bundle evidence payload that serializes the workbench friction rows and selected affordance without implying telemetry, remote sync, or external adopter validation
- the shipped Avalonia editor surface on the factory-based hosted-UI route
- action rail / command projection: keep the host actions outside the editor shell and project shared descriptors through
AsterGraphHostedActionFactory.CreateCommandActions(...)andAsterGraphHostedActionFactory.CreateProjection(...) - plugin trust workflow: keep
GraphEditorPluginDiscoveryOptions,AsterGraphEditorOptions.PluginTrustPolicy, provenance snapshots, and an explicit host-owned allowlist policy together - selected-node parameter read/write seam:
IGraphEditorSession.Queries.GetSelectedNodeParameterSnapshots()reads the selected node parameters, andIGraphEditorSession.Commands.TrySetSelectedNodeParameterValue(...)writes them back - snippet catalog and connected-node insertion seam: keep snippet ids and template content in the host, then insert through
StartConnection(...)plusTryCreateConnectedNodeFromPendingConnection(...)so snippets do not become a runtime abstraction
| Route | Copy from this sample | Do not copy |
|---|---|---|
| Hosted UI | AsterGraphEditorFactory.Create(...) plus AsterGraphAvaloniaViewFactory.Create(...) composition |
demo-only shell state or showcase panels |
| Runtime-only | the same document/catalog definitions, then use AsterGraphEditorFactory.CreateSession(...) in your own UI |
Avalonia window layout |
| Plugin | AsterGraphEditorFactory.DiscoverPluginCandidates(...), PluginTrustPolicy, provenance, and allowlist import/export |
sample plugin id, audit node family, or trust text |
| Migration | retained GraphEditorViewModel / GraphEditorView only when moving an existing host in batches |
new primary host code on retained surfaces |
Keep these sample-owned details local to your app:
- review/audit node family
- action ids and titles
- snippet ids and catalog entries
- window layout and narrative text
- proof labels beyond the defended markers
Copy from each bounded source for the part it owns:
- Copy from this sample: action rail / command projection, plugin trust workflow, and selected-node parameter read/write seam.
- Copy from Authoring Inspector Recipe: the definition-driven metadata vocabulary (
defaultValue,isAdvanced,helpText,placeholderText,constraints.IsReadOnly) and stock inspector field grouping. - Keep local: review/audit node family, action ids/titles, window layout and narrative text, and proof labels beyond the defended markers.
Copy the path in this order:
- Define metadata in Authoring Inspector Recipe first with
defaultValue,editorKind,constraints, andgroupName. - Project and write selected-node values in this sample through
IGraphEditorSession.Queries.GetSelectedNodeParameterSnapshots()andIGraphEditorSession.Commands.TrySetSelectedNodeParameterValue(...). - Project inspector state through
IGraphEditorSession.Queries.GetSelectedNodeParameterSnapshots(). - Project node-side editor state through
IGraphEditorSession.Queries.GetNodeParameterSnapshots(nodeId)andINodeParameterEditorRegistry. - Write values back through
IGraphEditorSession.Commands.TrySetSelectedNodeParameterValue(...)orIGraphEditorSession.Commands.TrySetNodeParameterValue(...)so validation stays on the shared session command path. - Project host actions from
session.Queries.GetCommandDescriptors()and the shared host-action route, then validate evidence with proof mode plus a support bundle; compareparameterSnapshotswithCONSUMER_SAMPLE_PARAMETER_OK:True,CONSUMER_SAMPLE_METADATA_PROJECTION_OK:True, andAUTHORING_SURFACE_OK:True. - Validate evidence with proof mode plus a support bundle; compare
parameterSnapshotswithCONSUMER_SAMPLE_PARAMETER_OK:True,CONSUMER_SAMPLE_METADATA_PROJECTION_OK:True, andAUTHORING_SURFACE_OK:True.
Consumer Sample proves the seam split; it does not own the metadata vocabulary. Authoring Inspector Recipe is the sole owner of the metadata vocabulary.
- Keep widened hosted metrics on
AsterGraph.ConsumerSample.Avalonia -- --proofthroughHOST_NATIVE_METRIC:stencil_search_ms,HOST_NATIVE_METRIC:command_surface_refresh_ms,HOST_NATIVE_METRIC:node_tool_projection_ms, andHOST_NATIVE_METRIC:edge_tool_projection_ms, and expectWIDENED_SURFACE_PERFORMANCE_OK:True. - Keep defended
largeauthoring and export budgets onScaleSmokethroughSCALE_AUTHORING_BUDGET_OK:large:True:noneandSCALE_EXPORT_BUDGET_OK:large:True:none. - Reuse Widened Surface Performance Recipe when you want one copyable tuning handoff instead of a new hosted proof lane.
- Keep baseline automation names on
GraphEditorView,NodeCanvas,GraphInspectorView, and the stock search surfaces, then expectHOSTED_ACCESSIBILITY_BASELINE_OK:True. - Keep command-palette keyboard flow on the shared hosted route so focus returns to the host surface that opened it, then expect
HOSTED_ACCESSIBILITY_FOCUS_OK:True. - Keep hosted automation navigation and authoring diagnostics on the same proof run, then expect
HOSTED_ACCESSIBILITY_AUTOMATION_NAVIGATION_OK:True,HOSTED_ACCESSIBILITY_AUTHORING_DIAGNOSTICS_OK:True, andHOSTED_ACCESSIBILITY_AUTOMATION_OK:True. - Keep header, palette, node-tool, and edge-tool names projected from the same shared action descriptors, then expect
HOSTED_ACCESSIBILITY_COMMAND_SURFACE_OK:True. - Keep selected-node parameter metadata and connection text editors on the same hosted authoring route, then close the handoff with Hosted Accessibility Recipe and
HOSTED_ACCESSIBILITY_OK:True. - For one screen-reader-ready local evaluation path, keep
ConsumerSample.Avalonia -- --proof, the support-bundle attachment note, and the post-ladderHostSampleproof lines on the same bounded intake record.
Copyable trust and proof reference:
dotnet run --project tools/AsterGraph.ConsumerSample.Avalonia/AsterGraph.ConsumerSample.Avalonia.csproj --nologo -- --proofExpected proof markers:
CONSUMER_SAMPLE_TRUST_OK:TrueCONSUMER_SAMPLE_METADATA_PROJECTION_OK:TruePORT_HANDLE_ID_OK:TruePORT_GROUP_AUTHORING_OK:TruePORT_CONNECTION_HINT_OK:TruePORT_AUTHORING_SCOPE_BOUNDARY_OK:TrueCONNECTION_VALIDATION_REASON_OK:TrueCONNECTION_INVALID_HOVER_FEEDBACK_OK:TrueCONNECTION_VALIDATION_SUPPORT_BUNDLE_OK:TrueCONNECTION_VALIDATION_SCOPE_BOUNDARY_OK:TrueAUTHORING_SURFACE_NODE_SIDE_EDITOR_OK:TrueAUTHORING_SURFACE_COMMAND_PROJECTION_OK:TrueCAPABILITY_BREADTH_STENCIL_OK:TrueSTENCIL_GROUPING_OK:TrueSTENCIL_SEARCH_OK:TrueSTENCIL_RECENTS_FAVORITES_OK:TrueSTENCIL_SOURCE_FILTER_OK:TrueSTENCIL_STATE_PERSISTENCE_OK:TrueCAPABILITY_BREADTH_EXPORT_OK:TrueEXPORT_PANEL_OK:TrueEXPORT_PANEL_SCOPE_OK:TrueEXPORT_PANEL_PROGRESS_CANCEL_OK:TrueEXPORT_DOCS_ALIGNMENT_OK:TrueCAPABILITY_BREADTH_NODE_QUICK_TOOLS_OK:TrueCAPABILITY_BREADTH_EDGE_QUICK_TOOLS_OK:TrueNODE_TOOLBAR_CONTRIBUTION_OK:TrueEDGE_TOOLBAR_CONTRIBUTION_OK:TrueTOOLBAR_CONTRIBUTION_DESCRIPTOR_OK:TrueTOOLBAR_CONTRIBUTION_SCOPE_BOUNDARY_OK:TrueCAPABILITY_BREADTH_OK:TrueHOSTED_ACCESSIBILITY_BASELINE_OK:TrueHOSTED_ACCESSIBILITY_FOCUS_OK:TrueHOSTED_ACCESSIBILITY_AUTOMATION_NAVIGATION_OK:TrueHOSTED_ACCESSIBILITY_AUTHORING_DIAGNOSTICS_OK:TrueHOSTED_ACCESSIBILITY_AUTOMATION_OK:TrueHOSTED_ACCESSIBILITY_COMMAND_SURFACE_OK:TrueHOSTED_ACCESSIBILITY_AUTHORING_SURFACE_OK:TrueHOSTED_ACCESSIBILITY_OK:TrueWIDENED_SURFACE_PERFORMANCE_OK:TrueCONSUMER_SAMPLE_SCENARIO_GRAPH_OK:TrueCONSUMER_SAMPLE_HOST_OWNED_ACTIONS_OK:TrueCONSUMER_SAMPLE_SUPPORT_BUNDLE_READY_OK:TrueGRAPH_VALIDATION_FEEDBACK_OK:TrueGRAPH_FEEDBACK_FOCUS_TARGET_OK:TrueGRAPH_READINESS_STATUS_OK:TrueGRAPH_SNIPPET_CATALOG_OK:TrueGRAPH_SNIPPET_INSERT_OK:TrueWORKBENCH_DEFAULTS_OK:TrueWORKBENCH_HOST_BUILDER_HANDOFF_OK:TrueWORKBENCH_PERFORMANCE_MODE_OK:TrueBALANCED_MODE_DEFAULT_OK:TrueWORKBENCH_LOD_POLICY_OK:TruePERFORMANCE_MODE_SCOPE_BOUNDARY_OK:TrueWORKBENCH_LAYOUT_PRESETS_OK:TrueWORKBENCH_LAYOUT_RESET_OK:TruePANEL_STATE_PERSISTENCE_OK:TrueWORKBENCH_SCOPE_BOUNDARY_OK:TrueGRAPH_SEARCH_LOCATE_OK:TrueGRAPH_SEARCH_SCOPE_FILTER_OK:TrueGRAPH_SEARCH_VIEWPORT_FOCUS_OK:TrueUNIFIED_DISCOVERY_SURFACE_OK:TrueDISCOVERY_SOURCE_LABELS_OK:TrueDISCOVERY_COMMAND_ROUTE_OK:TrueWORKBENCH_RECENTS_OK:TrueWORKBENCH_FAVORITES_OK:TrueRECENTS_FAVORITES_SUPPORT_BUNDLE_OK:TrueCOMMAND_PALETTE_GROUPING_OK:TrueCOMMAND_PALETTE_DISABLED_REASON_OK:TrueCOMMAND_PALETTE_RECENT_ACTIONS_OK:TrueCOMMAND_PROJECTION_UNIFIED_OK:TrueCOMMAND_PALETTE_OK:TrueTOOLBAR_DESCRIPTOR_OK:TrueCONTEXT_MENU_DESCRIPTOR_OK:TrueCOMMAND_DISABLED_REASON_OK:TrueINTERACTION_FEEDBACK_OK:TrueCANVAS_FOCUS_RECOVERY_OK:TrueCONSUMER_GESTURE_PROOF_OK:TrueINTERACTION_RELIABILITY_HANDOFF_OK:TrueINTERACTION_SCOPE_BOUNDARY_OK:TrueV062_MILESTONE_PROOF_OK:TrueWORKBENCH_DISCOVERABILITY_HANDOFF_OK:TrueWORKBENCH_DISCOVERABILITY_SCOPE_BOUNDARY_OK:TrueV063_MILESTONE_PROOF_OK:TrueWORKBENCH_FRICTION_EVIDENCE_OK:TrueWORKBENCH_FRICTION_PRIORITIZATION_OK:TrueWORKBENCH_FRICTION_SCOPE_BOUNDARY_OK:TrueWORKBENCH_AFFORDANCE_POLISH_OK:TrueWORKBENCH_AFFORDANCE_ROUTE_OK:TrueWORKBENCH_AFFORDANCE_SCOPE_BOUNDARY_OK:TrueWORKBENCH_FRICTION_SUPPORT_BUNDLE_OK:TrueWORKBENCH_ADOPTER_EVIDENCE_ATTACHMENT_OK:TrueWORKBENCH_EVIDENCE_SCOPE_BOUNDARY_OK:TrueWORKBENCH_ADOPTER_POLISH_HANDOFF_OK:TrueWORKBENCH_ADOPTER_POLISH_SCOPE_BOUNDARY_OK:TrueV064_MILESTONE_PROOF_OK:TrueNODE_TOOLBAR_CONTRIBUTION_OK:TrueEDGE_TOOLBAR_CONTRIBUTION_OK:TrueTOOLBAR_CONTRIBUTION_DESCRIPTOR_OK:TrueTOOLBAR_CONTRIBUTION_SCOPE_BOUNDARY_OK:TrueNAVIGATION_HISTORY_OK:TrueSCOPE_BREADCRUMB_NAVIGATION_OK:TrueFOCUS_RESTORE_OK:TrueNAVIGATION_PRODUCTIVITY_PROOF_OK:TrueNAVIGATION_PRODUCTIVITY_HANDOFF_OK:TrueNAVIGATION_SCOPE_BOUNDARY_OK:TrueFIVE_MINUTE_ONBOARDING_OK:TrueONBOARDING_CONFIGURATION_OK:TrueAUTHORING_SURFACE_OK:TrueCOMMAND_SURFACE_OK:TrueEXPERIENCE_POLISH_HANDOFF_OK:TrueFEATURE_ENHANCEMENT_PROOF_OK:TrueAUTHORING_FLOW_PROOF_OK:TrueAUTHORING_FLOW_HANDOFF_OK:TrueAUTHORING_FLOW_SCOPE_BOUNDARY_OK:TrueEXPERIENCE_SCOPE_BOUNDARY_OK:TrueHOST_NATIVE_METRIC:*
Expected bundle markers when --support-bundle <support-bundle-path> is supplied:
SUPPORT_BUNDLE_PERSISTENCE_OK:TrueSUPPORT_BUNDLE_OK:TrueSUPPORT_BUNDLE_PATH:...CONSUMER_SAMPLE_SUPPORT_BUNDLE_READY_OK:TrueGRAPH_VALIDATION_FEEDBACK_OK:TrueGRAPH_FEEDBACK_FOCUS_TARGET_OK:TrueGRAPH_READINESS_STATUS_OK:True
This quick reference is summary-only; Proof Handoff owns the actual intake instructions. The support bundle stays local evidence only and does not widen the support boundary.
Next beta intake links:
dotnet run --project tools/AsterGraph.ConsumerSample.Avalonia/AsterGraph.ConsumerSample.Avalonia.csproj --nologoFor CI-style proof mode:
dotnet run --project tools/AsterGraph.ConsumerSample.Avalonia/AsterGraph.ConsumerSample.Avalonia.csproj --nologo -- --proofFor a local beta support bundle:
dotnet run --project tools/AsterGraph.ConsumerSample.Avalonia/AsterGraph.ConsumerSample.Avalonia.csproj --nologo -- --proof --support-bundle <support-bundle-path> --support-note "what you were trying to validate"Proof Handoff owns the actual intake instructions.
If you copied the starter recipe, validate the defended host here with AsterGraph.ConsumerSample.Avalonia -- --proof first.
For the actual intake record, run AsterGraph.ConsumerSample.Avalonia -- --proof --support-bundle <support-bundle-path> and reuse the emitted SUPPORT_BUNDLE_PATH:... line as the support-bundle attachment note on the bounded intake record.
If the route cannot produce a bundle, record NO_SUPPORT_BUNDLE:route-cannot-produce-one.
If CONSUMER_SAMPLE_PARAMETER_OK or CONSUMER_SAMPLE_METADATA_PROJECTION_OK fail, keep the failed proof-marker lines with the support bundle's parameterSnapshots rows on that same bounded intake record.
If graph readiness is the question, keep readinessStatus, validationSummary, and validationFeedback from the same bundle; those fields are projected from the canonical session validation snapshot.
It should stay local evidence only and should not widen the support boundary.
Expected proof markers:
CONSUMER_SAMPLE_HOST_ACTION_OK:TrueCONSUMER_SAMPLE_PLUGIN_OK:TrueAUTHORING_SURFACE_PARAMETER_PROJECTION_OK:TrueAUTHORING_SURFACE_METADATA_PROJECTION_OK:TrueAUTHORING_SURFACE_NODE_SIDE_EDITOR_OK:TrueAUTHORING_SURFACE_COMMAND_PROJECTION_OK:TrueCONSUMER_SAMPLE_PARAMETER_OK:TrueCONSUMER_SAMPLE_METADATA_PROJECTION_OK:TrueCONSUMER_SAMPLE_WINDOW_OK:TrueCONSUMER_SAMPLE_TRUST_OK:TrueCOMMAND_SURFACE_OK:TrueCAPABILITY_BREADTH_STENCIL_OK:TrueSTENCIL_GROUPING_OK:TrueSTENCIL_SEARCH_OK:TrueSTENCIL_RECENTS_FAVORITES_OK:TrueSTENCIL_SOURCE_FILTER_OK:TrueSTENCIL_STATE_PERSISTENCE_OK:TrueCAPABILITY_BREADTH_EXPORT_OK:TrueEXPORT_PANEL_OK:TrueEXPORT_PANEL_SCOPE_OK:TrueEXPORT_PANEL_PROGRESS_CANCEL_OK:TrueEXPORT_DOCS_ALIGNMENT_OK:TrueCAPABILITY_BREADTH_NODE_QUICK_TOOLS_OK:TrueCAPABILITY_BREADTH_EDGE_QUICK_TOOLS_OK:TrueNODE_TOOLBAR_CONTRIBUTION_OK:TrueEDGE_TOOLBAR_CONTRIBUTION_OK:TrueTOOLBAR_CONTRIBUTION_DESCRIPTOR_OK:TrueTOOLBAR_CONTRIBUTION_SCOPE_BOUNDARY_OK:TrueCAPABILITY_BREADTH_OK:TrueHOSTED_ACCESSIBILITY_BASELINE_OK:TrueHOSTED_ACCESSIBILITY_FOCUS_OK:TrueHOSTED_ACCESSIBILITY_COMMAND_SURFACE_OK:TrueHOSTED_ACCESSIBILITY_AUTHORING_SURFACE_OK:TrueHOSTED_ACCESSIBILITY_OK:TrueWIDENED_SURFACE_PERFORMANCE_OK:TrueCONSUMER_SAMPLE_SCENARIO_GRAPH_OK:TrueCONSUMER_SAMPLE_HOST_OWNED_ACTIONS_OK:TrueCONSUMER_SAMPLE_SUPPORT_BUNDLE_READY_OK:TrueGRAPH_VALIDATION_FEEDBACK_OK:TrueGRAPH_FEEDBACK_FOCUS_TARGET_OK:TrueGRAPH_READINESS_STATUS_OK:TrueGRAPH_SNIPPET_CATALOG_OK:TrueGRAPH_SNIPPET_INSERT_OK:TrueWORKBENCH_DEFAULTS_OK:TrueWORKBENCH_HOST_BUILDER_HANDOFF_OK:TrueWORKBENCH_PERFORMANCE_MODE_OK:TrueBALANCED_MODE_DEFAULT_OK:TrueWORKBENCH_LOD_POLICY_OK:TruePERFORMANCE_MODE_SCOPE_BOUNDARY_OK:TrueWORKBENCH_LAYOUT_PRESETS_OK:TrueWORKBENCH_LAYOUT_RESET_OK:TruePANEL_STATE_PERSISTENCE_OK:TrueWORKBENCH_SCOPE_BOUNDARY_OK:TrueGRAPH_SEARCH_LOCATE_OK:TrueGRAPH_SEARCH_SCOPE_FILTER_OK:TrueGRAPH_SEARCH_VIEWPORT_FOCUS_OK:TrueUNIFIED_DISCOVERY_SURFACE_OK:TrueDISCOVERY_SOURCE_LABELS_OK:TrueDISCOVERY_COMMAND_ROUTE_OK:TrueWORKBENCH_RECENTS_OK:TrueWORKBENCH_FAVORITES_OK:TrueRECENTS_FAVORITES_SUPPORT_BUNDLE_OK:TrueCOMMAND_PALETTE_GROUPING_OK:TrueCOMMAND_PALETTE_DISABLED_REASON_OK:TrueCOMMAND_PALETTE_RECENT_ACTIONS_OK:TrueCOMMAND_PROJECTION_UNIFIED_OK:TrueCOMMAND_PALETTE_OK:TrueTOOLBAR_DESCRIPTOR_OK:TrueCONTEXT_MENU_DESCRIPTOR_OK:TrueCOMMAND_DISABLED_REASON_OK:TrueINTERACTION_FEEDBACK_OK:TrueCANVAS_FOCUS_RECOVERY_OK:TrueCONSUMER_GESTURE_PROOF_OK:TrueINTERACTION_RELIABILITY_HANDOFF_OK:TrueINTERACTION_SCOPE_BOUNDARY_OK:TrueV062_MILESTONE_PROOF_OK:TrueWORKBENCH_DISCOVERABILITY_HANDOFF_OK:TrueWORKBENCH_DISCOVERABILITY_SCOPE_BOUNDARY_OK:TrueV063_MILESTONE_PROOF_OK:TrueWORKBENCH_FRICTION_EVIDENCE_OK:TrueWORKBENCH_FRICTION_PRIORITIZATION_OK:TrueWORKBENCH_FRICTION_SCOPE_BOUNDARY_OK:TrueWORKBENCH_AFFORDANCE_POLISH_OK:TrueWORKBENCH_AFFORDANCE_ROUTE_OK:TrueWORKBENCH_AFFORDANCE_SCOPE_BOUNDARY_OK:TrueWORKBENCH_FRICTION_SUPPORT_BUNDLE_OK:TrueWORKBENCH_ADOPTER_EVIDENCE_ATTACHMENT_OK:TrueWORKBENCH_EVIDENCE_SCOPE_BOUNDARY_OK:TrueWORKBENCH_ADOPTER_POLISH_HANDOFF_OK:TrueWORKBENCH_ADOPTER_POLISH_SCOPE_BOUNDARY_OK:TrueV064_MILESTONE_PROOF_OK:TrueNODE_TOOLBAR_CONTRIBUTION_OK:TrueEDGE_TOOLBAR_CONTRIBUTION_OK:TrueTOOLBAR_CONTRIBUTION_DESCRIPTOR_OK:TrueTOOLBAR_CONTRIBUTION_SCOPE_BOUNDARY_OK:TrueNAVIGATION_HISTORY_OK:TrueSCOPE_BREADCRUMB_NAVIGATION_OK:TrueFOCUS_RESTORE_OK:TrueNAVIGATION_PRODUCTIVITY_PROOF_OK:TrueNAVIGATION_PRODUCTIVITY_HANDOFF_OK:TrueNAVIGATION_SCOPE_BOUNDARY_OK:TrueFIVE_MINUTE_ONBOARDING_OK:TrueONBOARDING_CONFIGURATION_OK:TrueHOST_NATIVE_METRIC:startup_ms=...HOST_NATIVE_METRIC:inspector_projection_ms=...HOST_NATIVE_METRIC:plugin_scan_ms=...HOST_NATIVE_METRIC:command_latency_ms=...HOST_NATIVE_METRIC:stencil_search_ms=...HOST_NATIVE_METRIC:command_surface_refresh_ms=...HOST_NATIVE_METRIC:node_tool_projection_ms=...HOST_NATIVE_METRIC:edge_tool_projection_ms=...AUTHORING_SURFACE_OK:TrueEXPERIENCE_POLISH_HANDOFF_OK:TrueFEATURE_ENHANCEMENT_PROOF_OK:TrueAUTHORING_FLOW_PROOF_OK:TrueAUTHORING_FLOW_HANDOFF_OK:TrueAUTHORING_FLOW_SCOPE_BOUNDARY_OK:TrueEXPERIENCE_SCOPE_BOUNDARY_OK:TrueCONSUMER_SAMPLE_OK:True
Expected bundle markers when --support-bundle <support-bundle-path> is supplied:
SUPPORT_BUNDLE_PERSISTENCE_OK:TrueSUPPORT_BUNDLE_OK:TrueSUPPORT_BUNDLE_PATH:...CONSUMER_SAMPLE_SUPPORT_BUNDLE_READY_OK:TrueGRAPH_VALIDATION_FEEDBACK_OK:TrueGRAPH_FEEDBACK_FOCUS_TARGET_OK:TrueGRAPH_READINESS_STATUS_OK:TrueCONSUMER_SAMPLE_OK:True
Use ConsumerSample.Avalonia when you need one realistic host after HelloWorld.Avalonia and before the full Demo.
Use a different artifact when you need something narrower:
Starter.Avalonia= first hosted scaffold and smallest end-to-end Avalonia entryHelloWorld= smallest runtime-only first runHelloWorld.Avalonia= smallest hosted-UI first runHostSample= proof harness for canonical route validationPackageSmoke= packed-package proofScaleSmoke= scale and state-continuity proofDemo= full showcase host
The sample is intentionally small enough to copy from:
- action rail / command projection: keep the host actions outside the editor shell and project shared descriptors through
AsterGraphHostedActionFactory.CreateCommandActions(...)andAsterGraphHostedActionFactory.CreateProjection(...) - plugin trust workflow: keep
GraphEditorPluginDiscoveryOptions,AsterGraphEditorOptions.PluginTrustPolicy, provenance snapshots, and allowlist import/export together in the host; plugin trust stays explicit and host-owned through discovery snapshots, reason strings, and allowlist import/export. allowlist decisions can be exported or imported without rebuilding the host trust-policy flow. - trusted plugin proof handoff: pair
CONSUMER_SAMPLE_TRUST_OK:Truefrom this sample withASTERGRAPH_PLUGIN_VALIDATE_OK:TruefromAsterGraph.PluginTool validate, then review Plugin Manifest and Trust Policy Contract v1 before treating a third-party plugin artifact as loadable. - selected-node parameter read/write seam:
IGraphEditorSession.Queries.GetSelectedNodeParameterSnapshots()reads the selected node parameters, andIGraphEditorSession.Commands.TrySetSelectedNodeParameterValue(...)writes them back - snippet catalog and insertion seam: keep
consumer.sample.snippet.queue-laneand any other snippets host-owned, search/preview/favorite/recent them in the host, then insert by reusingStartConnection(...)plusTryCreateConnectedNodeFromPendingConnection(...) - plugin loading remains in-process; there is no sandbox or untrusted-code isolation
- sample-owned details such as the review/audit node family, action ids and titles, the window layout, and the narrative text are replaceable
- the v1 manifest and trust-policy contract is published in Plugin Manifest and Trust Policy Contract v1
If you want to build the same medium host in your own app, copy these seams in this order:
- action rail / command projection: query
session.Queries.GetCommandDescriptors()indirectly throughAsterGraphHostedActionFactory.CreateCommandActions(...)and project them withAsterGraphHostedActionFactory.CreateProjection(...) - plugin trust workflow: keep
GraphEditorPluginDiscoveryOptions,AsterGraphEditorOptions.PluginTrustPolicy, provenance snapshots, and an explicit host-owned allowlist policy together - trusted plugin proof handoff: keep
CONSUMER_SAMPLE_TRUST_OK:True,ASTERGRAPH_PLUGIN_VALIDATE_OK:True, and Plugin Manifest and Trust Policy Contract v1 together when reviewing one trusted plugin path - selected-node parameter read/write seam:
IGraphEditorSession.Queries.GetSelectedNodeParameterSnapshots()reads the selected node parameters, andIGraphEditorSession.Commands.TrySetSelectedNodeParameterValue(...)writes them back - node-side authoring seam:
IGraphEditorSession.Queries.GetNodeParameterSnapshots(nodeId)plusINodeParameterEditorRegistrykeep the node surface on the same metadata and validation contract as the inspector - snippet seam: expose host-owned snippets through a small catalog, search/preview/favorite/recent them in the host, insert them with the existing pending-connection command path, and expect
GRAPH_SNIPPET_CATALOG_OK:True,GRAPH_SNIPPET_INSERT_OK:True,FRAGMENT_LIBRARY_SEARCH_OK:True,FRAGMENT_LIBRARY_PREVIEW_OK:True,FRAGMENT_LIBRARY_RECENTS_FAVORITES_OK:True, andFRAGMENT_LIBRARY_SCOPE_BOUNDARY_OK:True - default workbench seam: use
AsterGraphHostBuilder.UseDefaultWorkbench()for the stock toolbar, command palette, stencil, inspector, mini-map, fragment, diagnostics, and status chrome; expectWORKBENCH_DEFAULTS_OK:True,WORKBENCH_HOST_BUILDER_HANDOFF_OK:True,WORKBENCH_PERFORMANCE_MODE_OK:True,BALANCED_MODE_DEFAULT_OK:True,WORKBENCH_LOD_POLICY_OK:True,PERFORMANCE_MODE_SCOPE_BOUNDARY_OK:True,WORKBENCH_LAYOUT_PRESETS_OK:True,WORKBENCH_LAYOUT_RESET_OK:True,PANEL_STATE_PERSISTENCE_OK:True, andWORKBENCH_SCOPE_BOUNDARY_OK:True - discovery seam: keep stencil templates, host snippets, graph search results, plugin gallery entries, and command palette actions discoverable through existing hosted/session routes with visible source labels; expect
UNIFIED_DISCOVERY_SURFACE_OK:True,DISCOVERY_SOURCE_LABELS_OK:True, andDISCOVERY_COMMAND_ROUTE_OK:True - recents/favorites seam: keep node, fragment, command, and plugin/source recents and favorites in bounded host-owned state, expose them in support bundles, and expect
WORKBENCH_RECENTS_OK:True,WORKBENCH_FAVORITES_OK:True, andRECENTS_FAVORITES_SUPPORT_BUNDLE_OK:True - graph search seam: search the hosted graph from current snapshots, locate nodes/connections through existing selection and viewport commands, and expect
GRAPH_SEARCH_LOCATE_OK:True,GRAPH_SEARCH_SCOPE_FILTER_OK:True, andGRAPH_SEARCH_VIEWPORT_FOCUS_OK:True - command palette productivity: group palette actions by the existing command descriptor group, surface disabled reasons from the shared command route, keep a bounded in-memory recent-action section, and prove toolbar/palette/context-menu projection from the same descriptors with
COMMAND_PALETTE_GROUPING_OK:True,COMMAND_PALETTE_DISABLED_REASON_OK:True,COMMAND_PALETTE_RECENT_ACTIONS_OK:True,COMMAND_PROJECTION_UNIFIED_OK:True,COMMAND_PALETTE_OK:True,TOOLBAR_DESCRIPTOR_OK:True,CONTEXT_MENU_DESCRIPTOR_OK:True,COMMAND_DISABLED_REASON_OK:True,INTERACTION_FEEDBACK_OK:True, andCANVAS_FOCUS_RECOVERY_OK:True - navigation productivity: keep graph search, command palette, back/forward history, scope breadcrumbs, and focus restore host-owned on top of existing selection/scope/viewport commands, and expect
NAVIGATION_PRODUCTIVITY_PROOF_OK:True,NAVIGATION_PRODUCTIVITY_HANDOFF_OK:True, andNAVIGATION_SCOPE_BOUNDARY_OK:True - proof mode: emit the
AUTHORING_SURFACE_*markers,COMMAND_SURFACE_OK, and the widenedHOST_NATIVE_METRIC:*lines so you can compare your host with the shipped samples and keep the defended large-tier contract in view throughScaleSmoke - widened hosted tuning: emit
WIDENED_SURFACE_PERFORMANCE_OK:Trueand reuse Widened Surface Performance Recipe so the hosted metrics andQuality/Balanced/Throughputprojection policy stay tied toScaleSmoke - capability breadth: pair the same route with Capability Breadth Recipe and emit the
CAPABILITY_BREADTH_*markers fromAsterGraph.ConsumerSample.Avalonia -- --proof - onboarding markers: keep
CONSUMER_SAMPLE_SCENARIO_GRAPH_OK:True,CONSUMER_SAMPLE_HOST_OWNED_ACTIONS_OK:True,CONSUMER_SAMPLE_SUPPORT_BUNDLE_READY_OK:True,GRAPH_VALIDATION_FEEDBACK_OK:True,GRAPH_FEEDBACK_FOCUS_TARGET_OK:True,GRAPH_READINESS_STATUS_OK:True,FIVE_MINUTE_ONBOARDING_OK:True, andONBOARDING_CONFIGURATION_OK:True - authoring flow markers: keep
AUTHORING_FLOW_PROOF_OK:True,AUTHORING_FLOW_HANDOFF_OK:True, andAUTHORING_FLOW_SCOPE_BOUNDARY_OK:Truetogether with the quick-add, insert-on-wire, reconnect editing, edge multiselect, and wire slicing proof lines - edge interaction markers: keep
EDGE_INTERACTION_CACHE_OK:True,EDGE_DRAG_ROUTE_SIMPLIFICATION_OK:True,SELECTED_EDGE_FEEDBACK_OK:True, andEDGE_RENDERING_SCOPE_BOUNDARY_OK:Truetogether with existing edge quick-tool, toolbar, and geometry evidence - panel projection markers: keep
MINIMAP_LIGHTWEIGHT_PROJECTION_OK:True,INSPECTOR_NARROW_PROJECTION_OK:True,LARGE_GRAPH_PANEL_SCOPE_OK:True, andPROJECTION_PERFORMANCE_EVIDENCE_OK:Truetogether with hosted mini-map policy, selected-parameter inspector evidence, and existing projection metrics - v0.59 handoff markers: keep
LARGE_GRAPH_UX_HANDOFF_OK:True,LARGE_GRAPH_UX_SCOPE_BOUNDARY_OK:True, andV059_MILESTONE_PROOF_OK:Truetogether with the phase 371-374 proof clusters - final handoff markers: keep
EXPERIENCE_POLISH_HANDOFF_OK:True,FEATURE_ENHANCEMENT_PROOF_OK:True, andEXPERIENCE_SCOPE_BOUNDARY_OK:Truetogether so the scope boundary remains explicit - sample-owned content such as the review/audit node family, action ids and titles, and proof labels beyond the defended markers should stay local to your app