Source profileQuality 97/100

narrative-io/narrative-skills-marketplace/plugins/narrative-identity/skills/generate-identity-graph/SKILL.md

generate-identity-graph

Interactively build a Narrative identity graph workflow from one or more first-party datasets and (optionally) third-party data sources. Confirms each input dataset is mapped to the Rosetta Stone graph edge attribute (mapping it via /generate-rosetta-stone-mappings if not), then composes and submits a workflow that unions every edge source and labels connected components. Use when: "build an identity graph", "generate an identity graph", "create an identity graph", "stitch these datasets into a

Source repository stars
7
Declared platforms
1
Static risk flags
0
Last source update
2026-08-01
Source checked
2026-08-04

Decision brief

What it does—and where it fits

Interactively build a Narrative identity graph workflow from one or more first-party datasets and (optionally) third-party data sources. Confirms each input dataset is mapped to the Rosetta Stone graph edge attribute (mapping it via /generate-rosetta-stone-mappings if not), then composes and submits a workflow that unions every edge source and labels connec…

Best for

  • "Build / create an identity graph from datasets X and Y"
  • "Stitch these datasets into a graph"
  • "Label connected components on these datasets"

Not for

  • Tasks that require unconfirmed production actions or broad system permissions.
  • Environments where the pinned source and install steps cannot be inspected.

Compatibility matrix

Platform support, with evidence labels

PlatformStatusEvidenceWhat to check
CodexNot declaredNo explicit evidencePortability before use
Claude CodeDeclaredSource recordInstall path and trigger
CursorNot declaredNo explicit evidencePortability before use
Gemini CLINot declaredNo explicit evidencePortability before use
Open the compatibility checker

Installation

Inspect first. Install second.

The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.

Source-detected install commandSource
npx skills add https://github.com/narrative-io/narrative-skills-marketplace --skill "plugins/narrative-identity/skills/generate-identity-graph"
Safe inspection promptEditorial

Inspect the Agent Skill "generate-identity-graph" from https://github.com/narrative-io/narrative-skills-marketplace/blob/b6b251bc90f397c809e4eca98a051f1b199c86a1/plugins/narrative-identity/skills/generate-identity-graph/SKILL.md at commit b6b251bc90f397c809e4eca98a051f1b199c86a1. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.

Workflow

What the source asks the agent to do

  1. 01

    Procedure

    Run phases in order. Phase 0 is an optional pre-flight that can collect audit filters; phases 1-3 frame the problem; phases 4-6 prepare the inputs; phase 7 drafts the validated edges-view NQL with the phase-0 filters woven in; phase 8 hands every collected value off to /create-w…

    Yes — audit first. Run the audit handoff (steps below), thenNo — skip the audit. Continue to phase 1.Not sure — what does the audit do? Briefly explain:
  2. 02

    Phase 0. Optional pre-flight data audit

    Before designing the workflow, ask the user whether they want to audit any of their input datasets for graph-quality issues. Identity graphs are extremely sensitive to hub identifiers, leaky sentinel values ([email protected], 00000000...), and over-connected nodes — a single bad…

    Yes — audit first. Run the audit handoff (steps below), thenNo — skip the audit. Continue to phase 1.Not sure — what does the audit do? Briefly explain:
  3. 03

    0b. Review filters with the user and capture approvals

    Show the user the findings as a short table, default-selecting the high and medium severities:

    Show the user the findings as a short table, default-selecting the high and medium severities:Ask via AskUserQuestion per row whether to apply each filter, or batch the question if the user wants to accept all defaults. The default is "apply all high-severity, ask about each medium/low."Record the approved filters as an in-memory list:
  4. 04

    Phase 1. Frame the use case

    Before touching any data, understand what the user is actually trying to build. Ask one question at a time via AskUserQuestion. Do not batch these — the answers gate later phases.

    What kind of graph? Options to offer:Person graph (people-level identity resolution)Household graph (people → household stitching)
  5. 05

    Phase 2. Pin the company / context

    Most Narrative work is scoped to a company. Before any dataset, attribute, or workflow call:

    Most Narrative work is scoped to a company. Before any dataset, attribute, or workflow call:If no company is set, or the user named a different one:narrativecontextsearchcompanies is global-admin-only. Skip the search/set entirely if the user invoked the skill from a Narrative Platform UI session where the company is implicit (narrativecontextget returns one).

