The SDC4 Solution: Eliminating Implementation Guide Hell

Document Type: Solution Architecture (Open Source)

Audience: Business decision-makers, enterprise architects, EDI managers

Status: Draft

Version: 1.0

Date: 2025-11-03

Authors: Timothy W. Cook (Founder, Axius SDC, Inc.) w/Claude (Anthropic AI Assistant)

Organization: Semantic Data Charter (open source community)

License: Creative Commons Attribution 4.0 International (CC BY 4.0)

About This Document: This describes the open SDC4 specification maintained by the Semantic Data Charter. SDCStudio by Axius SDC, Inc. is one commercial implementation of this specification. See ABOUT_SDC4_AND_SDCSTUDIO.md for the distinction between open specifications and commercial tools.

Executive Summary

The Problem: Every major trading partner publishes a 100+ page PDF implementation guide that redefines what X12 segments mean. Suppliers must maintain custom EDI mappings for each partner at massive cost.

The SDC4 Solution: Separate structure from semantics. All trading partners use identical structural components but reference different ontology URIs for semantic meaning.

The Result:

This document provides side-by-side comparisons showing exactly how Walmart, Target, and Amazon implementations work with identical SDC4 structures but different semantics.


Table of Contents

  1. The Core Architectural Insight
  2. Scenario 1: Department Number vs Delivery Point
  3. Scenario 2: Product Identification Chaos Resolved
  4. Scenario 3: Ship-To Location Semantics
  5. Scenario 4: Date Interpretation Differences
  6. Multi-Partner Implementation Example
  7. Cost-Benefit Analysis
  8. Migration Strategy
  9. ROI Calculator
  10. Conclusion

The Core Architectural Insight

X12's Flaw: Structure and Semantics Are Mixed

X12 Segment:

REF*DP*42~

The Problem: What does this mean?

Same segment structure. Three completely different semantics.

To handle this, you write code like:

if trading_partner == "WALMART":
    department_number = ref_value
elif trading_partner == "TARGET":
    delivery_point = ref_value
elif trading_partner == "HOME_DEPOT":
    drop_ship_flag = (ref_value == "Y")

Every time a partner updates their implementation guide, this code changes.

SDC4's Solution: Structure and Semantics Are Separated

Same Structural Component, Different Semantic Annotations:

Walmart's Purchase Order Schema:

<xsd:complexType name="mc-gh7q8s1v34567">
  <xsd:annotation>
    <xsd:appinfo>
      <rdf:Description rdf:about="sdc4:mc-gh7q8s1v34567">
        <rdfs:label>Department Number</rdfs:label>
        <rdfs:isDefinedBy rdf:resource="http://walmart.com/edi/DepartmentNumber"/>
      </rdf:Description>
    </xsd:appinfo>
  </xsd:annotation>
  <xsd:complexContent>
    <xsd:restriction base="sdc4:XdStringType">
      <xsd:sequence>
        <xsd:element name="label" type="xsd:string" fixed="Department Number"/>
        <xsd:element name="xdstring-value" type="xsd:string"/>
      </xsd:sequence>
    </xsd:restriction>
  </xsd:complexContent>
</xsd:complexType>

Target's Purchase Order Schema (SAME STRUCTURE, different semantics):

<xsd:complexType name="mc-gh7q8s1v34567">
  <xsd:annotation>
    <xsd:appinfo>
      <rdf:Description rdf:about="sdc4:mc-gh7q8s1v34567">
        <rdfs:label>Delivery Point Code</rdfs:label>
        <rdfs:isDefinedBy rdf:resource="http://target.com/edi/DeliveryPoint"/>
      </rdf:Description>
    </xsd:appinfo>
  </xsd:annotation>
  <xsd:complexContent>
    <xsd:restriction base="sdc4:XdStringType">
      <xsd:sequence>
        <xsd:element name="label" type="xsd:string" fixed="Delivery Point Code"/>
        <xsd:element name="xdstring-value" type="xsd:string"/>
      </xsd:sequence>
    </xsd:restriction>
  </xsd:complexContent>
</xsd:complexType>

Key Insight: The xsd:restriction base="sdc4:XdStringType" is identical. Only the rdfs:isDefinedBy URI differs.

Result: Your EDI system processes both with the same code. The ontology URI tells you what it means without conditional logic.


