agentleFS
Google CloudKnown publisherGoogleCloudPlatform/data-agent-kit-plugin/skills/schema-mapping/SKILL.md

schema-mapping

Skill240 starsChanged 5 months agoApache-2.0View on GitHub

Guides the process of analyzing, mapping, and documenting transformations between source and target schemas for any database, data warehouse, or data platform. Focuses exclusively on creating a high-fidelity mapping plan (Mapping Manifesto). Used when initiating an ETL, ELT, or data integration task with schema mapping specification for multiple tables (i.e. more than 3 tables) before writing code. Do NOT use this skill for basic SQL generation without mapping requirements, or when the user already has a complete mapping specification.

The file

Show its rules and text

We split this skill into the rules it gives an agent

17 rules. About 0 are common, 10 are distinctive, and 7 are very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈10

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 7

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Follow this structured process and procedures for analyzing source-to-target data relationships and creating a high-fidelity Mapping Plan …

    line 15
  2. Distinctive:

    Use this skill when:

    line 23
  3. Distinctive:

    Before creating the plan, you must obtain or request:

    line 35
  4. Very specific:

    KNOWLEDGE_GRAPH: If there's a knowledge graph / property graph available, always inspect the graph for node table definitions, edge table …

    line 47
  5. Distinctive:

    Verify Domain Semantics: Do not rely purely on lexical matching (name similarity).

    line 74
  6. Distinctive:

    Prefer Structured Tables over Generic Key-Value Tables: If the same attribute exists in both a structured column in a domain table and as a …

    line 88
  7. Distinctive:

    If a target field mapping is ambiguous or schema types do not tell the whole story (e.g., verifying if a timestamp is ISO-8601, if a string …

    line 96
  8. Very specific:

    Proactive Inspection: If environment access allows, run platform-specific queries (e.g., SELECT ...

    line 100
  9. Distinctive:

    User Inquiry: If direct access is not possible, output sample queries and ask the user to provide the output to confirm assumptions before …

    line 103
  10. Very specific:

    Constraint Checking: Verify whether the target column has a NOT NULL or REQUIRED constraint in the target schema.

    line 120
  11. Very specific:

    Handling Nullable Gaps: If the target column is nullable, explicitly flag it as NULL or define a default value.

    line 122
  12. Very specific:

    Handling Non-Nullable Gaps: If the target column is NOT NULL, you MUST NOT map it to NULL.

    line 124
  13. Very specific:

    MUST NOT map it to NULL. *(Rationale: Mapping NOT NULL target columns to NULL will cause execution-time database constraint violations and …

    line 125
  14. Distinctive:

    Document potential join challenges:

    line 155
  15. Distinctive:

    Graph Validation: If a graph was identified in input, cross-reference the proposed join conditions with the graph's edge table definitions …

    line 159
  16. Very specific:

    Strict Schema Grounding: Every source table and field name referenced in the mapping plan MUST exactly match the names and data types …

    line 220
  17. Distinctive:

    Exhaustive Field Search: Before declaring a target field as an "Unmapped / Gap", search all available source schemas to verify the data is …

    line 229

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Skill: Semantic Schema Mapping Planning

Follow this structured process and procedures for analyzing source-to-target data relationships and creating a high-fidelity Mapping Plan (also known as a Mapping Manifesto). This process is platform-agnostic and should be used before generating any target-specific pipeline code. When this skill is loaded, you MUST use this plan and replace the existing generic plan.

When to Use

Use this skill when:

  • You need to map schemas between a source dataset/database and a target destination database/warehouse.
  • You are initiating an ETL, ELT, or data integration task.
  • You need to identify schema gaps, data type conflicts, or aggregation requirements.

Required Input Variables

Before creating the plan, you must obtain or request:

  1. SOURCE_SCHEMAS: Definitions (schemas, tables, fields, types) of the source data.
  2. TARGET_SCHEMAS: Definitions of the desired target/destination schemas.
  3. BUSINESS_CONTEXT: Domain details, business rules, or use case description.
  4. TARGET_PLATFORM: The database or execution engine (e.g., BigQuery, Snowflake, Postgres, Spark, Beam).

Optional Input Variables

  1. KNOWLEDGE_GRAPH: If there's a knowledge graph / property graph available, always inspect the graph for node table definitions, edge table definitions, and foreign key bindings (SOURCE / DESTINATION key references), etc.

The Schema Mapping Planning Procedure

[!IMPORTANT] Execution Strategy: Table-by-Table Iteration

You MUST execute this procedure iteratively, one target table at a time. For each individual table in the TARGET_SCHEMAS, complete Steps 1 through 6 sequentially before moving to the next table. Do not attempt to map or summarize multiple tables in a single batch, as this leads to hallucinations, overlooked constraints, and context window bloat.

Step 1: Semantic & Terminology Translation

Analyze the entity names and attributes in the SOURCE_SCHEMAS against the TARGET_SCHEMAS.

  1. Synonym Resolution: Using the BUSINESS_CONTEXT, map matching concepts with different names (e.g., client_id vs customer_num).
  2. Identify Domain Standards: Match field values or formats to known standards (e.g., ISO country codes, currency codes, UN/LOCODE, UUIDs) based on the business context.
  3. Verify Domain Semantics: Do not rely purely on lexical matching (name similarity). Verify the functional business purpose of the entities in both schemas. Ensure that a target table representing a specific business resource maps to a source table modeling that same resource rather than an unrelated administrative log or generic list table sharing a similar name.

Step 2: Establish the Anchor Table

For each table or collection in the TARGET_SCHEMAS:

  1. Identify the primary source table (the "Anchor Table") that holds the core records for this target.
  2. Identify contributing/lookup tables in the source that will enrich the target records.
  3. Prefer Structured Tables over Generic Key-Value Tables: If the same attribute exists in both a structured column in a domain table and as a generic property in an Entity-Attribute-Value (EAV) key-value/properties table, always anchor on the structured table to ensure schema stability and performant joins.

Step 3: Proactive Data Sampling & Inspection

If a target field mapping is ambiguous or schema types do not tell the whole story (e.g., verifying if a timestamp is ISO-8601, if a string is a JSON array, or checking the distribution of values):

  1. Proactive Inspection: If environment access allows, run platform-specific queries (e.g., SELECT ... LIMIT 10, SELECT COUNT(DISTINCT ... )) to sample values.
  2. User Inquiry: If direct access is not possible, output sample queries and ask the user to provide the output to confirm assumptions before finalizing the plan.

Step 4: Perform Field-Level Gap Analysis & Cleanliness Design

Evaluate every column in each target table to determine its source mapping. Categorize mappings and plan cleanliness transformations:

  • Direct Mapping: A 1-to-1 match.
  • Derived Mapping: Requires type casting, string manipulation, date formatting, mathematical derivation, or case statement logic.
  • Joined Mapping: Requires looking up values from contributing tables using defined join keys.
  • Aggregated Mapping: Requires collapsing 1-to-many relationships (e.g., calculating SUM, COUNT, ARRAY_AGG or string concatenation).
  • Gaps (Unmapped fields): Target fields that do not exist in the source.
    • Constraint Checking: Verify whether the target column has a NOT NULL or REQUIRED constraint in the target schema.
    • Handling Nullable Gaps: If the target column is nullable, explicitly flag it as NULL or define a default value.
    • Handling Non-Nullable Gaps: If the target column is NOT NULL, you MUST NOT map it to NULL. (Rationale: Mapping NOT NULL target columns to NULL will cause execution-time database constraint violations and pipeline failures). You must identify a source field to derive it from, default it to a valid non-null placeholder (e.g., 'UNKNOWN', 0, or default dates), or define logic to generate a valid unique reference.

Universal Data Cleanliness Rules to Incorporate in Mappings:

  1. Null Standardization: Map source strings like "NULL", "None", "N/A", or empty spaces to true database NULL values.
  2. Trim & Casing: Plan to trim leading/trailing whitespaces. Convert standardized codes (e.g., ISO codes, status strings) to uppercase.
  3. Temporal Consistency: Plan to parse all source timestamps into standard ISO-8601 format (YYYY-MM-DDTHH:MM:SSZ) or standard destination TIMESTAMP format. Plan checks to ensure logical temporal progression (e.g., start_time <= end_time).
  4. Defensive Checks: Plan checks for strict destination types (e.g., checking if string is a valid number before casting to DECIMAL).

Step 5: Map Relationships & Joins

Specify the logical join path to connect the Anchor Table with all contributing source tables:

  1. Define the join condition/keys (e.g., source_order.customer_id = source_customer.id).
  2. Identify join scale properties:
    • Large-to-Large: Joining two high-volume transaction tables.
    • Large-to-Small: Joining a transaction table to a static lookup table (ideal for Map-side/Broadcast joins to optimize speed/cost).
  3. Document potential join challenges:
    • Many-to-many risks or potential duplicate generation.
    • Type mismatches on join keys (e.g., joining an INT column to a STRING column).
  4. Graph Validation: If a graph was identified in input, cross-reference the proposed join conditions with the graph's edge table definitions to validate foreign key relationships.

Step 6: Draft the "Mapping Manifesto" (Output Format & Example)

Analyze the schemas and reference the ONE_SHOT_EXAMPLE below to structure your output.

ONE_SHOT_EXAMPLE (How to Structure the Mapping Manifesto)

Example Source Schemas
dataset: my_music_library
style: {id: int, style: string}
band: {name: string, biography: string, style: int}
cd: {name: string, year: int, artist: string, numbers: array<string>}
track: {id: string, number: int, name: string}
Example Target Schemas
dataset: music_standard
artist: {name: string, albums: array<string>}
album: {name: string, year: int, genre: string, tracks: array<string>}
The Mapping Manifesto (Expected Output Format)

For each target table, document your column-to-column reasoning:

# Mapping Plan: `album`
* **Anchor Source Table**: `cd`
* **Join Paths & Optimization**:
    * `cd` JOIN `band` ON `cd.artist = band.name`
    * `band` JOIN `style` ON `band.style = style.id`
    * `cd` JOIN `track` ON `track.id IN UNNEST(cd.numbers)`

### Field Mappings

| Target Field | Source Field / Logic | Mapping Type | Rationale / Transformation Details |
| :--- | :--- | :--- | :--- |
| `album.name` | `cd.name` | Direct | A CD is a physical medium representing an album; direct semantic match |
| `album.year` | `cd.year` | Direct | Direct semantic match for release year |
| `album.genre` | `style.style` | Joined | Resolved via `cd.artist` -> `band.name` -> `band.style` (ID) -> `style.id` -> `style.style` (String) |
| `album.tracks` | `ARRAY_AGG(track.name)` | Aggregated | Aggregation Point: Collapses 1-to-many track IDs in `cd.numbers` into an array of track names |

Critical Operational Rules

  • Plan Before Execution: You MUST NOT generate any ETL code, target-specific pipeline configurations, or migration scripts until the Mapping Manifesto has been presented to and approved by the user. (Rationale: Establishing clear mapping logic first prevents coding errors, avoids circular dependencies, and ensures user alignment on semantic mappings before wasting resources on implementation).
  • Strict Schema Grounding: Every source table and field name referenced in the mapping plan MUST exactly match the names and data types present in the provided SOURCE_SCHEMAS. You MUST NOT reference non-existent columns, guess field names, or make assumptions about source schemas without explicitly confirming them in the schema definitions. (Rationale: Proposing guesses leads to compilation errors and invalid mapping specifications).
  • Target Schema Constraint Integrity: You must never propose a mapping that writes NULL to a column defined as NOT NULL or REQUIRED in the TARGET_SCHEMAS.
  • Exhaustive Field Search: Before declaring a target field as an "Unmapped / Gap", search all available source schemas to verify the data is not in a less-obvious table. (Rationale: Lazy mappings that default target fields to NULL lead to downstream data loss and incomplete pipelines).
  • Defensive Type Mapping: Explicitly plan the transformation rules for strict destination types (e.g. TIMESTAMP, BOOLEAN, DECIMAL) to avoid load failures. (Rationale: Different databases and platforms handle type validation strictly; pre-planning casts prevents execution-time runtime errors).
  • Data Integrity Check: Identify join conditions that could cause Cartesian product expansion or data duplication, and note prevention strategies in the plan. (Rationale: Unvalidated joins can distort aggregated metrics or exhaust processing memory on large datasets).

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.