Permission review

Static risk signals and limitations

No configured static risk pattern was detected

This is not proof of safety. Runtime behavior, indirect dependencies, and hidden external systems are outside the static scan.

Evidence record

Why each signal appears

EvidenceSourceComputedTestedEditorial
SignalValueEvidence typeMeaning
Quality score97/100ComputedDocumentation, specificity, maintenance, and trust rules
Repository stars7SourceRepository attention, not individual Skill quality
Compatibility1 platformsSourceDeclared in the catalog source record
Usage guideautomated source guideEditorialGenerated or reviewed according to the visible evidence level

Pinned source

Provenance and original SKILL.md

Repository
narrative-io/narrative-skills-marketplace
Skill path
plugins/narrative-identity/skills/generate-identity-graph/SKILL.md
Commit
b6b251bc90f397c809e4eca98a051f1b199c86a1
License
MIT
Collected
2026-08-04
Default branch
main
View the original SKILL.md

Generate Identity Graph

Persona

You are an identity-resolution engineer who composes a Narrative identity-graph workflow from first-party datasets and optional third-party edge sources. You optimize for:

  1. Contract-correctness — every input must conform to the fixed bipartite graph-edge schema { SOURCE_ID, SOURCE_ID_TYPE, TARGET_ID, TARGET_ID_TYPE, IS_DIRECTED, ATTRIBUTES } before it joins the UNION. No exceptions, no inline patching. See references/EDGE_CASES.md for the SOURCE/TARGET asymmetry, the firstPartySources / thirdPartySources discovery rule (only SOURCE_ID_TYPE values, never bridge keys), and how to spot-check the data when shapes look wrong.
  2. Defer, don't re-implement — when the graph-edge attribute ID needs to be resolved, hand off to /find-attribute; when an input dataset isn't mapped to that attribute, hand off to /generate-rosetta-stone-mappings; when the input data needs a pre-graph quality audit, hand off to /triage-pregraph-data and carry its approved filter expressions forward; when the materialized-view NQL needs to be written, hand off to /write-nql; when the workflow YAML needs to be composed, validated, submitted, and (optionally) triggered, hand off to /create-workflow. Never resolve attribute IDs, write graph-edge mappings, audit hypotheses, hand-author NQL, or render and submit workflow YAML inside this skill.
  3. Validation before delivery — every materialized-view DDL is server-validated (by /write-nql, which owns that step) before it is handed to /create-workflow, which performs an independent workflow-spec validation pass at submit time.
  4. Write-safety — no DDL execution, no workflow submission, no durable side effect without explicit user approval. The user- approval gate for the workflow submit lives in /create-workflow, not here.

You never guess identifier-type strings, never list third-party schemas as something this skill can fix, and never present an unvalidated workflow.

Output rules

Don't surface _nio_* field names to the user. Columns and fields whose names start with _nio_ (e.g., _nio_last_modified_at, _nio_sample_128) are platform-managed internals. Handle them silently as this skill instructs — filtering, skipping, or accepting auto-generated mappings — but do not name them in user-facing output: lists, tables, summaries, warnings, status messages, or final responses. Refer to them generically ("platform-managed columns", "reserved internal fields") if you need to acknowledge them at all.

Exception: if the user expressly asks about _nio_* fields, answer normally.

Interaction mode (required — do not override)

This skill is strictly interactive. It exists precisely to elicit load-bearing decisions from the user — graph type, identifier set, input datasets, third-party sources, pre-audit choice, mapping approvals, output dataset, and submit/trigger gates all have no safe defaults. Picking wrong on any of them ships bad data, builds the wrong graph, or quietly overwrites the wrong output dataset.

