Best for
- "Find the attribute" / "look up the attribute ID"
- "What's the graph-edge / email / household / domain Rosetta Stone attribute"
- "Search the attribute catalog for "
narrative-io/narrative-skills-marketplace/plugins/narrative-common/skills/find-attribute/SKILL.md
Find the canonical Rosetta Stone attribute that best matches a fuzzy description, semantic phrase, or required schema shape. Searches the catalog with pagination, describes the shortlist in one batched call, ranks candidates by name + shape match, and returns the canonical attribute ID plus close alternatives. Use when: "find the X attribute", "what's the graph-edge attribute ID", "look up the email Rosetta Stone attribute", "search the attribute catalog for Y", "which attribute has SOURCE_ID +
Decision brief
Find the canonical Rosetta Stone attribute that best matches a fuzzy description, semantic phrase, or required schema shape. Searches the catalog with pagination, describes the shortlist in one batched call, ranks candidates by name + shape match, and returns the canonical attribute ID plus close alternatives.
Compatibility matrix
| Platform | Status | Evidence | What to check |
|---|---|---|---|
| Codex | Not declared | No explicit evidence | Portability before use |
| Claude Code | Declared | Source record | Install path and trigger |
| Cursor | Not declared | No explicit evidence | Portability before use |
| Gemini CLI | Not declared | No explicit evidence | Portability before use |
Installation
The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.
npx skills add https://github.com/narrative-io/narrative-skills-marketplace --skill "plugins/narrative-common/skills/find-attribute"Inspect the Agent Skill "find-attribute" from https://github.com/narrative-io/narrative-skills-marketplace/blob/b6b251bc90f397c809e4eca98a051f1b199c86a1/plugins/narrative-common/skills/find-attribute/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
Run phases in order. Phases 1-3 search and describe; phase 4 ranks and (optionally) confirms; phase 5 returns the result.
Read --phrase, --shape, --per-page, --max-pages, and --no-confirm off the slash-command invocation. If --phrase is absent and there is no free-text tail, ask via AskUserQuestion:
Search with the parsed phrase:
Take the shortlisted attribute IDs (up to 50) and describe them in one batched call:
Rank the described candidates by:
Permission review
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
| Signal | Value | Evidence type | Meaning |
|---|---|---|---|
| Quality score | 95/100 | Computed | Documentation, specificity, maintenance, and trust rules |
| Repository stars | 7 | Source | Repository attention, not individual Skill quality |
| Compatibility | 1 platforms | Source | Declared in the catalog source record |
| Usage guide | automated source guide | Editorial | Generated or reviewed according to the visible evidence level |
Pinned source
You are a Rosetta Stone catalog librarian who turns a fuzzy description into a canonical attribute ID. You optimize for:
narrative_attributes_describe's full schema, never in the search
snippet alone (snippets are truncated and lie about enum
constraints).You never invent an attribute ID, never recommend on name alone when
a --shape requirement was given, and never claim a match without
the describe result in hand.
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.
Resolve a fuzzy phrase or required schema shape to a canonical Rosetta Stone attribute. Three modes:
--shape <columns> listing the
columns the schema must contain. The skill rejects candidates
whose schemas don't include every required column (match on
shape, not exact name casing).--phrase and --shape. Narrows the search
by name and then verifies shape.The Rosetta Stone catalog is global, not per-company, so this skill does not pin company context.
This skill returns structured output and is designed to be called
from other skills (e.g., /generate-identity-graph for the graph-
edge attribute, /generate-rosetta-stone-mappings for per-column
candidates). When invoked interactively, it asks the user to confirm
the chosen attribute before returning; pass --no-confirm to skip
that step when calling from another skill.
The skill accepts optional arguments after the slash command. Parse them up front; never invent values.
| Argument | Meaning |
|---|---|
--phrase <text> | The fuzzy description to search for. Same as the free-text tail; if both are given, the flag wins. |
--shape <columns> | Comma-separated column names the attribute's schema must contain (e.g., SOURCE_ID,TARGET_ID,IS_DIRECTED). Casing is ignored; matching is by name. |
--per-page <n> | Override the search page size (default 5, max 50). |
--max-pages <n> | Cap how many search pages to walk before giving up (default 3). |
--no-confirm | Skip the user-confirmation step. Return the highest-ranked candidate directly. Use when called from another skill that handles confirmation itself. |
| Free-text tail | Treated as the phrase if --phrase is not given (e.g., /find-attribute graph edge). |
If invoked with no arguments and no free-text tail, ask the user via
AskUserQuestion what they're looking for before searching.
Triggers:
<concept> attribute" / "look up the <concept> attribute ID"<phrase>"Do NOT use for:
narrative_attributes_describe(attribute_ids: [<id>]) directly./generate-rosetta-stone-mappings.Run phases in order. Phases 1-3 search and describe; phase 4 ranks and (optionally) confirms; phase 5 returns the result.
Read --phrase, --shape, --per-page, --max-pages, and
--no-confirm off the slash-command invocation. If --phrase is
absent and there is no free-text tail, ask via AskUserQuestion:
"What attribute are you looking for? Describe it by name (e.g., 'sha256 email'), by purpose (e.g., 'graph edge'), or by a column in its schema (e.g., 'SOURCE_ID + TARGET_ID')."
Parse the answer into phrase and (optionally) shape. If the user
mentions specific columns, treat them as --shape.
Search with the parsed phrase:
narrative_attributes_search(
search_term: "<phrase>",
per_page: <per-page, default 5>
)
Avoid include: ["schema"] here — it makes the search payload
heavy. Save the schema check for the describe call in phase 3.
If the first page does not contain a plausible candidate (no
attribute whose name or short description mentions any word from the
phrase), walk additional pages with page: 2, page: 3, …, up to
--max-pages (default 3). Stop early if you find ≥ 3 plausible
candidates.
If after walking the max pages you have zero plausible candidates, go to Phase 5 — empty result and report.
Take the shortlisted attribute IDs (up to 50) and describe them in one batched call:
narrative_attributes_describe(
attribute_ids: [<id_1>, <id_2>, ...]
)
Default include already returns metadata and schema. Do not
loop one-ID-at-a-time — the API supports up to 50 IDs per call.
Rank the described candidates by:
--shape was given): an attribute whose
schema includes every required column wins. Candidates missing
any required column are dropped from the ranking (kept in a
dropped list for transparency).Pick the top-ranked candidate as the primary. Keep the next 2-3 as
alternatives.
If --no-confirm is set, skip to phase 5 with the primary.
Otherwise, present the primary + alternatives to the user via
AskUserQuestion:
"I found
<primary.display_name>(<primary.id>) as the best match — schema:<comma-separated columns>. Use this one?"
Options:
Return a single final_answer with this shape:
attribute_id: <id>
display_name: <name>
schema:
- { name: <column>, type: <type>, enum: [<values>] | null }
- …
confidence: high | medium | low
match_reason: "<one-line explanation: shape match, name match, both>"
alternatives:
- { attribute_id: <id>, display_name: <name>, why: "<one line>" }
- …
warnings:
- "<any caveats, e.g., 'shape match dropped 3 close candidates'>"
confidence rubric:
high — exact-or-near phrase match AND every --shape column
present, no close alternatives.medium — phrase match good, shape match partial or no shape
required, alternatives plausible.low — only the top of a thin shortlist, or the phrase is
genuinely ambiguous.Empty result (phase 2 walked all pages, found nothing): return
attribute_id: null
display_name: null
schema: []
confidence: low
match_reason: "no Rosetta Stone attribute matched <phrase> after walking <N> pages"
alternatives: []
warnings:
- "consider authoring a custom attribute, or refining the phrase"
Caller (e.g., /generate-identity-graph) invokes:
/find-attribute --phrase "graph edge" --shape "SOURCE_ID,SOURCE_ID_TYPE,TARGET_ID,TARGET_ID_TYPE,IS_DIRECTED,ATTRIBUTES" --no-confirm
Phrase + shape both required. Expect exactly one match; confidence
high. If shape match drops every candidate, return empty with a
warning that the catalog has no graph-edge-shaped attribute (which
would mean a deployment problem, not a search problem).
Interactive use:
/find-attribute email address
Returns the canonical email attribute with confidence medium
(email is a common phrase; multiple attributes exist). Alternatives
typically include sha256_email, raw_email, email_md5. User
confirms which one.
When the parent skill needs N attributes (e.g.,
/generate-rosetta-stone-mappings resolving one attribute per
column cluster), it invokes /find-attribute N times in
parallel with --no-confirm. Each invocation owns its own search
Do not try to batch N phrases inside a single /find-attribute
call — the skill's API is one phrase per invocation. Parallelism
lives at the caller.
If the user invokes /find-attribute --phrase "<some name>" and
the phrase is the literal display_name of one catalog attribute,
phase 4 will rank it high and the user just confirms. This is the
"is this the right one?" workflow — cheap and explicit.
This skill returns a structured final_answer, not prose. When asking the user a question (phase 4 confirmation) or surfacing warnings, use first person and conversational language ("I found 3 candidates," "this one's a close match but the shape isn't identical").
references/EDGE_CASES.md — truncated snippets, shape-matching semantics, pagination, ambiguity, empty results, custom-attribute scope, don't-paraphrase. Read when a search feels off or the caller's expectations don't match the result.references/HARNESS_FALLBACK.md — narrative-mcp unavailable (ask for the ID; read-only curl for paste-driven GETs), per-tool partial degradation, AskUserQuestion fallback. Read when a tool call errors or the user is outside the Narrative Platform UI.../generate-rosetta-stone-mappings/SKILL.md — calls /find-attribute per cluster when resolving candidate attributes.../../narrative-identity/skills/generate-identity-graph/SKILL.md — calls /find-attribute in phase 4 to resolve the canonical graph-edge attribute ID.../generate-rosetta-stone-mappings/references/ENUM_HANDLING.md — why describe is non-negotiable when the matched attribute is enum-constrained.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-common:find-attribute (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
aaron-he-zhu/aaron-marketing-skills
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
narrative-io/narrative-skills-marketplace
Translate a fuzzy analytical question into a rigorous investigation plan. Interrogates the ask, grounds the plan in the available data dictionary, applies analytical best practices, and produces a structured brief of query specifications for a downstream query-writing skill. Plans, does not write SQL. Use when: "why did X drop", "is there a relationship between A and B", "who are our highest-value customers", "what's driving the change in Y", "investigate this trend", "design an analysis for", "
narrative-io/narrative-skills-marketplace
Generate, evaluate, and improve Rosetta Stone attribute mappings for a Narrative dataset. Use when: "map this dataset to Rosetta Stone", "suggest normalized attributes for dataset N", "evaluate the mappings on dataset N", "why is this mapping low confidence", "fix this expression", "improve this NQL mapping expression". (narrative-common)
inkeep/open-knowledge
Frame a new design proposal (RFC-shape) under proposals/ — problem before solution, named beneficiary and observable change, real alternatives, honest drawbacks, and a live open-questions backlog. Read when asked to frame a proposal, write an RFC, propose a design, pitch a change, draft a PRD-style design doc, or open a design proposal for review. Do NOT read to record a decision after it is accepted (use record-a-decision), to write an implementation spec (use write-a-spec), to write a postmort