APP

concur — cross-source consensus check for chip libraries

Compares ds2sf-extracted symbol+footprint against chip-fetcher's KiCad/EAGLE/Altium libraries across seven axes and emits an opinionated agent-to-agent result.json. v0.8 adds a KelvinSenseRepresentation variant so 4-terminal sense resistors (Vishay WSL, Bourns CSL) reporting 4 pads against simplified 2-pad libs no longer false-fires as divergent.

concur — cross-source consensus check for chip libraries
💬 Sample prompts Paste any of these into Claude Code to use this app
Cross-check a chip run concur check on ~/project/chip-fetcher/library/ADS1115IDGSR
Inspect a result show me the concur inspect output for DRV8316RRGFR
Pipeline after ds2sf returns ok, run concur check
Variants concur said golden_with_variants — show me the variants block
Multi-variant altium concur on DRV8316 — confirm altium picked the IPC-A 41-pad variant
Kelvin sense concur on WSL2010R0500FEA — should fire kelvin_sense variant since ds2sf=4-pad Kelvin and libs=2-pad simplified
Health run concur health
Install this app

Paste this into Claude Code (VS Code panel, Adom editor, or terminal) to install:

I want to install the "concur — cross-source consensus check for chip libraries" app from the Adom Wiki (https://wiki-ufypy5dpx93o.adom.cloud/wiki/apps/concur). For the Docker CLI: curl -fsSL https://wiki-ufypy5dpx93o.adom.cloud/static/apps/concur/concur -o /usr/local/bin/concur && chmod +x /usr/local/bin/concur && concur install Then verify the install works.

Download latest

Windows coming soon
macOS coming soon
🐧 Linux coming soon
🐳 Adom Docker CLI concur ·

See all releases on GitHub (private repo — access required)

concur

Cross-source consensus check for chip libraries.

A small Rust CLI that runs downstream of ds2sf and chip-fetcher: it loads every available source-of-truth for a chip's symbol and footprint (datasheet-extracted, KiCad UL bundle, Fusion 360 EAGLE .lbr, Altium binary), compares them across seven axes, and emits a result.json with status: golden | divergent | unrecoverable plus tagged hints[] so the upstream caller can either re-fetch a suspect library or escalate to a human.

The pipeline:

chip-fetcher  →  ds2sf (status: ok)  →  concur (status: golden)  →  downstream is happy
                                            ↓ divergent
                                       chip-fetcher refetches a lib
                                       OR human reviews

Why this matters

Concur is opinionated about whether a divergence requires upstream work or is safe to ship. Many "disagreements" between sources are known-benign patterns (exposed-pad counted as pin N+1 in one source but not the other, JEDEC-outline-name vs marketing-name, alt-function pin labels, pad-array span misread as body dim). Concur classifies these as variants and ships the dataset with status: golden_with_variants (exit 0) so the upstream caller can move forward and just remember the variants downstream. Real disagreements stay divergent (exit 2).

Real example from this release's smoke tests:

$ concur check ~/project/chip-fetcher/library/ADS1115IDGSR
  ds2sf       — 10 pins, 10 pads, package "VSSOP-10"
  kicad       — 10 pins, 10 pads, footprint "SOT_ADS1115IDYNR_TEX"
  eagle (.lbr) — 10 pins, 10 pads, package "DGS0010A_N"

OK: ADS1115IDGSR — GOLDEN with variants [variants: label_only, stub_pin_names, body_dim_artifact]

What concur figured out:

  • label_only_mismatch — KiCad's footprint name starts with SOT_ because that's TI's UL library prefix convention, but the geometry (pad count, pad layout, pitch) all agrees with EAGLE's DGS0010A_N and ds2sf's VSSOP-10. The package family really is VSSOP. Cosmetic only.
  • stub_symbol_pin_names — the KiCad UL symbol has pin "names" of "1", "2", "3"… instead of real labels. Downstream can use ds2sf's or EAGLE's pin labels.
  • body_dim_measurement_artifact — ds2sf and EAGLE report different body dimensions (5.05×3.10 vs 4.45×2.00). Body dim is courtyard-only, doesn't affect placement; the diff is a measurement-method artifact (lead-tip span vs pad-array span vs body D dim).

All three are flagged but explained, exit 0, chip-fetcher moves forward.

Outputs

<chip-dir>/<MPN>-concur.result.json — the audit + agent contract:

{
  "schema_version": "1",
  "status": "golden_with_variants",
  "exit_code": 0,
  "mpn": "ADS1115IDGSR",
  "summary": "ADS1115IDGSR — GOLDEN with variants [variants: label_only,stub_pin_names,body_dim_artifact]",
  "sources_compared": ["ds2sf","kicad","eagle"],
  "sources_missing":  ["altium"],
  "variants": [
    { "kind": "label_only_mismatch",
      "notes": "ds2sf: VSSOP-10 → family=VSSOP | eagle: DGS0010A_N → family=VSSOP | kicad: SOT_ADS1115IDYNR_TEX → family=SOT" },
    { "kind": "stub_symbol_pin_names",
      "stub_sources": ["kicad"],
      "canonical_sources": ["ds2sf","eagle"] },
    { "kind": "body_dim_measurement_artifact",
      "notes": "ds2sf: 5.05×3.10 mm | eagle: 4.45×2.00 mm" }
  ],
  "axes": [
    { "axis": "pad_count",     "verdict": "agree" },
    { "axis": "pin_names",     "verdict": "disagree",
      "conflicts": ["kicad has stub-only pin names …"] },
    { "axis": "package_family","verdict": "disagree",
      "conflicts": ["Package families disagree across sources: ds2sf=VSSOP, kicad=SOT, eagle=VSSOP"] }
  ],
  "hints": [
    { "action": "ul_symbol_has_stub_names", "source": "kicad", "pin_count": 10,
      "suggestion": "Use ds2sf-extracted symbol JSON or refetch the .kicad_sym from a manufacturer-direct source" }
  ]
}

Status ladder

StatusExitCaller action
golden0Ship it, no caveats.
golden_with_variants0Ship it. Every disagreement is explained by variants[]. Downstream tools can use the variant list to decide which source to prefer (ds2sf for pin labels when the KiCad symbol has stubs, etc).
divergent2Real disagreement. Refetch a library or escalate to a human.
unrecoverable3Couldn't parse ≥2 sources.

Variant kinds (v0.3)

KindWhenWhat it means
exposed_pad_variantPad count diff is exactly 1One source counts the EP/thermal pad as pin N+1; the other rolls it into the body. EE practice varies; both are correct.
module_extra_padsPad count diff > 1 (one source has more)KiCad/EAGLE footprint includes mounting/shield/test pads beyond the module datasheet's user-facing pinout.
label_only_mismatchPackage family names differ but geometry agreesNaming-convention artifact (e.g. TI's SOT_ prefix on a VSSOP footprint, JEDEC outline DGS0010A → VSSOP, IPC-7351 generic name SOP65P640X120-20N → TSSOP). Cosmetic only.
stub_symbol_pin_namesOne source's pin names are pin numbers ("1","2"…)UL stub case. Downstream should use a richer source (ds2sf or EAGLE) for labels.
body_dim_measurement_artifactBody dim disagrees but pad geometry agreesDifferent sources measured "body" differently (lead-tip span vs body D-dim vs pad-array span). Body dim is courtyard-only; doesn't affect placement.
naming_convention_mismatchPin names differ but every disagreement is a benign convention swapChannel-digit position (OUT11OUT for op-amps and multi-channel parts) or power-pin alias (V+VCC, V-GND).

Comparison axes

AxisWhat it checks
pad_countNumber of pads in the footprint
pad_numbersSet of pad numbers/labels (1..N or A1, A4, B7…)
symbol_pin_countNumber of pins in the symbol
pin_namesPer-pin name across sources (slash → underscore, case-insensitive). Sources that emit stub names ("1","2"…) are flagged as ul_symbol_has_stub_names hint.
pin_to_pad_mapDoes pin VDD map to the same pad number across sources?
package_familySOIC / VSSOP / QFN / SOT / etc., with JEDEC outline aliases (DGS0010A → VSSOP, RGE → QFN, RUG → VQFN, …)
body_dimsBody x/y in mm, ±0.5 mm tolerance

Agent-to-agent contract

hints[] is a tagged-union list (separate from variants[] — variants explain why a disagreement is benign; hints tell the caller what action to take). v0.3 enriches refetch hints with concrete suggested_sources (priority-ordered) and expected_resolution so chip-fetcher knows where to refetch from AND how to verify the refetch worked.

ActionCarriesWhen
refetch_library_source{format, suspect, notes}A specific lib looks wrong; chip-fetcher should try a different upstream.
ul_symbol_has_stub_names{source, pin_count, suggestion}KiCad UL stub case (pin "names" are pin numbers).
accept_with_caveats{caveats}Soft diffs within tolerance.
human_review{reason, notes}No automated repair safe.
source_parse_failed{format, path, error}A file couldn't be parsed at all.

Calling recipe

let r = run_concur(chip_dir);
match r.status.as_str() {
    "golden" => mark_chip_dir_clean(),
    "divergent" => {
        for h in &r.hints {
            match h {
                Hint::RefetchLibrarySource { format, .. } => {
                    refetch_lib_from_alternate_source(format);
                    return run_concur(chip_dir); // re-call after refetch
                }
                Hint::UlSymbolHasStubNames { .. } => {
                    // Replace .kicad_sym from ds2sf JSON via downstream sym_create.
                }
                _ => {}
            }
        }
    }
    "unrecoverable" => log_for_human(&r),
    _ => unreachable!(),
}

CLI

concur check <CHIP-DIR>     # run cross-source check
concur inspect <CHIP-DIR>   # print summary of an existing concur.result.json
concur health               # parser readiness check
concur install              # drop SKILL.md

check flags: --ds2sf-symbol, --ds2sf-footprint, --kicad-sym, --kicad-mod, --eagle, --mpn, --out-dir, --force, --json-only.

Validated chips (v0.3 release — 9-chip suite)

MPNPkgStatusVariants caughtNotes
ADS1115IDGSRVSSOP-10golden_with_variantslabel_only, stub_pin_names, body_dim_artifactTI's SOT_ prefix on VSSOP footprint; UL symbol stubs; ds2sf body-dim picked up the lead-tip span
DRV8316RRGFRVQFN-40golden_with_variantsepEP counted as pin 41 by KiCad/EAGLE, omitted by ds2sf
VL53L8CXOLGA-16golden_with_variantsep, label_only, body_dim_artifactCustom optical LGA; thermal pad EP variant
ESP32-S3-WROOM-1-N4SMD modulegolden_with_variantsmodule_extras, body_dim_artifactKiCad has 8 extra shield/test pads beyond the module's 41 castellations
LM358DSOIC-8golden_with_variantsnaming_conventionOUT11OUT channel-digit + V+VCC, V-GND power-pin aliases
TPS62840YBGRDSBGA-8golden_with_variantsbody_dim_artifactCleanest of the suite; only courtyard body-dim diff
BMI270LGA-14golden_with_variantslabel_only, body_dim_artifactBosch IMU; EAGLE 7.x .lbr now parses (DTD support)
MSP430G2553IPW20TSSOP-20divergentReal bug. KiCad symbol shifts pin functions: ds2sf says pin 14=NC, KiCad says pin 14=P1.6 with 8 alt-functions. Likely wrong sub-variant in UL bundle.
R7FA4M1AB3CFPLQFP-100divergentReal bug. Pin 1: ds2sf=P108_TMS_SWDIO, KiCad=P400. AVCC0 lands on pad 90 vs pad 88. Wrong sub-variant of the Renesas RA4M1 family.

7/9 pass cleanly (golden_with_variants exit 0). 2/9 are real wrong-variant findings the upstream caller should refetch. Zero false positives in v0.3.

Out of scope (current)

  • Altium .SchLib (symbol-side) parsing. v0.6 added .PcbLib (pads) via the sister altium-pcblib crate; .SchLib pin labels are still pending.
  • Body-thickness comparison (z-dim). Sources don't reliably report this.
  • Tolerance-aware lead/pad-pitch checks beyond raw body dims.

Altium multi-variant selection (v0.7)

Many vendor .PcbLibs ship multiple footprint variants in the same file — for example DRV8316RRGFR carries RGF0040E-IPC_A (41-pad IPC standard) AND RGF0040E-MFG (57-pad manufacturing layout with extra fiducials and test points). The upstream altium-pcblib crate picks one as "primary" by stream order.

If concur naively trusts the primary, it can disagree with kicad+eagle 100% of the time. v0.7 computes the pad-count consensus from already-parsed sources (ds2sf / kicad / eagle) and asks altium-pcblib for the variant whose pad count is closest to the median. Names containing -MFG / _MFG / DEBUG / FIDUCIAL / TEST get a tiebreak penalty so the IPC-standard variant wins when in doubt.

Effect on the benchmark: DRV8316RRGFR was reporting divergent with altium engaged (57 vs 41) → now reports golden_with_variants (41 across all four sources, only EP-counting differs).

Build

cargo build --release
sudo cp target/release/concur /usr/local/bin/
concur install

Or just ./build.sh.

Related

  • ds2sf — datasheet → symbol + footprint + provenance JSON. Upstream of concur.
  • chip-fetcher — pulls the libraries that concur cross-checks.
CONC
concur 20 days ago
v0.8.0 build for adom docker (Linux x86_64)
Upload v0.8.0 binary. KelvinSenseRepresentation variant + detector for Vishay WSL / Bourns CSL / Susumu PCS 4-terminal sense resistors. Verified on WSL2010R0500FEA — flips from divergent to golden_with_variants.John Lauer · 20 days ago
1.3 MB

Install notes

Adom Docker CLI install steps
curl -fsSL https://wiki-ufypy5dpx93o.adom.cloud/static/apps/concur/concur -o /usr/local/bin/concur && chmod +x /usr/local/bin/concur && concur install

AI Skill — how Claude uses this app

Edit AI Skill

name: concur description: Cross-source consensus check for chip libraries. Compares ds2sf-extracted symbol+footprint against chip-fetcher's KiCad/EAGLE/Altium libraries and emits a result.json with status (golden/divergent/unrecoverable), exit codes (0/2/3), and tagged hints[] so chip-fetcher can autonomously re-fetch a suspect library or escalate to a human. Trigger words — concur, golden dataset, cross-source check, kicad eagle altium agreement, lib agreement, library mismatch, ds2sf vs kicad, ul stub symbol, refetch library, chip lib consensus.

concur — cross-source consensus check

Pipeline position: chip-fetcherds2sf (status: ok) → concur (status: golden) → safe for downstream.

When the four sources of truth for a chip's symbol+footprint (ds2sf-extracted from the datasheet, KiCad UL bundle, EAGLE/Fusion 360 .lbr, Altium binary) all agree, you have a golden dataset. When they diverge, somebody's wrong — concur tells the upstream caller which source is suspect and what to do.

Outputs

<chip-dir>/<MPN>-concur.result.json — the audit + agent-to-agent contract:

{
  "schema_version": "1",
  "status": "golden | divergent | unrecoverable",
  "exit_code": 0 | 2 | 3,
  "mpn": "ADS1115IDGSR",
  "summary": "ADS1115IDGSR — DIVERGENT. Sources: [ds2sf,kicad,eagle]. Axes: 5 agree, 2 disagree, 0 source-missing.",
  "sources_compared": ["ds2sf","kicad","eagle"],
  "sources_missing": ["altium"],
  "axes": [
    { "axis": "pad_count",      "verdict": "agree", … },
    { "axis": "pin_names",      "verdict": "disagree",
      "conflicts": ["kicad has stub-only pin names (UL bundle did not carry the part's real pin labels)"] }
  ],
  "hints": [
    { "action": "ul_symbol_has_stub_names", "source": "kicad", "pin_count": 10,
      "suggestion": "Use ds2sf-extracted symbol JSON or refetch the .kicad_sym from a manufacturer-direct source" }
  ]
}

Commands

concur check <CHIP-DIR>     # run the cross-source check
concur inspect <CHIP-DIR>   # print summary of an existing concur.result.json
concur health               # readiness check
concur install              # drop SKILL.md

check flags: --ds2sf-symbol, --ds2sf-footprint, --kicad-sym, --kicad-mod, --eagle, --mpn, --out-dir, --force, --json-only.

Status ladder (agent-to-agent contract)

ExitstatusMeaningCaller action
0goldenAll sources agree exactly.Accept.
0golden_with_variantsDisagreements exist but every one is explained by a variants[] entry (EP-only, module-extras, label-only, stub pin names, body-dim measurement artifact).Accept. Downstream tools use the variant list to decide which source to prefer.
2divergentAt least one disagreement is not covered by a variant.Walk hints[]; refetch a library or escalate.
3unrecoverableCouldn't parse ≥2 sources.Surface to human.

variants[].kind enum

Variants explain why a disagreement is benign, separate from hints[] which tell the caller what to do.

KindWhenMeaning
exposed_pad_variantPad count diff is exactly 1EP/thermal pad counted as pin N+1 by some sources, omitted by others.
module_extra_padsPad count diff > 1KiCad/EAGLE footprint includes mounting/shield/test pads beyond module datasheet pinout.
label_only_mismatchPackage family names differ but geometry agreesTI's SOT_ prefix on VSSOP footprints, DGS0010A JEDEC outline → VSSOP, IPC-7351 generic names like SOP65P640X120-20N, etc. Cosmetic.
stub_symbol_pin_namesOne source's pin names are numeric ("1","2"…)UL bundle stub case. Use ds2sf or EAGLE for real names.
body_dim_measurement_artifactBody dim disagrees but pad geometry agreesDifferent "body" measurement methods. Doesn't affect placement.
naming_convention_mismatchPin names differ but every disagreement is a benign convention swapChannel-digit position (OUT11OUT) for op-amps and multi-channel parts; power-pin aliases (V+VCC, V-GND) for chip-vendor-vs-library naming.

Comparison axes (what gets cross-checked)

  • pad_count — number of pads in the footprint
  • pad_numbers — set of pad numbers / labels
  • symbol_pin_count — number of pins in the symbol
  • pin_names — per-pin name across sources (slash-normalized, case-insensitive). Stub-only sources (UL bundles where pin "name" is the pin number) are flagged as ul_symbol_has_stub_names rather than failing the axis.
  • pin_to_pad_map — does pin VDD map to the same pad number across sources?
  • package_family — SOIC/QFN/SOT/VSSOP/etc., with JEDEC outline aliases (DGS0010A → VSSOP)
  • body_dims — body x/y in mm, ±0.5 mm tolerance

hints[].action enum

ActionCarriesWhen
refetch_library_source{format, suspect, notes}A specific lib looks wrong; chip-fetcher should try a different upstream.
ul_symbol_has_stub_names{source, pin_count, suggestion}KiCad UL stub case (pin "names" are pin numbers).
accept_with_caveats{caveats}Soft diffs within tolerance.
human_review{reason, notes}No automated repair safe (e.g. Altium parser not yet implemented).
source_parse_failed{format, path, error}A file couldn't be parsed at all.

hints[].action enum

Every hint tells the caller exactly what to do. v0.3 enriches the previously-skinny refetch hints with suggested_sources (priority-ordered list of where to refetch from) and expected_resolution (how the caller verifies the refetch worked).

ActionCarriesWhat chip-fetcher should do
refetch_library_source{format, suspect, notes, suggested_sources, expected_resolution}Walk suggested_sources in order. After each refetch, re-run concur check. The expected_resolution field tells you the specific axis that should change verdict on a successful refetch. Stop when status flips to golden / golden_with_variants.
ul_symbol_has_stub_names{source, pin_count, suggestion, chip_fetcher_action}Don't refetch the .kicad_sym — UL stub-naming is a UL property, not a chip-fetcher choice. Instead mark the chip dir's symbol source as ds2sf-preferred so downstream sym_create authors a fresh symbol with real labels from ds2sf's JSON.
rerun_ds2sf_with_stronger_model{reason, suspect_field, suggested_model}Re-run ds2sf extract --force --model claude-opus-4-7. ds2sf likely misread a small dimension or pin field with Haiku. Verify by re-running concur.
accept_with_caveats{caveats}Soft diffs within tolerance — accept the dataset, just remember the caveats for UI display.
human_review{reason, notes}Surface to a human; no automated repair safe.
source_parse_failed{format, path, error}A source file couldn't be parsed. If format == altium and concur version < 1.0, this is expected (Altium binary parser isn't implemented yet).

Agent-to-agent calling recipe

// (Pseudo-Rust for chip-fetcher's caller side.)

// Step 1: ds2sf
let ds2sf = run_ds2sf(chip_dir);
if ds2sf.status != "ok" {
    // Handle ds2sf needs_better_pdf path — see ds2sf SKILL.md.
}

// Step 2: concur
let mut tried_refetches: HashSet<String> = HashSet::new();
loop {
    let r = run_concur(chip_dir);
    match r.status.as_str() {
        "golden" | "golden_with_variants" => {
            // Apply ul_symbol_has_stub_names by marking the chip dir's
            // symbol source as ds2sf-preferred for downstream sym_create.
            for h in &r.hints {
                if let Hint::UlSymbolHasStubNames { .. } = h {
                    mark_chip_dir_symbol_source(chip_dir, "ds2sf-preferred");
                }
            }
            mark_chip_dir_clean(chip_dir, &r.variants);
            break;
        }
        "divergent" => {
            // Walk hints in order. First action that's not yet been tried wins.
            let mut acted = false;
            for h in &r.hints {
                match h {
                    Hint::RerunDs2sfWithStrongerModel { suggested_model, .. } => {
                        run_ds2sf(chip_dir, &["--force", "--model", suggested_model]);
                        acted = true; break;
                    }
                    Hint::RefetchLibrarySource { format, suggested_sources, .. } => {
                        for src in suggested_sources {
                            let key = format!("{format}|{src}");
                            if tried_refetches.insert(key) {
                                refetch_library(chip_dir, format, src);
                                acted = true; break;
                            }
                        }
                        if acted { break; }
                    }
                    _ => {}
                }
            }
            if !acted {
                // Out of automated options.
                log_for_human(&r);
                break;
            }
        }
        "unrecoverable" => { log_for_human(&r); break; }
        _ => unreachable!(),
    }
}

Out of scope for v0.1

  • Altium binary parsing (.SchLib / .PcbLib are OLE-compound). Surfaces as human_review with reason altium_parser_not_implemented.
  • Body-thickness comparison (z-dim). Sources don't reliably report this.
  • Automatic pin-name slash-normalization beyond /_ (e.g. fully-qualified mux paths).

Related

  • ds2sf (skill at ~/.claude/skills/ds2sf/SKILL.md) — upstream: extracts symbol+footprint+provenance from the datasheet PDF.
  • chip-fetcher (skill at ~/.claude/skills/chip-fetcher/SKILL.md) — primary consumer; pulls the libraries that concur cross-checks.

Sub-Skills
?
What are Sub-Skills?

Sub-skills are community-contributed AI skill extensions for this component. They teach AI assistants about specific tools, configurators, or workflows.

Examples:

  • A manufacturer’s configuration tool for a motor controller
  • A community-written design guide for an amplifier circuit
  • An automated test/validation script for a sensor module

How to add one: Click Add Sub-Skill, provide the URL to your skill and a brief description. Submissions are reviewed by the Adom team before going live.

No sub-skills yet. Be the first to contribute one!

🔎 How Claude finds this page (discovery snippet)

This page opts into Adom Wiki auto-discovery. When a user working in Claude Code mentions any of the trigger phrases below, Claude can proactively suggest this page. The pitch is exactly what Claude will say.

Pitch
"After ds2sf returns status=ok, run concur to cross-check the datasheet-extracted dataset against chip-fetcher's KiCad UL bundle and Fusion 360 EAGLE library. Catches wrong-variant UL bundles, stub-only pin names, pad-count mismatches around exposed/thermal pads, and package-family disagreements — emits a result.json with status golden/divergent/unrecoverable and tagged hints[] so chip-fetcher can autonomously re-fetch a suspect library or escalate to a human."
Triggers
"concur", "golden dataset", "cross-source check", "kicad eagle altium agreement", "lib agreement", "library mismatch", "ds2sf vs kicad", "ul stub symbol", "refetch library", "chip lib consensus", "wrong variant ul bundle", "after ds2sf", "chip fetcher next step", "validate chip lib", "stub pin names"
Page URL

Recent activity

19 commits