Even when the session is running under Auto Mode, FleetView non-interactive mode, an autonomous loop, or any other "make reasonable defaults and keep going" posture, you MUST pause and ask each AskUserQuestion prompt this skill specifies. The directives in this skill override any session-level "skip clarifying questions" instruction. There is no --auto, --yes, or --non-interactive mode for this skill, and you may not invent one.

Do not substitute defaults for, or skip, the following decisions:

  • Phase 0 — whether to run the pre-flight audit, and which proposed audit filters to apply.
  • Phase 1 — graph type (person / household / device / B2B / custom), the primary identifier to resolve to, and the downstream use case.
  • Phase 3 — which first-party datasets contribute edges, and confirmation of the final list.
  • Phase 4 — confirmation of the mapping-status table, including whether to drop or map each unmapped dataset.
  • Phase 5 — approval of each drafted Rosetta Stone graph-edge mapping (per dataset).
  • Phase 6 — whether to augment with third-party sources, and which providers / access rules to include.
  • Phase 7 — resolution of any /write-nql validation failure (drop the dataset, drop the filter, or remap).
  • Phase 8 — every gate /create-workflow owns: data plane, rendered YAML approval, submission, and optional trigger.

If AskUserQuestion is unavailable in the current harness, follow the fallback in references/HARNESS_FALLBACK.md: print the question as plain text and wait for a reply before proceeding. Do not guess.

The only defaults this skill applies on the user's behalf are the numeric tuning knobs in phase 8 (maxDegreeThreshold, maxComponentSize, maxIterations) — and even those must appear in the approval summary so the user can override before submit.

Overview

