CHIP data model cross-check¶
The schema snapshot (parity/schema.json) and the cluster definitions
generated from it come from matter.js, the gold standard of this module
(ADR 0013). The CSA's Python
certification cases judge a device against something else: connectedhomeip's
spec-derived data model, data_model/<version>/ (clusters/*.xml,
device_types/*.xml), read by
src/python_testing/matter_testing_infrastructure/matter/testing/spec_parsing.py.
Certifiability is a goal (ADR 0011,
certifiability.md), so every disagreement between the
two is found by go test (with a connectedhomeip checkout, as CI has) before a
certification case finds it — for the whole
snapshot, not only for the clusters the reference daemon mounts.
How it works¶
internal/chipdm reduces both sides to one model and compares them element by
element, the way matter.js validates its own model against the same XML
(support/codegen/src/chipdm/, validate-chipdm-model.ts):
- clusters — id, name, revision; features (code, bit, conformance);
attributes, commands and events (id, name, type, direction, response,
priority, conformance, constraint, access facet by facet, quality, default,
list entry type); data types and their members (enum values, bitmap bits,
struct, command and event fields). Derived clusters are compared resolved:
the snapshot's
effectivelayer against CHIP's base chain (baseCluster). - device types — id, name, revision, classification, the conditions each
declares, every server and client cluster requirement with its conformance
and quality (the singleton
I), the feature / attribute / command / event requirements nested in it (conformance, constraint, id), and every condition requirement (the declaring device type, the condition, its conformance and constraint). The Base device type is compared too: it has no id on either side and pairs as the one without. Cluster classification (application / endpoint / node utility) is compared with the clusters — device type validation reads it for Base's Server and Client conditions. - global data types — CHIP's
globals/against the snapshot'sglobalDatatypes.
Conformance is compared as an expression, not as text: CHIP's
<mandatoryConform> / <optionalConform> / <otherwiseConform> / … tree and
matter.js's AST (or, for device-type requirements, its text, parsed with
matter.js's grammar) become one tree; names compare case- and
punctuation-insensitively, literals by value, and the operands of an AND / OR
chain as a set.
Every difference is classified, none is tolerated silently:
| Class | Meaning | Where |
|---|---|---|
| (i) | matter.js is right or deliberately different: CHIP's XML lags or is known wrong, or a matter.js override states a reasoned divergence | internal/chipdm/acknowledged.go, with matter.js's reason and source |
| (ii) | CHIP is right and the snapshot is wrong — a certifiability risk wherever go-fabric depends on the value | acknowledged.go, each with its impact; open ones in matter_behaviour_findings.md |
| (iii) | representation only (naming, how base clusters, global types or supersets are expressed) | normalized in internal/chipdm/compare.go, counted per rule |
| (iv) | the certification harness's own data-model parsing corrects or excuses it | acknowledged.go, citing spec_parsing.py |
TestChipDataModelCrosscheck fails on a difference the table does not
explain and on a table entry that explains none, so the table cannot rot.
How the harness reads the same XML¶
What spec_parsing.py, conformance.py and device_conformance_tests.py
(at the pinned commit) do with the XML, and so what agreement buys:
- Directory. The DUT's
SpecificationVersionselects the directory (dm_from_spec_version): 0x01060100 →data_model/1.6.1, the directory compared here. - Derived clusters. A derived cluster is its base (a pure base cluster
such as Mode Base or Alarm Base, or another cluster) with the derived
file's conformance and access overriding (
combine_derived_clusters_with_base) — the resolutioninternal/chipdmapplies before comparing. The concentration-measurement family is one file with ten cluster ids. - Conformance. D (deprecated) evaluates as disallowed, P (provisional)
as disallowed unless the run allows provisional elements,
descas optional. A D or X in CHIP's model where the snapshot says O or M would therefore fail TC_DeviceConformance on a device that serves the element — the cross-check finds exactly those disagreements. - Provisional clusters. A cluster whose cluster id is marked provisional fails the run unless provisional elements are allowed; the generated block lists them. go-fabric serves none of them.
- Known-problem fix-ups (
build_xml_clusters): Descriptor's TAGLIST feature and every Actions command become optional, ColorControl's Primary1–6 attributes optional, TemperatureControl's attributes are supplied when the XML lacks them, and AtomicRequest / AtomicResponse are added to Thermostat from revision 8. The last is a class (iv) acknowledgement; the others cause no difference. - Errata overlay (
data_model/errata_future.yaml, applied to 1.6 and 1.7): it sets AmbientContextSensing.SimultaneousDetectionLimit to no write access, which the 1.6.1 XML and the snapshot already state. - Device types. The Base Device Type's server clusters are added to
every device type; superset lines (
classification superset) govern which device types may share an endpoint. Cluster names of 0x0006, 0x0036 and 0x042A and two device-type names are corrected in code (CLUSTER_NAME_FIXES,DEVICE_TYPE_NAME_FIXES) — names this comparison normalizes anyway. The feature, attribute and command overrides a device type states for a cluster are enforced (check_device_type,check_feature_overridesand its siblings) on a cluster the endpoint serves; event overrides are not read. Every condition evaluates as optional (conformance.pydevice_feature; onlyMatteris mandatory andZigbeedisallowed), so an override that a condition gates is never required by the harness, and!Conditionstays optional too. The snapshot carries these overrides and conditions, compared above; the module holds an assembled endpoint to them (ADR 0016).
The CHIP side¶
The XML is read at test time from a connectedhomeip checkout, at the commit
the harness image was built from (the Makefile's CHIP_TEST_IMAGE_COMMIT), in
the directory of the snapshot's Matter revision (CHIP_DATA_MODEL_VERSION).
Nothing read from it is committed: every file carries a CSA notice that
forbids publishing it or creating derivative works from it
(ADR 0015). This page
carries only this module's own analysis — counts, provenance, and each
classified difference as its path and the two differing values.
- The checkout is
GOFABRIC_CHIP_ROOT, else../connectedhomeipbeside the main checkout (make chiptool-setupmakes it, withdata_model/<version>in its sparse set). The pinned commit is read withgit archive, so the checkout's own HEAD does not matter. - Without it,
TestChipDataModelCrosscheck,TestChipDataModelPinsandTestCompareSeededDifferencesskip and say why; the parser and comparer are still held by unit tests on synthetic fixtures. WithGOFABRIC_CHIP_REQUIRED=1a skip is a failure. - CI's "chip data model cross-check" job fetches only
data_model/<version>at the pin (a blob-filtered, depth-1 partial clone, cached by pin) and runsmake chipdm-check, so the comparison runs on every pull request.
make chiptool-setup # ../connectedhomeip at the pin, data_model/<version> in the sparse set
make chipdm-check # the cross-check against it; fails instead of skipping
make chipdm-report # rewrite this page's generated block
A schema pin bump, a harness image bump or a reader change re-runs the comparison; what moved relative to the CSA model is the diff of the generated block below.
Status¶
Provenance¶
| Side | Source |
|---|---|
| snapshot | parity/schema.json, matter.js 862ad75f4d3c7ab528b8a3954168146082cad8a6, Matter 1.6.1, SHA-256 3b18deb666e85dab9401a536f86946be841a99a5532f1fd52faa913fd87cb3b0 |
| CHIP | connectedhomeip 6170af8461b10b1766044122ac83332c6d00ab20, data_model/1.6.1 (git tree 77969732bddf4bd12ba57eb1c6fa032eb2613425) |
| CHIP's source | specification 1.6.1-attempt-4 (49f70c101b4211df3febb975a7f7f9d6e4c4bc94), alchemy version: v1.7.10 |
| read | at test time from a connectedhomeip checkout; nothing of it is committed (ADR 0015) |
| harness | the Makefile's CHIP_TEST_IMAGE_COMMIT is the same commit |
Compared¶
| Element | Compared |
|---|---|
| attribute | 1116 |
| cluster | 135 |
| command | 457 |
| condition | 46 |
| conditionRequirement | 57 |
| datatype | 548 |
| deviceType | 92 |
| element requirement | 153 |
| event | 137 |
| feature | 347 |
| field | 3927 |
| global datatype | 19 |
| requirement | 470 |
| total | 7504 |
Differences by class¶
| Class | Differences |
|---|---|
| (i) matter.js right or deliberate | 113 |
| (ii) CHIP right, snapshot wrong | 2 |
| (iii) representation, normalized in code | 539 |
| (iv) excused by the harness | 2 |
| unexplained | 0 |
(iii) Normalization rules¶
| Rule | Applied | What it normalizes |
|---|---|---|
base-device-type |
6 | CHIP names the Base device type "Base Device Type", matter.js "Base"; a condition requirement asserting one of its conditions names it so. |
composed-device-type |
56 | CHIP models the device types a composed device type contains outside its cluster requirements. |
core-global |
3 | The Interaction Model status codes, event priority and semantic namespace ids are global types of the Core specification that CHIP's data model XML does not restate. |
datatype-fabric |
21 | matter.js marks a fabric-scoped struct by its FabricIndex field, CHIP on the struct. |
descriptor-required |
91 | Every device type requires Descriptor; CHIP's device-type files do not restate it. |
enum-as-integer |
1 | CHIP types a value enumN where the snapshot states the integer of the same width. |
fabric-index |
30 | CHIP omits the FabricIndex of a fabric-scoped value because the specification implies it. |
feature-o |
0 | A feature CHIP marks O where the specification's feature table has no conformance column. |
global-attribute |
231 | Global attributes (0xFFF8 and up) are not restated by CHIP's cluster files. |
global-datatype |
4 | CHIP repeats a global data type in each cluster that uses it; the snapshot defines it once. |
member-access |
0 | The snapshot carries a struct, command or event field's access only where it is fabric-sensitive. |
null-default |
0 | CHIP writes an explicit null default for a nullable value whose default the specification leaves implicit. |
quality-reportable |
0 | CHIP does not model matter.js's P (reportable) quality. |
scoped-global |
0 | CHIP defines the type globally; matter.js scopes it to the cluster that uses it (compared there). |
superset-requirement |
4 | A superset device type: matter.js derives it from the subset type and restates the subset's requirements, CHIP lists only its own. |
type-alias |
18 | The specification and CHIP name the same type differently (matter.js by-design.ts TYPE_ALIASES). |
type-bound |
3 | The snapshot's effective constraint closes a CHIP lower bound with the upper bound of the type (percent 100, percent100ths 10000). |
type-metabase |
28 | CHIP states the primitive or base type a named type builds on (enum8, map8, uint8); the snapshot names the type. |
value-table-m |
43 | An enum value, bitmap bit or status code CHIP marks M where the specification's table has no conformance column. |
Not compared¶
What CHIP states and the snapshot does not carry, counted in CHIP's model.
| Aspect | CHIP elements | Why |
|---|---|---|
| cluster provisional status | 3 | The snapshot does not record that a cluster is provisional; the clusters CHIP marks are listed below. |
| command quality | 39 | The snapshot records no quality for commands (CHIP marks large-message commands L). |
| definitions outside the snapshot | 5 | CHIP global types matter.js defines in a shared definitions scope (WebRtcTransportDefinitions) that the extractor does not emit. |
| event quality | 0 | The snapshot records no quality for events. |
| global commands | 2 | AtomicRequest / AtomicResponse: matter.js models them in the clusters that use them (load-data-model.ts globalCommands). |
| members CHIP does not state | 4 | A command, event or data type whose fields CHIP leaves unstated because the specification gives them by reference (Level Control's *WithOnOff commands); the snapshot's fields have nothing to be compared with. |
| semantic namespaces | 28 | The snapshot carries no semantic namespaces. |
Provisional clusters¶
CHIP marks these cluster ids provisional. A certification run rejects a provisional cluster on a device under test (device_conformance_tests.py check_conformance), whatever the snapshot says.
- TemperatureAlarm
- AmbientContextSensing
- ContentControl
(i) matter.js is right or deliberately different¶
| Path | Property | CHIP | snapshot | n | Reason | Source |
|---|---|---|---|---|---|---|
| ClosureDimension.Resolution | default | 0.01 |
1 |
1 | CHIP states the fallback of a percent100ths attribute unscaled; 0.01 is not a value of the type | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| ClosureDimension.StepValue | default | 0.01 |
1 |
1 | CHIP states the fallback of a percent100ths attribute unscaled; 0.01 is not a value of the type | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| GeneralCommissioning.ArmFailSafeResponse.ErrorCode | default | success |
0 |
1 | The specification names the value Ok where the global status names it Success; spec enhancement filed | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| GeneralCommissioning.SetRegulatoryConfigResponse.ErrorCode | default | success |
0 |
1 | The specification names the value Ok where the global status names it Success; spec enhancement filed | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| GeneralCommissioning.CommissioningCompleteResponse.ErrorCode | default | success |
0 |
1 | The specification names the value Ok where the global status names it Success; spec enhancement filed | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| GeneralCommissioning.SetTcAcknowledgementsResponse.ErrorCode | default | success |
0 |
1 | The specification names the value Ok where the global status names it Success; spec enhancement filed | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| OperationalCredentials.NocResponse.FabricIndex | conformance | statuscode==success,o |
statuscode==ok,o |
1 | The specification names the value Ok where the global status names it Success; spec enhancement filed | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| JointFabricAdministrator.IcaccsrResponse.Icaccsr | conformance | statuscode==success,o |
statuscode==ok,o |
1 | The specification names the value Ok where the global status names it Success; spec enhancement filed | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| DoorLock.DoorStateChange | priority | desc |
critical |
1 | The specification requires CRITICAL for the states that matter and permits INFO otherwise, so matter.js states CRITICAL; a DoorLock override records that deliberately | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| DoorLock.LockOperation | priority | desc |
critical |
1 | The specification requires CRITICAL for the states that matter and permits INFO otherwise, so matter.js states CRITICAL; a DoorLock override records that deliberately | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| DoorLock.LockOperationError | priority | desc |
critical |
1 | The specification requires CRITICAL for the states that matter and permits INFO otherwise, so matter.js states CRITICAL; a DoorLock override records that deliberately | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| DoorLock.ClearWeekDaySchedule.WeekDayIndex | constraint | 254 |
1tonumberofweekdayschedulessupportedperuser,254 |
1 | We keep both alternatives the specification states; CHIP keeps the sentinel | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| DoorLock.ClearYearDaySchedule.YearDayIndex | constraint | 254 |
1tonumberofyeardayschedulessupportedperuser,254 |
1 | We keep both alternatives the specification states; CHIP keeps the sentinel | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| DoorLock.ClearHolidaySchedule.HolidayIndex | constraint | 254 |
1tonumberofholidayschedulessupported,254 |
1 | We keep both alternatives the specification states; CHIP keeps the sentinel | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| DoorLock.ClearUser.UserIndex | constraint | 65534 |
1tonumberoftotaluserssupported,65534 |
1 | We keep both alternatives the specification states; CHIP keeps the sentinel | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| IlluminanceMeasurement.MeasuredValue | constraint | 0 |
0,minmeasuredvaluetomaxmeasuredvalue |
1 | We keep the range the specification states alongside the zero sentinel | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| Thermostat.SetpointChangeAmount | type | int16s |
temperaturedifference |
1 | We name the temperature type the specification defines; CHIP states a primitive | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| ContentLauncher.ContentSearchStruct.ParameterList | default | 0 |
undefined |
1 | CHIP states a numeric fallback for a list; the specification states none | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| *.SolicitOfferResponse.VideoStreamId | conformance | solicitoffer,d |
solicitoffer.videostreamid,d |
1 | matter.js keeps the field the conformance selects; CHIP names only the command | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| *.SolicitOfferResponse.AudioStreamId | conformance | solicitoffer,d |
solicitoffer.audiostreamid,d |
1 | matter.js keeps the field the conformance selects; CHIP names only the command | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| *.ProvideOfferResponse.VideoStreamId | conformance | provideoffer,d |
provideoffer.videostreamid,d |
1 | matter.js keeps the field the conformance selects; CHIP names only the command | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| *.ProvideOfferResponse.AudioStreamId | conformance | provideoffer,d |
provideoffer.audiostreamid,d |
1 | matter.js keeps the field the conformance selects; CHIP names only the command | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| KeypadInput.CecKeyCodeEnum.Reserved | field | present |
absent |
1 | We drop a value the specification names Reserved; CHIP keeps it | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| Messages.MessageID | datatype | absent |
present |
1 | The specification defines the type in the cluster; CHIP treats it as a built-in | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| ScenesManagement.LogicalSceneTable | datatype | absent |
present |
1 | The specification defines the type in the cluster; CHIP omits it | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| *.ModeChangeStatus | datatype | absent |
present |
10 | matter.js names the status codes of the mode clusters ModeChangeStatus; CHIP types the field as the global status | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| RvcCleanMode.StatusCodeEnum | datatype | present |
absent |
1 | matter.js names the status codes of the mode clusters ModeChangeStatus | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| RvcRunMode.StatusCodeEnum | datatype | present |
absent |
1 | matter.js names the status codes of the mode clusters ModeChangeStatus | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| Thermostat.MinSetpointDeadBand | constraint | 0to127 |
0to12.7°c |
1 | We keep the temperature notation of the specification where CHIP states the encoded value | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| OperationalCredentials.AttestationResponse.AttestationElements | constraint | maxresp_max |
max900 |
1 | matter.js resolves the RESP_MAX constant the specification defines; CHIP keeps the name | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| OperationalCredentials.CsrResponse.NocsrElements | constraint | maxresp_max |
max900 |
1 | matter.js resolves the RESP_MAX constant the specification defines; CHIP keeps the name | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| OtaSoftwareUpdateRequestor.AnnounceOtaProvider | access fabric | absent |
F |
1 | The specification scopes the command to the accessing fabric; CHIP's data model XML does not record it | matter.js support/codegen/src/chipdm/by-design.ts KNOWN_DIFFERENCES |
| ColorControl.RemainingTime | constraint | max65534 |
0to65535 |
1 | 65535 stands for "endless" while a color loop runs | matter.js support/models/src/local/ColorControlOverrides.ts |
| ColorControl.ColorTemperatureMireds | constraint | max65279 |
colortempphysicalminmiredstocolortempphysicalmaxmireds |
1 | The physical bounds the specification's prose states, which validate a value against the device | matter.js support/models/src/local/ColorControlOverrides.ts |
| CommodityTariff.TariffComponentStruct.PeakPeriod | default | 0 |
undefined |
1 | The specification states 0 as the default of a struct-typed field, which no struct can be | matter.js support/models/src/local/CommodityTariffOverrides.ts |
| CommodityTariff.TariffComponentStruct.PowerThreshold | default | 0 |
undefined |
1 | The specification states 0 as the default of a struct-typed field, which no struct can be | matter.js support/models/src/local/CommodityTariffOverrides.ts |
| FanControl.FanModeEnum.Medium | conformance | [low] |
o |
1 | "[Low]" names another enum value, which a value's conformance cannot be evaluated against | matter.js support/models/src/local/FanControl.ts |
| JointFabricDatastore.DatastoreAccessControlEntryStruct.Subjects | constraint | maxsubjectsperaccesscontrolentry |
none |
1 | The bound is an attribute of another cluster (Access Control), which a constraint cannot reach | matter.js support/models/src/local/JointFabricDatastoreOverrides.ts |
| JointFabricDatastore.DatastoreAccessControlEntryStruct.Targets | constraint | maxtargetsperaccesscontrolentry |
none |
1 | The bound is an attribute of another cluster (Access Control), which a constraint cannot reach | matter.js support/models/src/local/JointFabricDatastoreOverrides.ts |
| LocalizationConfiguration.ActiveLocale | constraint | max35 |
insupportedlocales |
1 | Validates the value against SupportedLocales, whose entries the specification bounds to 35 | matter.js support/models/src/local/LocalizationConfigurationOverrides.ts |
| OtaSoftwareUpdateRequestor.UpdateStateProgress | quality | nullable |
nullable quieter |
1 | The specification asks nodes not to over-report progress; Q states that | matter.js support/models/src/local/OtaSoftwareUpdateRequestor.ts |
| UserLabel.LabelList | constraint | desc |
min0 |
1 | "Minimum 4" means a node supports at least four entries; an empty list is valid | matter.js support/models/src/local/UserLabelOverrides.ts |
| TlsClientManagement.FindEndpointResponse.Endpoint | constraint | 0to65534 |
none |
1 | The specification bounds a TLSEndpointStruct by the range of TLSEndpointID; no comparison orders a struct against a number | matter.js support/models/src/local/TlsClientManagementOverrides.ts |
| DoorLock.OperatingModesBitmap.AlwaysSet | field | absent |
present |
1 | The bitmap is inverse; the bits the specification leaves unnamed are always set | matter.js support/models/src/local/DoorLockOverrides.ts |
| Thermostat.HVACSystemTypeBitmap | datatype | absent |
present |
1 | Types of the attributes Matter 1.5.1 removed, kept for clients until 1.7 | matter.js support/models/src/local/ThermostatOverrides.ts |
| Thermostat.ProgrammingOperationModeBitmap | datatype | absent |
present |
1 | Types of the attributes Matter 1.5.1 removed, kept for clients until 1.7 | matter.js support/models/src/local/ThermostatOverrides.ts |
| WindowCovering.TypeEnum.* | conformance | m |
!tl&lf |
7 | matter.js states the lift / tilt feature each covering type needs; the specification's enum table has no conformance column, so CHIP marks every value M | matter.js support/models/src/local/WindowCoveringOverrides.ts |
| WindowCovering.TypeEnum.* | conformance | m |
!lf&tl |
1 | matter.js states the lift / tilt feature each covering type needs; the specification's enum table has no conformance column, so CHIP marks every value M | matter.js support/models/src/local/WindowCoveringOverrides.ts |
| WindowCovering.TypeEnum.* | conformance | m |
!lf&tl\|!tl&lf |
1 | matter.js states the lift / tilt feature each covering type needs; the specification's enum table has no conformance column, so CHIP marks every value M | matter.js support/models/src/local/WindowCoveringOverrides.ts |
| WindowCovering.TypeEnum.* | conformance | m |
o |
1 | matter.js states the lift / tilt feature each covering type needs; the specification's enum table has no conformance column, so CHIP marks every value M | matter.js support/models/src/local/WindowCoveringOverrides.ts |
| WindowCovering.EndProductTypeEnum.* | conformance | m |
!tl&lf |
15 | matter.js states the lift / tilt feature each covering type needs; the specification's enum table has no conformance column, so CHIP marks every value M | matter.js support/models/src/local/WindowCoveringOverrides.ts |
| WindowCovering.EndProductTypeEnum.* | conformance | m |
!lf&tl |
1 | matter.js states the lift / tilt feature each covering type needs; the specification's enum table has no conformance column, so CHIP marks every value M | matter.js support/models/src/local/WindowCoveringOverrides.ts |
| WindowCovering.EndProductTypeEnum.* | conformance | m |
lf&tl |
5 | matter.js states the lift / tilt feature each covering type needs; the specification's enum table has no conformance column, so CHIP marks every value M | matter.js support/models/src/local/WindowCoveringOverrides.ts |
| WindowCovering.EndProductTypeEnum.* | conformance | m |
!lf&tl\|!tl&lf |
3 | matter.js states the lift / tilt feature each covering type needs; the specification's enum table has no conformance column, so CHIP marks every value M | matter.js support/models/src/local/WindowCoveringOverrides.ts |
| WindowCovering.TypeEnum.TiltBlindLift | field | absent |
present |
1 | Value 8 keeps its earlier name; CHIP names it TiltBlindLiftAndTilt (same value) | matter.js support/models/src/local/WindowCoveringOverrides.ts |
| WindowCovering.TypeEnum.TiltBlindLiftAndTilt | field | present |
absent |
1 | Value 8 keeps its earlier name TiltBlindLift (same value) | matter.js support/models/src/local/WindowCoveringOverrides.ts |
| WindowCovering.GoToLiftPercentage.Ignored | field | absent |
present |
1 | The specification defines a second field CHIP does not use; matter.js disallows it (X) to follow the de-facto standard | matter.js support/models/src/local/WindowCoveringOverrides.ts |
| WindowCovering.GoToTiltPercentage.Ignored | field | absent |
present |
1 | The specification defines a second field CHIP does not use; matter.js disallows it (X) to follow the de-facto standard | matter.js support/models/src/local/WindowCoveringOverrides.ts |
| ModeSelect.StandardNamespace | type | enum16 |
namespace |
1 | The namespace type enumerates exactly the standard namespace ids, at the width of the semantic tag's NamespaceID (enum8), which every standard namespace id fits; TLV carries the value at its own width | matter.js support/models/src/local/ModeSelectOverrides.ts |
| WindowCovering.MovementStatus | datatype | absent |
present |
1 | The formal type of the OperationalStatus bit fields, which the specification describes in prose | matter.js support/models/src/local/WindowCoveringOverrides.ts |
| *.ModeTag.MfgTags | field | absent |
present |
10 | The specification reserves the manufacturer range of this enum; matter.js models it as a range member so a value in it validates (packages/node/src/behavior/state/validation/ValueValidator.ts:172-178), chip's XML lists only the named values | matter.js packages/model/src/standard/elements/mode-base.element.ts |
| *.ErrorStateEnum.ManufacturerError | field | absent |
present |
3 | The specification reserves the manufacturer range of this enum; matter.js models it as a range member so a value in it validates (packages/node/src/behavior/state/validation/ValueValidator.ts:172-178), chip's XML lists only the named values | matter.js packages/model/src/standard/elements/operational-state.element.ts |
| *.OperationalStateEnum.ManufacturerStates | field | absent |
present |
3 | The specification reserves the manufacturer range of this enum; matter.js models it as a range member so a value in it validates (packages/node/src/behavior/state/validation/ValueValidator.ts:172-178), chip's XML lists only the named values | matter.js packages/model/src/standard/elements/operational-state.element.ts |
| ClosureControl.ClosureErrorEnum.ManufacturerError | field | absent |
present |
1 | The specification reserves the manufacturer range of this enum; matter.js models it as a range member so a value in it validates (packages/node/src/behavior/state/validation/ValueValidator.ts:172-178), chip's XML lists only the named values | matter.js packages/model/src/standard/elements/closure-control.element.ts |
| IlluminanceMeasurement.LightSensorTypeEnum.Ms | field | absent |
present |
1 | The specification reserves the manufacturer range of this enum; matter.js models it as a range member so a value in it validates (packages/node/src/behavior/state/validation/ValueValidator.ts:172-178), chip's XML lists only the named values | matter.js packages/model/src/standard/elements/illuminance-measurement.element.ts |
(ii) CHIP is right, the snapshot is wrong¶
- GroupKeyManagement.GroupKeySetStruct.GroupKeyMulticastPolicy (conformance): CHIP
d, snapshoto— 1 difference(s). - Why: Matter 1.6.1 deprecates the field (matter.js's own 1.6.1 scrape states D); a matter.js override written when the specification said "P, M" forces O for every revision.
- Source: matter.js support/models/src/local/GroupKeyManagementOverrides.ts; support/models/src/v1.6.1/spec.ts GroupKeySetStruct.
- Impact: No certification case reads the field. go-fabric's KeySetReadResponse reports field 8 as matter.js's GroupKeyManagementServer does while its model defines the field, which a D field still is, so the behaviour stays; CHIP's server omits it. Finding recorded; upstream candidate (gate the override until 1.6.1).
- semtag.Label (conformance): CHIP
mfgcode!=null,o, snapshoto— 1 difference(s). - Why: The specification makes Label mandatory when MfgCode is not null; matter.js relaxes it to O ("TODO we do not support MfgCode != null").
- Source: matter.js support/models/src/local/semtag.ts.
- Impact: go-fabric serves no Descriptor TagList (cluster/core/descriptor.go) and ModeSelect's SemanticTagStruct is a different struct, so nothing depends on it. Finding recorded; known upstream TODO.
(iv) the harness excuses it¶
| Path | Property | CHIP | snapshot | n | Reason | Source |
|---|---|---|---|---|---|---|
| Thermostat.AtomicRequest | command | absent |
present |
1 | CHIP defines AtomicRequest globally (globals/Commands.xml); the harness adds it to Thermostat from revision 8 with conformance Presets | Schedules and Operate privilege, as matter.js models it there (PRES | MSCH, the features those attributes require) | connectedhomeip src/python_testing/matter_testing_infrastructure/matter/testing/spec_parsing.py build_xml_clusters ("Need automated parsing for atomic attributes"); matter.js support/models/src/local/ThermostatOverrides.ts |
| Thermostat.AtomicResponse | command | absent |
present |
1 | CHIP defines AtomicResponse globally (globals/Commands.xml); the harness adds it to Thermostat from revision 8 with conformance Presets | Schedules and Operate privilege, as matter.js models it there (PRES | MSCH, the features those attributes require) | connectedhomeip src/python_testing/matter_testing_infrastructure/matter/testing/spec_parsing.py build_xml_clusters ("Need automated parsing for atomic attributes"); matter.js support/models/src/local/ThermostatOverrides.ts |