Overview · Parity checklist

Capital 2512.2608 · /devices/ · 2026-09-25

Device Modeler: stock Siemens app vs our replacement

Every function of the stock Capital Device Modeler, how our replacement handles it, and the evidence. Everything marked Same was exercised against live Capital and read back independently. Four actions were also run through both user interfaces and compared request by request.

STOCK · capitalwebapp.war (Siemens)

AngularJS 1.x, minified, no extension point. Kept on the server as capitalwebapp.war.stock; tools\rollback.ps1 restores it.

REPLACEMENT · 0.9.5 LIVE

React + TypeScript, same war name and layout, served at /devices/. Deployed and verified 2026-09-25 (sha256 c19ed858…).

40stock features at parity, exercised live
23 / 23stock write requests reproduced exactly, by script
2stock features built but not testable here
0stock features missing

Feature by feature

Same matches stock, exercised on live Capital Differs same result, different screen or behaviour New not in the stock app Untested built, not yet exercised N/A broken or absent in stock too
FunctionStock Device ModelerReplacement 0.9.5StatusEvidence
Navigation and shell
Getting to a moduleLanding page with three tiles (Device Modeler, Component Library, Dictionary); ICD and library browsers open as modal dialogsOne top bar (ICDs, Connectivity, Library, Dictionary); master list on the left, editor on the rightDiffersSame routes: stock hash links such as #/ICD/editICD/{uid} open the same object
Deep linksHash form works; path form /devices/{name}/ICD/editICD/{uid} returns 404Hash form works from a cold load; path form redirected to the hash formSameAUDIO UNIT:A opened cold. Not tested from the ConnectivityHub plugin
Login, permissionsCapital login; buttons follow functional permissionsSame login and session cookie; same permission gates (create/edit/delete/assign/import/export ICD, dictionary edit)SameChecked against whoami permission lists
ICDs
ICD list and text searchQuery-driven list in the ICD browserFull list with search box; power queries belowSame13 stock ICDs listed with release level and part number
View all fields and sectionsForm plus Descendants, Pins, Footprint, Nets, Properties sectionsSame fields and sectionsSameAUDIO UNIT:A compared field for field with the stock page
New ICDGreen + opens a blank form; uid minted up frontNew opens a blank form; uid minted up frontSameSide-by-side: 41 request fields identical apart from name; stored objects 0 differences
Pins and nets entrySpreadsheet grid; nets typed in a search box inside the Nets cell; "Copy selected" duplicates a pin with its netsTable; bulk add (1-12 or A,B,C); "+ net" per pin, several nets per pinDiffersBoth store the same pinSignalAssociations; read back on ZZTEST_ICD2
Net attributes and optionsShield, signal group, option expression per netSameSameShield true, signal group GRP/AUDIO, net option read back
Option expression dialogProject options, operators, validationSame, with the same project-options lookupSameG1..G7 listed, bogus name rejected, G1 || G2 saved
Applicability, Projects, DomainsDesign and Project tags, domainsSame tag contextsSame2-Audio, Aerospace ELA Power Design saved; no domains exist here
User properties (ICD, pin, net)Editable; rich-text ones read-onlySameSamePinColor=Red, NetGauge=22AWG, ZZ Note=hello read back
Release levels and lockingAllowed transitions only; Obsolete locks the formSame transitions and the stock lock reasonSameA1 Draft to Obsolete (locked) to Draft
Assign part, clear partPulls type code, footprint, supplier/customer PN and pins from the partSame, via the library pickerSameZZTEST_ICD2_copy + ZZTEST_DEV3: all fields and pins A1/A2
Copy, Revise, Create descendantUnsaved template, then CreateSame two-step flowSameZZTEST_ICD2_copy:A, :A1, _child:A (parent link read back)
Ancestor ICD pickerCandidate parents listSame listSamePicked from 18 candidates; parent read back
DeleteConfirm dialog, then deleteConfirm, then deleteSameSide-by-side: identical DELETE /icds/{uid}, 204, both gone
Export, Import, Import Merge.zip round tripSame endpointsSame11,913-byte export re-imported; merge updated in place
XSD importServer-defined XML import (?dataType=xsd)Same call wired upUntestedNo sample file exists here; format undocumented
Create component from ICDLibrary device from the ICD's pinsSameSameZZTEST_DEV_FROM_ICD2 created and assigned
ICD Table EditorMulti-ICD grid editSameSameRole changed, pins untouched
Harness footprint (pin to cavity)Connector clones and cavity mapping; duplicate cavity refusedSame rulesSameJ1/J2 clones of C-81334 mapped and read back
Backshell signalsNets on a backshell; footprint locked while one existsSame, footprint kept intact on saveSameBS1 on J1 edited and read back with footprint intact
Power queriesFrom site icdqueries.json (absent here: stock shows none)Site file when present, built-in set otherwiseSameApplicable 2-Audio 17; role ZZTEST 5
Net filter in the ICD formStarting-with filterWildcards * and ?SameZ*1A pin 1 only
Component library
Latest devices, searchFixed "Latest Devices" list (25 shown) plus searchSame list; Enter queries Capital and also finds new parts the fixed list omitsSame27 latest
New, edit, copy, revise devicePins, properties by type code, footprints and cavity mapping, customer/supplier PNsSame, with the stock "one preferred supplier" ruleSameSide-by-side edit: 43 request fields identical apart from the text typed
Type code change dialogRemove / Keep / RevertSame three choicesSameRevert kept DEV, nothing dirty
Library power queries, select modeSite queries; picker for ICD assign partSameSameType code ZZTEST* 8
Sort order of listsOwn natural sort (1N-... before 10-...)The ported stock sort in the dictionary, ICD list, table editor, cavity pickers and pin grid (rows never move while typing)SamePort identical to the stock function on 16,641 name pairs; the stock ICD master list order itself was not observed
Dictionary
Devices, Logic Designs, Nets gridsColumn filters and sort, locked by defaultSame, Unlock table to editSame14 / 5 / 119 entries
Add, edit, delete, rename, propertiesOne Save sends a deltaSame delta formatSameSide-by-side add: 16 fields identical apart from name (after the 0.9.2 fix)
Saved filters, validationPer-browser saved filters; length and unique-name checksSameSameFilter survived reload; duplicate blocked
Dictionary Import / ExportButtons present, server answers 404Not offeredN/ANetwork-dictionary actions; broken in stock
Signals / MessagesNot in Device ModelerNot in scopeN/ASeparate Capital Dictionary app
Only in the replacement
ICD Connectivity viewNone: ICDs load one at a timeEvery ICD and its nets on one diagram; all / one ICD / one net; zoom and panNew20 ICDs, 34 nets (29 shared) live
Straight, pin-facing wiringn/aPins face their partner; 3+ endpoint nets drawn as a bus with tees; no wire crosses a boxNewLive data: 56 to 28 bends, 17 to 0 wires through boxes (0.9.0 to 0.9.5)
Drag boxes, saved positionsn/aDrag any box; wires re-route around it; Re-layout restores; saved views keep the positionsNewMoved box keeps every pin wired, 0 wires through boxes; round trip in logic tests
Connectivity checksn/aNets that go nowhere, near-duplicate names, impossible option combinations, non-overlapping effectivities, duplicate or unwired pins, nets not in the dictionaryNew15 genuine findings on live data; error branches proven on built-to-fail input
Compare revisionsn/aFields, applicability, pins, nets, options, and other ICDs affectedNewMatches an independent diff of the raw data
Grouping and background layoutn/aGroup by applicability, project or role; layout in two workersNew300 synthetic ICDs grouped: 10 boxes, 0.4 s, clean
Export and saved viewsn/aSVG of the diagram, CSV of the From/To table, named views per browserNewExported SVG parses with every box and wire
Supplyframe risk badgesn/aRisk beside supplier part numbers and in the part picker, via a same-origin forwarderNewBuilt by a companion session; nothing writes to Capital
Connectivity filtersn/aApplicability, project, effectivity, options at ICD, pin and net levelNewLesson 1 shows 1 ICD, 2-Audio 17: both match a direct query
Build-list filtern/aMatches the stock BuildList tag contextUntestedNone of the 116 projects has a build list yet
From / To tablen/aEvery connection with expandable details under the diagramNew48 rows on live data
Read-back after every saveSaves and reloadsRe-reads the object and says so ("Saved and read it back")NewCatches Capital's empty-200 answer for deleted ICDs
Self-test and contract checkNone#/selftest: 10 live write checks incl. 2 that must fail; read-only check of every Capital endpoint against a recorded shape snapshotNewSelf-test 10 of 10 (0.9.4); contract 14 of 14
Version marker and rollbackNonePage carries its version; deploy and rollback scripts verify by what the server returnsNewdm-replacement-version 0.9.2 read from /devices/

The side-by-side run

The same four actions done by hand in the unmodified stock app and in ours, with every request recorded by a logging proxy, compared on the request sent and on the object Capital stored. A scripted comparison then replays all 23 recorded stock writes, across 11 operations, through the replacement's own code: all match, with two accepted differences, and a planted change is caught.

Create ICD Match

POST /icds

2 pins on one net, Design tag, effectivity. 41 fields: only the name differs, plus one extra empty field from ours that Capital accepts. Stored objects identical.

Dictionary add Match after fix

PUT devicesdictionary

First run exposed a bug in ours: new rows re-sorted while typing, which lost the name and edited the wrong row. Server data restored, fixed in 0.9.2, rerun identical.

Delete ICD Match

DELETE /icds/{uid}

Identical request and 204 answer; both ICDs gone by query, with a control query proving an existing ICD is still found.

Library edit Match

PUT /parts/devices/{uid}

43 fields: only the text typed and the concurrency timestamp differ. Ours also displayed the stock app's edit correctly before changing it.

Connectivity layout, live data

Measure0.9.00.9.5
Bends5628
Wire segments through a box170
Overlapping wire pairs20
Pins off a west or east edge20

Not yet covered