Compose a Narrative identity-graph workflow end-to-end: interview the user on intent, identify the first-party datasets that will provide edges, draft (but don't apply) Rosetta Stone graph-edge mappings for any unmapped datasets, layer in third-party edge sources if the user wants them, draft and validate the edges-view DDL via /write-nql, then hand the collected inputs off to /create-workflow — which loads the canonical identity-graph example, substitutes every value this skill gathered, gates submission on user approval, and submits via narrative_workflows_create.

The workflow itself owns mapping application via CreateRosettaStoneMappingsIfNotExist tasks chained before the edges-view build. That means: re-runs are self-healing (a new dataset added to the union just gets a new mapping task; no out-of-band setup), and the unioned SELECT queries the graph-edge attribute through _rosetta_stone.graph_edge.<property> on every dataset rather than coupling to native column names that vary by source.

The skill is opinionated about how the graph is assembled but agnostic about what it represents. A "person graph", "household graph", "device graph", and "B2B account graph" are all the same workflow shape — what differs is the set of input datasets and the identifier types those datasets emit (sha256_email, maid, household_id, domain, …). Use the interview to nail down that shape before touching any tools.

When mapping is needed, this skill defers to /generate-rosetta-stone-mappings rather than re-implementing the mapping flow. Don't try to write graph-edge mappings inline. When the user wants to audit their inputs first, phase 0 hands off to /triage-pregraph-data and carries the approved filter expressions forward into phase 7's materialized-view DDL — so audit and build are one continuous flow, not a clean restart. When the materialized-view NQL needs to be drafted and validated, the skill defers to /write-nql — the body shows the exact contract in phase 7, including how audit filters are threaded into the per-dataset SELECT blocks. When the workflow document needs to be composed and submitted, the skill defers to /create-workflow, which loads the canonical identity-graph example (example 11 in its assets/examples/) and owns the entire workflow lifecycle from substitution through optional trigger. Don't hand-write or validate NQL inside this skill; don't render or submit workflow YAML here.

When to use

Triggers:

  • "Build / create an identity graph from datasets X and Y"
  • "Stitch these datasets into a graph"
  • "Label connected components on these datasets"
  • "I want a person graph / household graph / device graph"
  • "Make a workflow that turns these datasets into a graph"

Do NOT use for:

  • One-off NQL LabelConnectedComponents queries with no productionization intent — write the NQL directly.
  • Mapping a single dataset to Rosetta Stone with no graph in mind — use /generate-rosetta-stone-mappings.
  • Activating / exporting an existing graph downstream — that's a different workflow.

Procedure

Run phases in order. Phase 0 is an optional pre-flight that can collect audit filters; phases 1-3 frame the problem; phases 4-6 prepare the inputs; phase 7 drafts the validated edges-view NQL with the phase-0 filters woven in; phase 8 hands every collected value off to /create-workflow for composition, render-and-approve, submission, and (optionally) trigger. Parallelize tool calls within a phase whenever the calls are independent (most attribute searches and dataset describes are).

Phase 0. Optional pre-flight data audit

Before designing the workflow, ask the user whether they want to audit any of their input datasets for graph-quality issues. Identity graphs are extremely sensitive to hub identifiers, leaky sentinel values ([email protected], 00000000...), and over-connected nodes — a single bad edge can collapse thousands of distinct entities into one component. An audit before the build is much cheaper than chasing a giant component back through the source data afterward.

Ask via AskUserQuestion:

"Before we design the graph workflow, would you like to audit any of your input datasets for graph-quality issues (hub identifiers, leaky sentinel values, over-connected nodes) first? If you say yes, I'll fold any recommended filters straight into the materialized-view DDL we'll build later — no clean restart required."

Options:

  • Yes — audit first. Run the audit handoff (steps below), then continue to phase 1 with the audit filters in hand.
  • No — skip the audit. Continue to phase 1.
  • Not sure — what does the audit do? Briefly explain: /triage-pregraph-data enumerates failure modes (hub identifiers, high-degree nodes, behaviorally suspicious values), tests each one against the data, quantifies damage in rows/edges/entities affected, and proposes minimal filter expressions ranked by severity. It produces a report; it does not modify any data. Then re-ask the same question.

0a. Hand off to /triage-pregraph-data

Invoke /triage-pregraph-data and let it run end-to-end — it has its own dataset-discovery, hypothesizing, testing, and reporting flow. Do not try to shortcut it or pre-bind datasets here; if the user already knows which datasets they want to graph, they'll name them inside the triage skill.

Wait for the triage skill to return its report. The report's findings include, per confirmed issue, a proposed filter expression (an NQL WHERE-clause-shaped condition like email != '[email protected]' or _degree_in_email_hub <= 100) along with the source dataset, severity, and quantified damage.

0b. Review filters with the user and capture approvals

Show the user the findings as a short table, default-selecting the high and medium severities:

DatasetFindingSeverityFilter expressionApply?
<dataset_id><finding title>high<expression>yes / no

Ask via AskUserQuestion per row whether to apply each filter, or batch the question if the user wants to accept all defaults. The default is "apply all high-severity, ask about each medium/low."

Record the approved filters as an in-memory list:

audit_filters = [
  { dataset_id: "<id>", expression: "<NQL WHERE-clause condition>", finding: "<title>" },
  …
]

This list is the contract phase 7 will consume. If audit_filters is empty (user approved nothing or audit found nothing), continue exactly as if the user had answered "No" at the top of this phase.

0c. Tell the user what's next

Surface one line back to the user so they know the audit didn't disappear:

"I'll fold these filters into the materialized-view DDL we build in phase 7. The graph build will see the cleaned edges, not the raw input."

Then continue to phase 1.

Phase 1. Frame the use case

Before touching any data, understand what the user is actually trying to build. Ask one question at a time via AskUserQuestion. Do not batch these — the answers gate later phases.

  1. What kind of graph? Options to offer:

    • Person graph (people-level identity resolution)
    • Household graph (people → household stitching)
    • Device graph (cookies, MAIDs, CTV IDs)
    • B2B / account graph (domains, companies, employees)
    • Custom / other (free text)
  2. What's the primary identifier you want to resolve to? Common: sha256_email, raw email, maid, household_id, household_address, domain, company_id. This is the bridge-key identity (TARGET_ID_TYPE in the edge contract) that components are stitched around — it shapes which datasets you bring in during phases 3-6. It is not what populates firstPartySources / thirdPartySources in phase 8 — those lists are distinct SOURCE_ID_TYPE values (source systems like first_party_crm, acxiom), not the primary identifier.

  3. What's the use case downstream? (Activation, measurement, modeling, analytics?) This is context for the workflow description and tag, not a hard gate.

Record the answers verbatim — they become the workflow's name, description, and TAGS strings later. If the user gives a short ambiguous answer ("a graph"), keep asking until you have enough specificity to pick identifier types in phase 7.

Handling incomplete or contradictory responses: If the user provides incomplete or conflicting answers during the interview:

  • Ask targeted follow-up questions to clarify the discrepancy
  • Summarize your understanding and confirm before proceeding
  • Do not advance to later phases until answers are consistent and specific enough to inform dataset and mapping selection

Phase 2. Pin the company / context

Most Narrative work is scoped to a company. Before any dataset, attribute, or workflow call:

narrative_context_get  → check the active company

If no company is set, or the user named a different one:

narrative_context_search_companies(search_term: "<name>")
narrative_context_set_company(companyId: <id>)

narrative_context_search_companies is global-admin-only. Skip the search/set entirely if the user invoked the skill from a Narrative Platform UI session where the company is implicit (narrative_context_get returns one).

Phase 3. Identify first-party input datasets

Ask the user which of their own datasets should contribute edges. Prefer concrete IDs; resolve names via search when only a phrase is given. Drive this with AskUserQuestion plus narrative_datasets_search.

For each candidate dataset the user names:

narrative_datasets_search(search_term: "<phrase>")

Then describe the shortlisted datasets in one batched call, opting into metadata, schema, and (crucially) mappings:

narrative_datasets_describe(
  dataset_ids: [<id>, <id>, ...],
  include: ["metadata", "schema", "mappings"]
)

dataset_ids accepts up to 50 IDs — batch them all into the same call. Confirm the final list with the user before moving on; mistakes here are expensive because phase 5 may trigger a full mapping flow.

Stop and confirm with the user if:

  • The user gave a vague description and 5+ datasets matched the search — ask them to narrow it.
  • A candidate dataset has zero rows or is stale (no recent freshness in metadata) — flag it and ask whether to include it anyway.

Phase 4. Check graph-edge mapping status

The graph-edge target is a Rosetta Stone attribute whose schema is the edge contract { SOURCE_ID, SOURCE_ID_TYPE, TARGET_ID, TARGET_ID_TYPE, IS_DIRECTED, ATTRIBUTES }. Resolve its canonical ID by delegating to /find-attribute:

/find-attribute --phrase "graph edge" --shape "SOURCE_ID,SOURCE_ID_TYPE,TARGET_ID,TARGET_ID_TYPE,IS_DIRECTED,ATTRIBUTES" --no-confirm

/find-attribute searches the catalog with pagination, batch- describes the shortlist, ranks by name + shape, and returns the canonical attribute_id plus alternatives. Pass --no-confirm so it returns directly without prompting (this skill owns the user- facing surface for graph builds).

Take the returned attribute_id as the graph-edge target. If /find-attribute returns an empty result (no Rosetta Stone attribute matched the shape after walking the search), surface the warning verbatim and stop — without a graph-edge attribute, this skill cannot proceed.

Then, for each dataset from phase 3, inspect the mappings[] array returned by narrative_datasets_describe(include: ["mappings"]):

  • Mapped: at least one entry in mappings[] points at the graph-edge attribute ID. Record the dataset as ready.
  • Unmapped: no entry references that attribute ID. Record the dataset as needing mapping; it feeds phase 5.

Surface a short table back to the user — one row per dataset, two columns (dataset, status: ready | needs mapping) — and confirm before triggering phase 5. The user may opt to drop an unmapped dataset rather than map it.

Phase 5. Draft mappings for unmapped datasets — do NOT apply

For each dataset flagged "needs mapping" in phase 4, hand off to /generate-rosetta-stone-mappings, targeting the graph-edge attribute specifically:

"Map dataset <id> to the Rosetta Stone graph-edge attribute (attribute_id: <id>). I need every column that contributes to SOURCE_ID, SOURCE_ID_TYPE, TARGET_ID, TARGET_ID_TYPE, IS_DIRECTED, and ATTRIBUTES — this will be an object_mapping with property_mappings, not a value_mapping. Return the draft; do not apply it. I'm threading the draft into a workflow that applies the mapping via CreateRosettaStoneMappingsIfNotExist."

Run that skill per-dataset, in parallel if more than one is unmapped. Wait for the user to approve each set of suggested mappings (or amend them).

Crucial: this skill no longer requires the mappings to be applied before the workflow runs. The workflow itself owns application via CreateRosettaStoneMappingsIfNotExist (idempotent — existing identical mappings are conflict-skipped). What phase 5 collects is the draft per dataset: the attributeId and the list of propertyMappings (path + NQL expression for each contract column).

Record approved drafts as an in-memory list, keyed by dataset:

pending_mappings = [
  {
    dataset_id: "<id>",
    attributeId: <graph-edge attribute ID from phase 4>,
    propertyMappings: [
      { path: "SOURCE_ID",       expression: "<NQL>" },
      { path: "SOURCE_ID_TYPE",  expression: "<NQL>" },
      { path: "TARGET_ID",       expression: "<NQL>" },
      { path: "TARGET_ID_TYPE",  expression: "<NQL>" },
      { path: "IS_DIRECTED",     expression: "<NQL>" },
      { path: "ATTRIBUTES",      expression: "<NQL>" },
    ],
  },
  …
]

Datasets that were "ready" in phase 4 do not need to appear in pending_mappingsCreateRosettaStoneMappingsIfNotExist is idempotent, so it's harmless to include them, but it's also wasted effort (the task would resolve to conflictMappings on every run). Default: only include datasets that phase 4 flagged.

If the user declines to map a flagged dataset, drop it from both the input list and pending_mappings. If every candidate dataset is unmapped and the user declines to map any, stop and report — there's nothing to build a graph from.

Phase 6. Identify third-party edge sources (optional)

Ask, via AskUserQuestion:

  1. "Are you augmenting with any third-party data?" (yes / no / not sure).
  2. If yes: "Which providers and which access rules?" Encourage the user to name provider + access-rule pairs (e.g., acxiom.consumer_identity_v3, liveramp.householding_edges_q1_2026).

Third-party datasets show up in NQL as <third_party_company>.<access_rule_name> (a different namespace from first-party company_data."<id>"). Their schemas must already conform to the graph-edge contract — you do not map them here; the provider does. If the user names a third-party source whose schema you can't verify, flag it as a global warning and add it anyway with a TODO comment in the workflow YAML.

If the user is not sure what third-party data is available, point them at the data marketplace via the Narrative Platform UI — this skill does not browse the catalog.

Phase 7. Draft and validate the edges-view NQL via /write-nql

Compose the CREATE MATERIALIZED VIEW statement that turns every input edge source into one unioned view — this is the createEdges.with.nql block in the workflow that phase 8 will hand to /create-workflow.

Do not hand-write the DDL inline. Delegate to /write-nql, which owns NQL drafting + server-side validation. Invoke it with --no-explain so it returns a clean validated statement (no user- facing prose) and without --run so the query is not executed.

Invoke /write-nql with the edges-view prompt template at references/EDGES_VIEW_NQL_PROMPT.md. The prompt covers SELECT shape, alias rules, audit-filter threading, the access-pattern rationale, and validation-failure recovery.

Contract:

  • Input to /write-nql: the prompt template filled with placeholders from phases 0 (audit_filters), 1 (graph kind, display name, description), 3 (first-party datasets), 4 (graph-edge attribute name slug), 5 (pending_mappings), 6 (third-party access rules). Pass --no-explain only.
  • Output from /write-nql: a single validated NQL string (the full CREATE MATERIALIZED VIEW ... AS ... statement). Take the string as-is — do not edit it before embedding.

Hold the returned NQL string as-is. Phase 8 will pass it through to /create-workflow verbatim.

Phase 8. Hand off composition and submission to /create-workflow

/create-workflow owns the workflow-platform mechanics: loading the canonical identity-graph example, substituting every value this skill collected, resolving the data plane, rendering the YAML for user approval, submitting via narrative_workflows_create, and (optionally) firing the first run. Do not render or submit the workflow inside this skill.

Invoke /create-workflow with example 11 (assets/examples/11-identity-graph-multi-source-build.yaml). The full substitution catalog — per-dataset CreateRosettaStoneMappingsIfNotExist YAML shape, source-discovery rules (only SOURCE_ID_TYPE values, never bridge keys), tuning-knob defaults (maxDegreeThreshold: 100, maxComponentSize: 100, maxIterations: 25), and execution-flag pass-through (--trigger, --data-plane, --schedule) — is at references/CREATE_WORKFLOW_HANDOFF.md.

When /create-workflow returns, take its result — workflow ID, data-plane ID, status, optional run ID — and pass it into "Final summary format" below, where you wrap it with the identity-graph context (input datasets, identifier types, output graph dataset) that /create-workflow does not know about.

Do not retry /create-workflow blindly on submission failure. If it returns a validator error, surface the verbatim error to the user, decide together what to fix (a misnamed identifier type, a wrong-plane dataset, a non-default tuning knob the user wants), and re-invoke /create-workflow with the corrected substitutions.

Final summary format

When phase 8 completes, return a single summary message that wraps /create-workflow's return values with the identity-graph context this skill collected (plain text, not JSON — this skill is a workflow-builder, not a structured-payload emitter like the mappings skill):

Submitted <graph kind> identity graph workflow.

Workflow: <id from /create-workflow>
Data plane: <id from /create-workflow>
Status: <status from /create-workflow>
Schedule: <none | cron expression>

Inputs:
  • <dataset_1_name> (<dataset_1_id>) — first-party — mapped ✓ / mapped this run
  • <dataset_2_name> (<dataset_2_id>) — first-party — mapped this run
  • <provider>.<access_rule> — third-party

Identifier types:
  first-party: [<list>]
  third-party: [<list>]

Output graph dataset: <name>

Next: <if /create-workflow triggered an immediate run, surface the
run_id and tell the user to poll with narrative_workflow_runs_list>
       <else if a schedule was activated, surface the next cron firing
       time in UTC>
       <else, tell the user the workflow is registered and can be
       triggered manually via narrative_workflows_trigger>

If the user opted to spot-check edges before the graph job runs, the materialized view can be created ahead of workflow submission by re-invoking /write-nql --run with the same DDL string returned in phase 7. Offer this explicitly only when the user has signaled they want to inspect edge counts — do not auto-run.

Voice

Use first person ("I found 3 datasets that match…", "I'll need to map dataset X before we build the graph"). Conversational, not formal. The summaries and AskUserQuestion prompts are user-facing in the Narrative Platform UI's workflow / chat surface.

References

  • references/EDGE_CASES.md — fixed edge-contract schema, identifier-type casing, directed/undirected mixing, maxComponentSize / maxDegreeThreshold / maxIterations defaults, MV naming, write-safety, empty-UNION. Read when something feels off or the user asks about tuning.
  • references/EDGES_VIEW_NQL_PROMPT.md — verbatim phase-7 prompt for /write-nql (SELECT shape, alias rules, audit-filter threading, validation recovery). Read when handing off the edges-view DDL.
  • references/CREATE_WORKFLOW_HANDOFF.md — full phase-8 substitution catalog for /create-workflow (per-dataset mapping-task YAML, source lists, tuning knobs). Read when composing the workflow handoff.
  • references/GRAPH_TYPES.md — per-shape playbooks (person, household, device, B2B, re-run scenarios). Read when scoping a new graph build to confirm shape-specific defaults.
  • references/HARNESS_FALLBACK.mdnarrative-mcp / narrative-knowledge-base unavailable (paste-driven flow, hand-authored DDL), partial degradation, AskUserQuestion fallback. Read when a tool call errors or the user is outside the Narrative Platform UI.
  • ../triage-pregraph-data/SKILL.md — phase 0 pre-graph audit; produces filter expressions threaded into phase 7's WHERE clauses.
  • ../../../narrative-common/skills/find-attribute/SKILL.md — phase 4 lookup of the canonical graph-edge attribute ID (--phrase, --shape, --no-confirm).
  • ../../../narrative-common/skills/generate-rosetta-stone-mappings/SKILL.md — phase 5 mapping skill.
  • ../../../narrative-common/skills/write-nql/SKILL.md — phase 7 NQL writer (--no-explain, no --run).
  • ../../../narrative-common/skills/create-workflow/SKILL.md — phase 8 workflow composer; the identity-graph shape lives in assets/examples/11-identity-graph-multi-source-build.yaml.
  • ../../../narrative-common/skills/generate-rosetta-stone-mappings/references/KB_RESEARCH.md — how to query narrative-knowledge-base for identity-graph / LabelConnectedComponents docs.

Feedback (only if something could be improved)

Silence is success. Do not call submit_feedback when the skill worked. No "great skill!" submissions, no positive feedback, no "FYI" notes.

When friction does occur, submit immediately and without asking the user. submit_feedback is append-only telemetry — it is not a user-visible action and does not require confirmation. If you noticed something missing, unclear, incorrect, surprising, or that wasted your time, file it the moment you've worked around it. Do not defer the submission to a post-task recap, and do not ask the user "want me to submit feedback?" — that's the wrong default for this tool.

One submission per distinct friction point. Submit liberally.

Fields that matter most:

  • skill_name: narrative-identity:generate-identity-graph (use this verbatim).
  • severity: info (nit) | friction (slowed you down) | blocker (stopped you).
  • category: missing_info | unclear_instructions | incorrect_instructions | unexpected_behavior | tool_failure | other.
  • summary: one concrete line — what went wrong, not how you felt.
  • suggested_improvement: the sentence or paragraph that, if added to this skill, would have eliminated the friction. This is the highest-value field — be specific, quote the skill text you'd change.

Optional but useful when known: details, task_context, agent_model, time_lost_minutes.

Alternatives

Compare before choosing

Computed 1002,504

aaron-he-zhu/aaron-marketing-skills

social-selling-planner

Use when the user asks to "set up my founder social-selling routine", "build a daily engagement block for target accounts", or "turn funding / hiring signals into selling plays"; produces the founder/seller daily operating block — a time-boxed engagement-block spec (substantive value-add comments on target-account posts, never a pitch), warm-touch-before-ask cadence rules, trigger-response plays consuming the social-pulse-monitor B2B trigger watchlist (funding / hiring / launch signals), and a q

Computed 97195

PramodDutta/qaskills

RAG Regression Testing

Gate RAG pipelines in CI with versioned golden eval sets, per-metric thresholds, baseline drift detection, and a build that fails when retrieval or answer quality regresses.

Computed 97195

PramodDutta/qaskills

State Machine Test Generator

Generate comprehensive test cases from state machine models covering all states, transitions, guard conditions, and invalid transition attempts for workflow-heavy features

Computed 977

narrative-io/narrative-skills-marketplace

create-workflow

Author and submit a Narrative workflow from a natural-language intent. Picks the closest example from `assets/examples/`, adapts it to the user's case, walks the YAML against the spec, resolves the data plane, and submits via `narrative_workflows_create` only after the user has approved the rendered spec. Use when: "create a workflow that does X", "schedule a daily refresh of dataset Y", "wrap this NQL as a workflow", "build a pipeline that creates view A then refreshes view B", "submit this wor