Scenario 1: Department Number vs Delivery Point

The X12 Problem

Walmart 850:

REF*DP*42~

Walmart Implementation Guide: "DP = Department Number (our internal merchandising classification)"

Target 850:

REF*DP*DC-MINNEAPOLIS~

Target Implementation Guide: "DP = Delivery Point Code (distribution center identifier)"

Your EDI System:

def parse_ref_dp(value, partner):
    if partner == "WALMART":
        # Store as integer department code
        return {"department_number": int(value)}
    elif partner == "TARGET":
        # Store as string DC code
        return {"delivery_point_code": value}

Maintenance: When Walmart deprecates DP and switches to 1W, you update this code.

The SDC4 Solution

Walmart Instance:

<sdc4:ms-gh7q8s1v34567 xmlns:sdc4="https://semanticdatacharter.com/ns/sdc4/">
  <label>Department Number</label>
  <xdstring-value>42</xdstring-value>
</sdc4:ms-gh7q8s1v34567>

Target Instance (SAME component ID):

<sdc4:ms-gh7q8s1v34567 xmlns:sdc4="https://semanticdatacharter.com/ns/sdc4/">
  <label>Delivery Point Code</label>
  <xdstring-value>DC-MINNEAPOLIS</xdstring-value>
</sdc4:ms-gh7q8s1v34567>

Your Processing Code:

def process_reference_component(element):
    # Extract the ontology URI from schema
    ontology_uri = get_ontology_uri(element)

    # Process based on semantic meaning (not partner ID!)
    if ontology_uri == "http://walmart.com/edi/DepartmentNumber":
        return {"department_number": element.value}
    elif ontology_uri == "http://target.com/edi/DeliveryPoint":
        return {"delivery_point_code": element.value}

    # Or better: Use a semantic registry
    return semantic_registry.map(ontology_uri, element.value)

Key Difference: You're processing based on semantic meaning (ontology URI), not trading partner identity.

