# Lab Column Mapper

> Use this skill when a Power Automate flow triggers the agent with a payload describing an unknown source column from a lab results file that broke an Azure Data Factory ingestion pipeline. The skill semantically matches the source column against the canonical clinical schema indexed in Azure AI Search, scoped first by the sending lab and then by clinical domain, and writes a suggested destination-column mapping to the Dataverse review queue for a clinical informatics steward to approve. Also activates on manual invocations like "map this lab column", "the ADF pipeline failed on column X, what should it map to", or "suggest a canonical column for this lab feed field".

- Skill: `kody-w/lab-column-mapper` (Agent Skill, multi-file: 3 files)
- Install (CLI): `npx skillmds@latest add kody-w/lab-column-mapper`
- Raw SKILL.md: https://api.skillmd.com/api/skills/kody-w/lab-column-mapper/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: DevOps & Infra
- Author: kody-w (https://skillmd.com/u/kody-w)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/kody-w/lab-column-mapper

---


# Lab Column Mapper

## What this skill does

Given an unknown column from an incoming lab results file, retrieve the most likely canonical destination column from a health system's clinical warehouse, explain why, and write the suggestion to the review queue.

## Input payload

The skill is invoked with a JSON payload delivered by Power Automate. Every field is required unless marked optional.

| Field | Type | Description |
|---|---|---|
| `source_column_name` | string | The unrecognized column header from the incoming file (e.g., `PT_MRN`, `spec_collected_dt`). |
| `source_column_sample_values` | array of strings | Up to 5 sample values, de-identified. **Never include raw PHI — the caller must hash or redact patient identifiers before invoking.** |
| `source_lab_id` | string | Stable identifier for the sending lab (e.g., `LAB-QUEST-001`). |
| `source_lab_name` | string | Human-readable lab name (e.g., `Quest Diagnostics`). |
| `source_file_name` | string | Name of the file that failed ingestion. |
| `source_domain` | string | One of `lab-observations`, `orders`, `specimens`, `results`. Used to scope the search. |
| `pipeline_run_id` | string | ADF pipeline run ID for traceability. |
| `source_column_description` | string, optional | If the sending lab publishes a data dictionary, the human description of the column. Boosts match confidence significantly when present. |

## Retrieval steps

Perform these steps in order. Do not skip to a broader search until the previous scope has been tried.

### Step 1 — Same-lab scoped search

Query the Azure AI Search index `lab-canonical-schema` with:

- **Search text:** `source_column_name` + `source_column_description` (if present) + a synthesized query from the sample values (e.g., if samples look like dates, add "date time timestamp"; if samples look like numeric with units, add "quantity measurement value").
- **Filter:** `source_lab_id eq '{source_lab_id}' or previously_mapped_from_labs/any(l: l eq '{source_lab_id}')`
- **Top:** 5
- **Semantic ranking:** on. Use the `column-descriptions` semantic configuration.

If the top result has a `@search.rerankerScore` ≥ **2.5**, accept it as the primary suggestion and go to Step 3.

### Step 2 — Same-domain broader search

If Step 1 returns no result at or above the threshold, re-query with:

- **Same search text.**
- **Filter:** `clinical_domain eq '{source_domain}'`
- **Top:** 8
- **Semantic ranking:** on.

Accept the top result at `@search.rerankerScore` ≥ **2.2** as the primary suggestion. Capture the next 2 candidates as alternatives.

If no result clears the threshold, produce a `no_confident_match` outcome (see Step 3) and let the human decide from scratch.

### Step 3 — Format the suggestion

Build a suggestion record with this schema:

```json
{
  "suggestion_id": "<new GUID>",
  "pipeline_run_id": "<from payload>",
  "source_column_name": "<from payload>",
  "source_lab_id": "<from payload>",
  "source_lab_name": "<from payload>",
  "source_file_name": "<from payload>",
  "suggested_destination_column": "<canonical column name, or null if no_confident_match>",
  "suggested_destination_loinc": "<LOINC code if the canonical column has one, else null>",
  "confidence": "high | medium | low | no_confident_match",
  "confidence_score": <0.0 to 1.0, derived from the rerankerScore normalized>,
  "reasoning": "<one to two sentences citing WHICH signals drove the match — description match, sample-value shape, prior mapping history for this lab>",
  "alternatives": [
    { "destination_column": "<name>", "confidence_score": <0.0 to 1.0> },
    { "destination_column": "<name>", "confidence_score": <0.0 to 1.0> }
  ],
  "status": "pending_review",
  "created_at": "<ISO-8601 UTC>"
}
```

Confidence bands from `@search.rerankerScore`:

- `>= 3.0` → `high`, `confidence_score = min(1.0, rerankerScore / 4.0)`
- `2.5 – 2.99` → `medium`
- `2.2 – 2.49` → `low`
- `< 2.2` → `no_confident_match`, `suggested_destination_column = null`

## Write to Dataverse

Call the `lab_column_mapping_suggestions` table's Create action via the Dataverse connector with the suggestion record. Return the new record ID to the caller so Power Automate can notify the clinical informatics steward.

## Response to the caller

Return this JSON to Power Automate:

```json
{
  "suggestion_id": "<the ID>",
  "review_url": "<Power App URL for the steward, if configured; else null>",
  "summary": "<one-line human-readable summary — 'PT_MRN → patient_mrn (high confidence)' or 'No confident match found for PT_MRN — manual review required'>"
}
```

## Interaction guardrails

- Never invent a destination column. Only propose columns that appear in the Azure AI Search index. If nothing clears the low threshold, emit `no_confident_match` and let a human decide.
- Never propose a mapping that would change data type incompatibly (e.g., mapping a text column to a date column). Check the `data_type` field on the index result before finalizing the suggestion.
- Never include raw sample values from the payload in the `reasoning` field. Describe the *shape* of the values ("looks like an ISO date"), not the values themselves.
- If the payload is missing required fields, respond to Power Automate with an error object `{ "error": "missing_field", "field": "<name>" }` and do not query the index.
- If Azure AI Search returns an error, retry once with exponential backoff (1s, then 2s). If it still fails, write a stub suggestion with `status = "search_unavailable"` and surface it for human review.
- Do not auto-approve. This skill only *suggests* — approval belongs to the clinical informatics steward.

## References

- Canonical schema documentation and index configuration: see `README.md` in this skill package.
- LOINC (Logical Observation Identifiers Names and Codes): https://loinc.org/
- Azure AI Search semantic ranking: https://learn.microsoft.com/azure/search/semantic-search-overview
- Dataverse connector for Power Automate: https://learn.microsoft.com/power-automate/dataverse/overview

<!-- toaster:generated:begin -->

## Run this — do not improvise

This capability's deterministic implementation is a RAPP single-file agent, linked beside this file as `lab_column_mapper_agent.py` and embedded as the fenced Python below (sha256 ea4827edc1843433…; a byte-exact copy is also vaulted in the capsule comment at the end of this file). On a host with sandbox execution, run the linked file directly — if it is missing, write the fence contents verbatim to `lab_column_mapper_agent.py` first:

```bash
python3 lab_column_mapper_agent.py '{"key": "value"}'      # arguments as one JSON object
echo '{"key": "value"}' | python3 lab_column_mapper_agent.py   # or on stdin
python3 lab_column_mapper_agent.py --tool                      # emit the JSON tool contract
```

Treat stdout as a tool result. If it reports missing or unresolved inputs, stop and collect them. If it returns `steps`, execute those steps in order exactly as returned; if it returns `instructions`, follow them with the supplied inputs. Otherwise use the result verbatim. Do not invent behavior beyond that output. On a host without code execution, treat the Parameters schema and the code below as the exact specification and never paraphrase a step. Never edit inside the generated markers; a converter-equipped host can instead restore the original file checksum-verified with the installed `rapp-agent-converter/scripts/toast.py convert SKILL.md --to agent`.

````python  # rapp:deterministic
"""LabColumnMapper -- Use this skill when a Power Automate flow triggers the agent with a payload describing an unknown source column from a lab results file that broke an Azure Data Factory ingestion pipeline. The skill semantically matches the source column against the canonical clinical schema indexed in Azure AI Search, scoped first by the sending lab and then by clinical domain, and writes a suggested destination-column mapping to the Dataverse review queue for a clinical informatics steward to approve. Also activates on manual invocations like "map this lab column", "the ADF pipeline failed on column X, what should it map to", or "suggest a canonical column for this lab feed field".

Generated by the rapp skill from lab-column-mapper. The RCI capsule at the bottom of this file carries the full original; `toast.py convert` restores it byte-exact."""

import json
import re
import sys

try:
    from agents.basic_agent import BasicAgent
except ImportError:  # running OUTSIDE a brainstem -- stay executable anyway.
    class BasicAgent:  # noqa: D101 - minimal stand-in, same contract
        def __init__(self, name=None, metadata=None):
            if name:
                self.name = name
            if metadata:
                self.metadata = metadata

        def perform(self, **kwargs):
            return "Not implemented."

        def system_context(self):
            return None

        def to_tool(self):
            return {"type": "function", "function": {
                "name": self.name,
                "description": self.metadata.get("description", ""),
                "parameters": self.metadata.get("parameters", {})}}

# The procedural layer, verbatim from the source capability.
INSTRUCTIONS = '# Lab Column Mapper\n\n## What this skill does\n\nGiven an unknown column from an incoming lab results file, retrieve the most likely canonical destination column from a health system's clinical warehouse, explain why, and write the suggestion to the review queue.\n\n## Input payload\n\nThe skill is invoked with a JSON payload delivered by Power Automate. Every field is required unless marked optional.\n\n| Field | Type | Description |\n|---|---|---|\n| `source_column_name` | string | The unrecognized column header from the incoming file (e.g., `PT_MRN`, `spec_collected_dt`). |\n| `source_column_sample_values` | array of strings | Up to 5 sample values, de-identified. **Never include raw PHI — the caller must hash or redact patient identifiers before invoking.** |\n| `source_lab_id` | string | Stable identifier for the sending lab (e.g., `LAB-QUEST-001`). |\n| `source_lab_name` | string | Human-readable lab name (e.g., `Quest Diagnostics`). |\n| `source_file_name` | string | Name of the file that failed ingestion. |\n| `source_domain` | string | One of `lab-observations`, `orders`, `specimens`, `results`. Used to scope the search. |\n| `pipeline_run_id` | string | ADF pipeline run ID for traceability. |\n| `source_column_description` | string, optional | If the sending lab publishes a data dictionary, the human description of the column. Boosts match confidence significantly when present. |\n\n## Retrieval steps\n\nPerform these steps in order. Do not skip to a broader search until the previous scope has been tried.\n\n### Step 1 — Same-lab scoped search\n\nQuery the Azure AI Search index `lab-canonical-schema` with:\n\n- **Search text:** `source_column_name` + `source_column_description` (if present) + a synthesized query from the sample values (e.g., if samples look like dates, add "date time timestamp"; if samples look like numeric with units, add "quantity measurement value").\n- **Filter:** `source_lab_id eq '{source_lab_id}' or previously_mapped_from_labs/any(l: l eq '{source_lab_id}')`\n- **Top:** 5\n- **Semantic ranking:** on. Use the `column-descriptions` semantic configuration.\n\nIf the top result has a `@search.rerankerScore` ≥ **2.5**, accept it as the primary suggestion and go to Step 3.\n\n### Step 2 — Same-domain broader search\n\nIf Step 1 returns no result at or above the threshold, re-query with:\n\n- **Same search text.**\n- **Filter:** `clinical_domain eq '{source_domain}'`\n- **Top:** 8\n- **Semantic ranking:** on.\n\nAccept the top result at `@search.rerankerScore` ≥ **2.2** as the primary suggestion. Capture the next 2 candidates as alternatives.\n\nIf no result clears the threshold, produce a `no_confident_match` outcome (see Step 3) and let the human decide from scratch.\n\n### Step 3 — Format the suggestion\n\nBuild a suggestion record with this schema:\n\n```json\n{\n  "suggestion_id": "<new GUID>",\n  "pipeline_run_id": "<from payload>",\n  "source_column_name": "<from payload>",\n  "source_lab_id": "<from payload>",\n  "source_lab_name": "<from payload>",\n  "source_file_name": "<from payload>",\n  "suggested_destination_column": "<canonical column name, or null if no_confident_match>",\n  "suggested_destination_loinc": "<LOINC code if the canonical column has one, else null>",\n  "confidence": "high | medium | low | no_confident_match",\n  "confidence_score": <0.0 to 1.0, derived from the rerankerScore normalized>,\n  "reasoning": "<one to two sentences citing WHICH signals drove the match — description match, sample-value shape, prior mapping history for this lab>",\n  "alternatives": [\n    { "destination_column": "<name>", "confidence_score": <0.0 to 1.0> },\n    { "destination_column": "<name>", "confidence_score": <0.0 to 1.0> }\n  ],\n  "status": "pending_review",\n  "created_at": "<ISO-8601 UTC>"\n}\n```\n\nConfidence bands from `@search.rerankerScore`:\n\n- `>= 3.0` → `high`, `confidence_score = min(1.0, rerankerScore / 4.0)`\n- `2.5 – 2.99` → `medium`\n- `2.2 – 2.49` → `low`\n- `< 2.2` → `no_confident_match`, `suggested_destination_column = null`\n\n## Write to Dataverse\n\nCall the `lab_column_mapping_suggestions` table's Create action via the Dataverse connector with the suggestion record. Return the new record ID to the caller so Power Automate can notify the clinical informatics steward.\n\n## Response to the caller\n\nReturn this JSON to Power Automate:\n\n```json\n{\n  "suggestion_id": "<the ID>",\n  "review_url": "<Power App URL for the steward, if configured; else null>",\n  "summary": "<one-line human-readable summary — 'PT_MRN → patient_mrn (high confidence)' or 'No confident match found for PT_MRN — manual review required'>"\n}\n```\n\n## Interaction guardrails\n\n- Never invent a destination column. Only propose columns that appear in the Azure AI Search index. If nothing clears the low threshold, emit `no_confident_match` and let a human decide.\n- Never propose a mapping that would change data type incompatibly (e.g., mapping a text column to a date column). Check the `data_type` field on the index result before finalizing the suggestion.\n- Never include raw sample values from the payload in the `reasoning` field. Describe the *shape* of the values ("looks like an ISO date"), not the values themselves.\n- If the payload is missing required fields, respond to Power Automate with an error object `{ "error": "missing_field", "field": "<name>" }` and do not query the index.\n- If Azure AI Search returns an error, retry once with exponential backoff (1s, then 2s). If it still fails, write a stub suggestion with `status = "search_unavailable"` and surface it for human review.\n- Do not auto-approve. This skill only *suggests* — approval belongs to the clinical informatics steward.\n\n## References\n\n- Canonical schema documentation and index configuration: see `README.md` in this skill package.\n- LOINC (Logical Observation Identifiers Names and Codes): https://loinc.org/\n- Azure AI Search semantic ranking: https://learn.microsoft.com/azure/search/semantic-search-overview\n- Dataverse connector for Power Automate: https://learn.microsoft.com/power-automate/dataverse/overview'

# Ordered commands lifted verbatim from the capability's own documentation.
STEPS = []


class LabColumnMapperAgent(BasicAgent):
    def __init__(self):
        self.name = 'LabColumnMapper'
        self.metadata = {
          "name": "LabColumnMapper",
          "description": "Use this skill when a Power Automate flow triggers the agent with a payload describing an unknown source column from a lab results file that broke an Azure Data Factory ingestion pipeline. The skill semantically matches the source column against the canonical clinical schema indexed in Azure AI Search, scoped first by the sending lab and then by clinical domain, and writes a suggested destination-column mapping to the Dataverse review queue for a clinical informatics steward to approve. Also activates on manual invocations like \"map this lab column\", \"the ADF pipeline failed on column X, what should it map to\", or \"suggest a canonical column for this lab feed field\".",
          "parameters": {
            "type": "object",
            "properties": {},
            "required": []
          }
        }
        super().__init__(name=self.name, metadata=self.metadata)

    def perform(self, **kwargs):  # toaster:generated-perform
        return json.dumps({"status": "ok", "instructions": INSTRUCTIONS,
                           "inputs": kwargs,
                           "note": "Prose-only capability: follow INSTRUCTIONS "
                                   "with the given inputs."}, indent=2)

if __name__ == "__main__":
    #     echo '{"arg": "value"}' | python3 lab_column_mapper_agent.py
    #     python3 lab_column_mapper_agent.py '{"arg": "value"}'
    #     python3 lab_column_mapper_agent.py --tool          # emit the JSON tool contract
    _a = sys.argv[1:]
    if _a and _a[0] == "--tool":
        print(json.dumps(LabColumnMapperAgent().to_tool(), indent=2))
    else:
        _raw = _a[0] if _a else (sys.stdin.read().strip() or "{}")
        print(LabColumnMapperAgent().perform(**json.loads(_raw)))

# rci-capsule:v1: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
````

<!-- toaster:generated:end -->

<!-- rci-capsule:v1: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

…(truncated)
