<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Bayrem Hamrouni </title>
    <description>The latest articles on DEV Community by Bayrem Hamrouni  (@bayremhamrouni).</description>
    <link>https://dev.to/bayremhamrouni</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4147038%2F32994579-cd4b-495b-ba87-907b514aa181.png</url>
      <title>DEV Community: Bayrem Hamrouni </title>
      <link>https://dev.to/bayremhamrouni</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bayremhamrouni"/>
    <language>en</language>
    <item>
      <title>I built a Claude Skill that inventories legacy SSIS packages before a Fabric migration</title>
      <dc:creator>Bayrem Hamrouni </dc:creator>
      <pubDate>Mon, 28 Sep 2026 11:48:29 +0000</pubDate>
      <link>https://dev.to/bayremhamrouni/i-built-a-claude-skill-that-inventories-legacy-ssis-packages-before-a-fabric-migration-din</link>
      <guid>https://dev.to/bayremhamrouni/i-built-a-claude-skill-that-inventories-legacy-ssis-packages-before-a-fabric-migration-din</guid>
      <description>&lt;p&gt;If you've ever inherited a folder of &lt;strong&gt;.dtsx&lt;/strong&gt; files with zero documentation, you know the drill. Before you can migrate anything to Microsoft Fabric, you first have to answer a much less exciting question: what is actually in these packages?&lt;br&gt;
I built &lt;strong&gt;ssis-fabric-migration-assistant&lt;/strong&gt;, a Claude Skill that automates the "inventory and classify" phase of an SSIS → Fabric migration, so teams stop burning consulting hours just to find out what's safe to touch.&lt;br&gt;
&lt;strong&gt;The problem&lt;/strong&gt;&lt;br&gt;
A typical legacy SSIS estate looks like this: 50–300 &lt;strong&gt;.dtsx&lt;/strong&gt; packages, built over a decade, by people who are long gone, doing who-knows-what. Before any migration work starts, someone has to manually open every package in SSDT and answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;What does this package actually do?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Which components map cleanly to Fabric, and which don't have a direct equivalent?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Is this safe to auto-convert, or does it need a full rewrite?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Where do we even start?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That triage work doesn't require creativity, it requires patience and a mapping table. Which makes it a good fit for a Claude Skill: deterministic parsing + a fixed reference table + judgment calls Claude is actually good at (writing the plain-language summary, deciding how the risk factors combine).&lt;br&gt;
&lt;strong&gt;How it's structured&lt;/strong&gt;&lt;br&gt;
A Claude Skill is just a folder Claude loads on demand — instructions, reference data, and optionally a bundled script:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ssis-fabric-migration-assistant/&lt;br&gt;
├── SKILL.md                          # workflow, hard rules, trigger phrases&lt;br&gt;
├── references/&lt;br&gt;
│   ├── ssis-fabric-mapping.md        # full SSIS→Fabric equivalence table + risk heuristics&lt;br&gt;
│   └── report-template.md            # exact report shape&lt;br&gt;
├── scripts/&lt;br&gt;
│   └── parse_dtsx.py                 # stdlib-only XML parser, zero dependencies&lt;br&gt;
└── assets/sample_dtsx/               # a synthetic test package + example output&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The parsing itself is plain Python, not an LLM guessing at XML structure. &lt;strong&gt;parse_dtsx.py&lt;/strong&gt; walks the &lt;strong&gt;.dtsx&lt;/strong&gt; XML tree and pulls out control flow tasks, data flow components, connection managers, variables, and precedence constraints into structured JSON, plus a precomputed &lt;strong&gt;signals&lt;/strong&gt; block (script task count, fuzzy lookup presence, container nesting depth, dynamic connection strings) that drives risk scoring downstream:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;python3 scripts/parse_dtsx.py MyPackage.dtsx&lt;br&gt;
python3 scripts/parse_dtsx.py ./packages/ --out portfolio.json   # batch mode&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Real &lt;strong&gt;.dtsx&lt;/strong&gt; files are messy, so the parser is built to never crash. A malformed or partial file still returns a result, with &lt;strong&gt;parse_status&lt;/strong&gt;: "&lt;strong&gt;failed&lt;/strong&gt;" or "&lt;strong&gt;partial&lt;/strong&gt;" and a plain-English explanation, instead of an unhandled exception halfway through a 200-package batch.&lt;br&gt;
&lt;strong&gt;Risk scoring&lt;/strong&gt;&lt;br&gt;
Each package starts at Low and escalates based on concrete signals: a Script Task pushes it to Medium; a Fuzzy Lookup, an SCD Wizard, or a deprecated CDC/Attunity component sends it straight to High. The full heuristic table lives in &lt;strong&gt;references/ssis-fabric-mapping.md&lt;/strong&gt; so the reasoning is inspectable and tunable, not baked into a black-box score.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What it deliberately doesn't do yet&lt;/strong&gt;&lt;br&gt;
Phase 1 is inventory and classification only. Phase 2 — drafting actual Fabric pipeline JSON or Dataflow Gen2 skeletons for the Low/Medium risk packages — is scoped in the SKILL.md but gated behind a human reviewing the Phase 1 output first. And every artifact Phase 2 eventually produces will carry a &lt;strong&gt;DRAFT / NEEDS REVIEW&lt;/strong&gt; label. I'd rather ship something honest about its limits than something that quietly overclaims.&lt;br&gt;
&lt;strong&gt;Try it&lt;/strong&gt;&lt;br&gt;
Repo's on GitHub [&lt;a href="https://github.com/HBBH11/ssis-fabric-migration-assistant" rel="noopener noreferrer"&gt;https://github.com/HBBH11/ssis-fabric-migration-assistant&lt;/a&gt;] — includes a synthetic sample &lt;strong&gt;.dtsx&lt;/strong&gt; and a full example report generated from it, so you can see the output shape before running it against your own packages. Feedback on the risk heuristics against real-world packages would be genuinely useful; I calibrated them from experience, not a formal study.&lt;/p&gt;

</description>
      <category>dataengineering</category>
      <category>etl</category>
      <category>python</category>
      <category>microsoftfabric</category>
    </item>
  </channel>
</rss>