Benefit: When Walmart changes their ontology (updates http://walmart.com/edi/DepartmentNumber to version 2.0), the URI changes but your code structure doesn't. You update the semantic registry mapping, not the parsing logic.


Scenario 2: Product Identification Chaos Resolved

The X12 Problem

Walmart: Uses Buyer's Part Number (BP qualifier)

PO1*1*100*EA*12.50*PE*BP*0001234567890~

Target: Uses GTIN-14 (UK qualifier)

PO1*1*100*EA*12.50*PE*UK*10012345678902~

Amazon: Uses ASIN (ZZ qualifier)

PO1*1*100*EA*12.50*PE*ZZ*B08XYZ1234~

Your Product Master Database:

Internal SKU: DRILL-18V-CD-001
Walmart BP:   0001234567890
Target GTIN:  10012345678902
Amazon ASIN:  B08XYZ1234

Mapping Nightmare: Maintain cross-reference tables, update when partners change numbering schemes.

The SDC4 Solution

Single Product ID Component Structure (all three partners):

<!-- Component Definition (SAME for all partners) -->
<xsd:complexType name="mc-ab7k8m1p34567">
  <xsd:complexContent>
    <xsd:restriction base="sdc4:XdStringType">
      <xsd:sequence>
        <xsd:element name="label" type="xsd:string"/>
        <xsd:element name="xdstring-value" type="xsd:string"/>
      </xsd:sequence>
    </xsd:restriction>
  </xsd:complexContent>
</xsd:complexType>

Walmart Instance:

<sdc4:ms-ab7k8m1p34567>
  <label>Product Identifier</label>
  <xdstring-value>0001234567890</xdstring-value>
</sdc4:ms-ab7k8m1p34567>

Walmart Schema Annotation:

<rdf:Description rdf:about="sdc4:mc-ab7k8m1p34567">
  <rdfs:label>Product Identifier</rdfs:label>
  <rdfs:isDefinedBy rdf:resource="http://walmart.com/edi/BuyerPartNumber"/>
  <rdfs:isDefinedBy rdf:resource="http://gs1.org/voc/gtin"/><!-- If known -->
</rdf:Description>

Target Instance (SAME structure):

<sdc4:ms-ab7k8m1p34567>
  <label>Product Identifier</label>
  <xdstring-value>10012345678902</xdstring-value>
</sdc4:ms-ab7k8m1p34567>

Target Schema Annotation:

<rdf:Description rdf:about="sdc4:mc-ab7k8m1p34567">
  <rdfs:label>Product Identifier</rdfs:label>
  <rdfs:isDefinedBy rdf:resource="http://target.com/edi/GTIN14"/>
  <rdfs:isDefinedBy rdf:resource="http://gs1.org/voc/gtin"/><!-- GS1 standard -->
</rdf:Description>

Amazon Instance (SAME structure):

<sdc4:ms-ab7k8m1p34567>
  <label>Product Identifier</label>
  <xdstring-value>B08XYZ1234</xdstring-value>
</sdc4:ms-ab7k8m1p34567>

Amazon Schema Annotation:

<rdf:Description rdf:about="sdc4:mc-ab7k8m1p34567">
  <rdfs:label>Product Identifier</rdfs:label>
  <rdfs:isDefinedBy rdf:resource="http://amazon.com/catalog/ASIN"/>
  <rdfs:isDefinedBy rdf:resource="http://gs1.org/voc/gtin"/><!-- If known -->
</rdf:Description>

The Breakthrough: Semantic Linking

Notice: Both Walmart and Target reference http://gs1.org/voc/gtin in their annotations.

This means: A semantic processor can automatically correlate that:

...are both GS1 GTINs and can be looked up in a GS1 registry to see if they're the same product!

Without SDC4: You maintain a manual cross-reference table.

With SDC4: The ontology URIs provide automatic semantic bridges.


Scenario 3: Ship-To Location Semantics

The X12 Problem

Walmart N1 Loop:

N1*ST*ACME WAREHOUSE*92*1234567890~

Walmart: ST = Ship-To warehouse, 92 = Assigned Number (our internal location code)

Target N1 Loop:

N1*ST*TARGET STORE 5280*1*S5280~

Target: ST = Target store number, 1 = DUNS number

Amazon N1 Loop:

N1*ST*AMAZON FC LAX1~

Amazon: ST = Fulfillment Center code (no ID qualifier)

The SDC4 Solution

Ship-To Location Cluster (SAME structure for all):

<xsd:complexType name="mc-vw2f3h6k89012">
  <xsd:complexContent>
    <xsd:restriction base="sdc4:ClusterType">
      <xsd:sequence>
        <xsd:element name="label" type="xsd:string"/>
        <xsd:element ref="sdc4:ms-no4x5z8c01234"/><!-- Location Name -->
        <xsd:element ref="sdc4:ms-op5y6a9d12345"/><!-- Location ID -->
        <xsd:element ref="sdc4:ms-pq6z7b0e23456"/><!-- Address -->
      </xsd:sequence>
    </xsd:restriction>
  </xsd:complexContent>
</xsd:complexType>

Walmart Instance:

<sdc4:ms-vw2f3h6k89012>
  <label>Ship To Location</label>
  <sdc4:ms-no4x5z8c01234>
    <label>Location Name</label>
    <xdstring-value>ACME WAREHOUSE</xdstring-value>
  </sdc4:ms-no4x5z8c01234>
  <sdc4:ms-op5y6a9d12345>
    <label>Location Identifier</label>
    <xdstring-value>1234567890</xdstring-value>
  </sdc4:ms-op5y6a9d12345>
  <sdc4:ms-pq6z7b0e23456>
    <label>Address</label>
    <!-- ... address components ... -->
  </sdc4:ms-pq6z7b0e23456>
</sdc4:ms-vw2f3h6k89012>

Walmart Schema Annotation:

<rdf:Description rdf:about="sdc4:mc-vw2f3h6k89012">
  <rdfs:label>Ship To Location</rdfs:label>
  <rdfs:isDefinedBy rdf:resource="http://walmart.com/edi/ShipToWarehouse"/>
  <rdfs:isDefinedBy rdf:resource="http://schema.org/Place"/>
</rdf:Description>

<rdf:Description rdf:about="sdc4:mc-op5y6a9d12345">
  <rdfs:label>Location Identifier</rdfs:label>
  <rdfs:isDefinedBy rdf:resource="http://walmart.com/edi/WarehouseLocationCode"/>
  <rdfs:isDefinedBy rdf:resource="http://x12.org/codes/id-qualifier/92"/>
</rdf:Description>

Target Instance (SAME structure):

<sdc4:ms-vw2f3h6k89012>
  <label>Ship To Location</label>
  <sdc4:ms-no4x5z8c01234>
    <label>Store Name</label>
    <xdstring-value>TARGET STORE 5280</xdstring-value>
  </sdc4:ms-no4x5z8c01234>
  <sdc4:ms-op5y6a9d12345>
    <label>Store Number</label>
    <xdstring-value>S5280</xdstring-value>
  </sdc4:ms-op5y6a9d12345>
  <sdc4:ms-pq6z7b0e23456>
    <label>Address</label>
    <!-- ... address components ... -->
  </sdc4:ms-pq6z7b0e23456>
</sdc4:ms-vw2f3h6k89012>

Target Schema Annotation:

<rdf:Description rdf:about="sdc4:mc-vw2f3h6k89012">
  <rdfs:label>Ship To Location</rdfs:label>
  <rdfs:isDefinedBy rdf:resource="http://target.com/edi/TargetStore"/>
  <rdfs:isDefinedBy rdf:resource="http://schema.org/Place"/>
</rdf:Description>

<rdf:Description rdf:about="sdc4:mc-op5y6a9d12345">
  <rdfs:label>Location Identifier</rdfs:label>
  <rdfs:isDefinedBy rdf:resource="http://target.com/edi/StoreNumber"/>
  <rdfs:isDefinedBy rdf:resource="http://gs1.org/voc/GLN"/><!-- If DUNS maps to GLN -->
</rdf:Description>

Key Insight: Shared Structural Components

Notice: Both use:

Only the ontology URIs differ to express Walmart vs. Target semantics.


Scenario 4: Date Interpretation Differences

The X12 Problem

Walmart DTM Segment:

DTM*010*20251115~

Walmart: 010 = Requested Ship Date (when supplier should ship)

Amazon DTM Segment:

DTM*010*20251115~

Amazon: 010 = Delivery Date (when product should arrive at FC)

Same qualifier, opposite meanings!

The SDC4 Solution

Walmart Instance:

<sdc4:ms-jk0t1v4y67890>
  <label>Requested Ship Date</label>
  <xdtemporal-value>2025-11-15</xdtemporal-value>
</sdc4:ms-jk0t1v4y67890>

Walmart Schema Annotation:

<rdf:Description rdf:about="sdc4:mc-jk0t1v4y67890">
  <rdfs:label>Requested Ship Date</rdfs:label>
  <rdfs:isDefinedBy rdf:resource="http://walmart.com/edi/RequestedShipDate"/>
  <rdfs:isDefinedBy rdf:resource="http://x12.org/codes/dtm-qualifier/010"/>
  <rdfs:isDefinedBy rdf:resource="http://schema.org/shippingDate"/>
</rdf:Description>

Amazon Instance (SAME component structure):

<sdc4:ms-jk0t1v4y67890>
  <label>Required Delivery Date</label>
  <xdtemporal-value>2025-11-15</xdtemporal-value>
</sdc4:ms-jk0t1v4y67890>

Amazon Schema Annotation:

<rdf:Description rdf:about="sdc4:mc-jk0t1v4y67890">
  <rdfs:label>Required Delivery Date</rdfs:label>
  <rdfs:isDefinedBy rdf:resource="http://amazon.com/edi/RequiredDeliveryDate"/>
  <rdfs:isDefinedBy rdf:resource="http://x12.org/codes/dtm-qualifier/010"/>
  <rdfs:isDefinedBy rdf:resource="http://schema.org/expectedDeliveryDate"/>
</rdf:Description>

Result: Your system knows:

No conditional logic needed. The semantic URIs make the distinction explicit.


Multi-Partner Implementation Example

Real-World Scenario

Company: Automotive parts supplier

Trading Partners: Ford, GM, Tesla (all use X12 850 for purchase orders)

Current State (X12):

With SDC4:

Savings: 67% initial cost reduction, 83% ongoing cost reduction

Side-by-Side: Three Partners, One Structure

Purchase Order Header Cluster (SAME for all three):

Component Ford Semantics GM Semantics Tesla Semantics
PO Number http://ford.com/edi/PurchaseOrderNumber http://gm.com/procurement/PONumber http://tesla.com/supply/OrderID
PO Date http://schema.org/orderDate http://schema.org/orderDate http://schema.org/orderDate
Department http://ford.com/edi/ProgramCode http://gm.com/edi/DivisionCode Not used
Vendor ID http://ford.com/edi/SupplierNumber http://gm.com/edi/VendorCode http://tesla.com/supply/SupplierID

Product ID Component (SAME structure for all three):

Aspect Ford GM Tesla
Primary ID Ford Part Number GM Part Number Tesla SKU
Ontology URI http://ford.com/parts/PartNumber http://gm.com/parts/GMPartNumber http://tesla.com/catalog/SKU
Secondary ID GS1 GTIN GS1 GTIN GS1 GTIN
Ontology URI http://gs1.org/voc/gtin http://gs1.org/voc/gtin http://gs1.org/voc/gtin

Result: All three reference GS1 GTIN, enabling automatic product correlation!

Implementation Code

Old Way (X12):

if partner == "FORD":
    product_id = parse_ford_po1_segment(segment)
    cross_ref = ford_product_xref.lookup(product_id)
elif partner == "GM":
    product_id = parse_gm_po1_segment(segment)
    cross_ref = gm_product_xref.lookup(product_id)
elif partner == "TESLA":
    product_id = parse_tesla_po1_segment(segment)
    cross_ref = tesla_product_xref.lookup(product_id)

internal_sku = cross_ref.internal_sku

New Way (SDC4):

# Parse SDC4 instance (same code for all partners)
po_doc = sdc4_parser.parse(xml_instance)

# Extract product ID component
product_id_element = po_doc.get_component("ms-ab7k8m1p34567")

# Get semantic URI from schema
semantic_uris = schema_registry.get_ontology_uris(product_id_element)

# Check if GS1 GTIN is present
if "http://gs1.org/voc/gtin" in semantic_uris:
    # Use GTIN for lookup (works for all partners)
    gtin = product_id_element.value
    internal_sku = gtin_registry.lookup(gtin)
else:
    # Fall back to partner-specific lookup
    partner_uri = semantic_uris[0]
    internal_sku = semantic_mapper.map(partner_uri, product_id_element.value)

Key Difference: SDC4 version uses semantic URIs instead of partner identity for routing logic.


Cost-Benefit Analysis

Current State (X12 with Implementation Guides)

Scenario: Medium supplier with 15 retail trading partners

Initial Setup Costs

Activity Hours per Partner Cost per Partner Total (15 partners)
Implementation guide review 40 $6,000 $90,000
EDI mapping design 80 $12,000 $180,000
Development/configuration 120 $18,000 $270,000
Cross-reference table creation 40 $6,000 $90,000
Testing & certification 80 $12,000 $180,000
TOTAL INITIAL 360 $54,000 $810,000

Annual Maintenance Costs

Activity Hours per Partner Cost per Partner Total (15 partners)
Implementation guide updates 80 $12,000 $180,000
Cross-reference maintenance 40 $6,000 $90,000
Error handling/troubleshooting 60 $9,000 $135,000
Testing after updates 40 $6,000 $90,000
TOTAL ANNUAL 220 $33,000 $495,000/year

5-Year Total Cost of Ownership

$810,000 + ($495,000 Γ— 5) = $3,285,000

Future State (SDC4)

Initial Setup Costs

Activity Hours Cost Notes
SDC4 component library design 200 $30,000 One-time, reusable across all partners
Ontology mapping (per partner) 40 Γ— 15 $90,000 Much simpler than full EDI mapping
Schema annotation 100 $15,000 Define ontology references
Integration development 150 $22,500 One parser for all partners
Testing & validation 150 $22,500
TOTAL INITIAL 1,200 $180,000 78% reduction

Annual Maintenance Costs

Activity Hours Cost Notes
Ontology updates (all partners) 120 $18,000 Semantic changes don't break structure
Component reuse expansion 80 $12,000 Add new components as needed
Error handling 100 $15,000 Reduced due to schema validation
Regression testing 60 $9,000 Faster with stable structure
TOTAL ANNUAL 360 $54,000/year 89% reduction

5-Year Total Cost of Ownership

$180,000 + ($54,000 Γ— 5) = $450,000

Comparison Summary

Metric X12 Current State SDC4 Future State Savings
Initial Setup $810,000 $180,000 $630,000 (78%)
Annual Maintenance $495,000 $54,000 $441,000 (89%)
5-Year TCO $3,285,000 $450,000 $2,835,000 (86%)

ROI: Break-even in < 6 months. After that, pure savings.


Migration Strategy

Phase 1: Proof of Concept (3 months)

Goal: Validate SDC4 approach with one trading partner

Activities:

  1. Select pilot partner (ideally one with upcoming implementation guide change)
  2. Build SDC4 Purchase Order model
  3. Create ontology references for pilot partner
  4. Develop SDC4 parser/generator
  5. Parallel run: Generate both X12 and SDC4 from same internal data
  6. Validate equivalence

Success Criteria: SDC4 version contains same business data as X12 version

Cost: $50,000

Duration: 3 months

Risk: Low (parallel operation, no disruption to production)

Phase 2: Incremental Rollout (6-12 months)

Goal: Migrate additional partners to SDC4

Activities:

  1. Add ontology references for 3-5 partners
  2. Update parser to handle multi-partner ontologies
  3. Gradually shift partners from X12 to SDC4 processing
  4. Maintain X12 generation for backwards compatibility

Success Criteria: 50% of partners using SDC4 internally

Cost: $80,000

Duration: 6 months

Risk: Medium (requires partner coordination)

Phase 3: Full Migration (12-18 months)

Goal: All partners using SDC4

Activities:

  1. Complete ontology mapping for all partners
  2. Deprecate X12-specific code paths
  3. Full schema validation implementation
  4. Performance optimization

Success Criteria: 100% internal processing uses SDC4

Cost: $50,000

Duration: 6 months

Risk: Low (proven approach by this point)

Total Migration Investment

Total Cost: $180,000

Total Duration: 18 months

Payback Period: 5 months (based on $441K annual savings)


ROI Calculator

Input Variables

Your Company Metrics (customize these):

ROI Formula

Current Annual Cost = (Number of partners) Γ— (220 hours) Γ— ($150/hour)

SDC4 Annual Cost = 360 hours Γ— $150/hour = $54,000 (relatively fixed)

Annual Savings = Current Annual Cost - $54,000

Payback Period = $180,000 Γ· Annual Savings (in months)

Examples

Small Supplier (5 partners)

Medium Supplier (15 partners)

Large Supplier (50 partners)

Insight: The more trading partners you have, the faster the ROI.


Conclusion: The End of Implementation Guides

What We've Demonstrated

Separation of structure from semantics enables:

  1. βœ… Implementation guide elimination

- PDF documents β†’ Machine-readable ontology URIs

- Prose definitions β†’ Formal RDF semantics

- Manual interpretation β†’ Automatic processing

  1. βœ… Component reuse across partners

- Build Purchase Order Cluster once

- Reference it 50 times (50 partners)

- Only semantic annotations differ

  1. βœ… Massive cost reduction

- 78% initial setup cost savings

- 89% ongoing maintenance cost savings

- Faster partner onboarding

  1. βœ… Semantic interoperability

- GS1 GTIN bridges between partner-specific numbering

- Schema.org concepts provide common vocabulary

- Automatic correlation via ontology URIs

  1. βœ… Future-proof architecture

- Ontology evolution doesn't break structure

- New partners use existing components

- Ready for Web3/smart contract integration (next doc!)

The Paradigm Shift

Old Paradigm: "Every trading partner needs custom EDI mapping"

New Paradigm: "Every trading partner uses the same structure, different semantics"

Result: Implementation guides become ontology reference documents (machine-readable, version-controlled, semantic-web-standard).

Next: Beyond EDI

We've now seen how SDC4 solves 40 years of X12 problems. But the same architecture that eliminates implementation guides also enables something revolutionary: smart contract data validation.

Read Next: X12_TO_WEB3_BRIDGE.md - See how the same Purchase Order works in blockchain environments.


Document Navigation:

← Previous: 850 Purchase Order Mapping | Next: X12 to Web3 Bridge β†’


About This Documentation

This document describes the open SDC4 specification maintained by the Semantic Data Charter community.

Open Source:

Commercial Implementation:

See ABOUT_SDC4_AND_SDCSTUDIO.md for details.


*This document is part of the SDC4 X12 EDI Integration Guide series.*

*Author: Timothy W. Cook (Founder, Axius SDC, Inc.) w/Claude (Anthropic AI Assistant)*

*License: Creative Commons Attribution 4.0 International (CC BY 4.0)*