@pdtf/schemas 3.6.0-dev.3 → 3.6.0-dev.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/docs/ta6-certificate-permit-contract.md +51 -0
  2. package/docs/v4-mapping-and-recomposition.md +419 -0
  3. package/index.js +210 -0
  4. package/package.json +10 -1
  5. package/src/schemas/v3/combined.json +2261 -657
  6. package/src/schemas/v3/compactSkeleton.txt +120 -51
  7. package/src/schemas/v3/overlays/baspi4.json +54 -74
  8. package/src/schemas/v3/overlays/baspi5.json +54 -74
  9. package/src/schemas/v3/overlays/extensions/ac.json +2 -1
  10. package/src/schemas/v3/overlays/extensions/dk.json +3 -2
  11. package/src/schemas/v3/overlays/extensions/fd.json +2 -1
  12. package/src/schemas/v3/overlays/extensions/ic.json +44 -9
  13. package/src/schemas/v3/overlays/extensions/lc.json +3 -2
  14. package/src/schemas/v3/overlays/extensions/mi.json +2 -1
  15. package/src/schemas/v3/overlays/extensions/nd.json +3 -2
  16. package/src/schemas/v3/overlays/extensions/pc.json +3 -2
  17. package/src/schemas/v3/overlays/extensions/ph.json +2 -1
  18. package/src/schemas/v3/overlays/extensions/rw.json +4 -3
  19. package/src/schemas/v3/overlays/extensions/sc.json +8 -4
  20. package/src/schemas/v3/overlays/extensions/sd.json +3 -2
  21. package/src/schemas/v3/overlays/extensions/tr.json +3 -2
  22. package/src/schemas/v3/overlays/extensions/wg.json +2 -1
  23. package/src/schemas/v3/overlays/llc1.json +1 -2
  24. package/src/schemas/v3/overlays/lpe1.json +3 -2
  25. package/src/schemas/v3/overlays/nts.json +7 -3
  26. package/src/schemas/v3/overlays/nts2.json +9 -4
  27. package/src/schemas/v3/overlays/ntsl.json +5 -2
  28. package/src/schemas/v3/overlays/ntsl2.json +7 -3
  29. package/src/schemas/v3/overlays/piq.json +34 -25
  30. package/src/schemas/v3/overlays/rds.json +24 -50
  31. package/src/schemas/v3/overlays/sef25.json +16 -2
  32. package/src/schemas/v3/overlays/ta10.json +0 -9
  33. package/src/schemas/v3/overlays/ta6.json +39 -70
  34. package/src/schemas/v3/overlays/ta6ed6.json +331 -307
  35. package/{pensive-tesla-d0d355/src/schemas/v3/overlays/ta6.json → src/schemas/v3/overlays/ta6ed6v2.json} +1574 -1464
  36. package/src/schemas/v3/overlays/ta7.json +2 -1
  37. package/src/schemas/v3/overlays/ta7ed5.json +68 -21
  38. package/src/schemas/v3/pdtf-transaction.json +1030 -492
  39. package/src/schemas/v3/skeleton.json +163 -57
  40. package/src/schemas/v4/Gift.json +88 -0
  41. package/src/schemas/v4/Offer.json +425 -0
  42. package/src/schemas/v4/Organisation.json +167 -0
  43. package/src/schemas/v4/Person.json +321 -0
  44. package/src/schemas/v4/Property.json +27813 -0
  45. package/src/schemas/v4/Representation.json +67 -0
  46. package/src/schemas/v4/SellerCapacity.json +193 -0
  47. package/src/schemas/v4/Title.json +14660 -0
  48. package/src/schemas/v4/Transaction.json +1612 -0
  49. package/src/schemas/v4/TransactionRole.json +59 -0
  50. package/src/schemas/v4/mapping.json +1161 -0
  51. package/src/utils/checkTa6OmissionCompatibility.js +146 -0
  52. package/src/utils/extractExtensionOverlays.js +11 -2
  53. package/src/utils/extractOverlay.js +21 -0
  54. package/src/utils/generateV4Schemas.js +1358 -0
  55. package/src/utils/syncTa6ed6v2Markers.js +92 -0
  56. package/src/utils/v4.js +838 -0
  57. package/CLAUDE.md +0 -101
  58. package/pensive-tesla-d0d355/CLAUDE.md +0 -101
  59. package/pensive-tesla-d0d355/LICENSE +0 -21
  60. package/pensive-tesla-d0d355/README.md +0 -435
  61. package/pensive-tesla-d0d355/docs/branch-release-workflow.md +0 -138
  62. package/pensive-tesla-d0d355/docs/sef25-extensions-ui-spec.md +0 -355
  63. package/pensive-tesla-d0d355/index.js +0 -654
  64. package/pensive-tesla-d0d355/package-lock.json +0 -7297
  65. package/pensive-tesla-d0d355/package.json +0 -44
  66. package/pensive-tesla-d0d355/src/examples/v1/exampleAddParticipantVouch.json +0 -32
  67. package/pensive-tesla-d0d355/src/examples/v1/exampleDocumentedVouch.json +0 -40
  68. package/pensive-tesla-d0d355/src/examples/v1/exampleElectronicRecord.json +0 -30
  69. package/pensive-tesla-d0d355/src/examples/v1/exampleTransaction.json +0 -878
  70. package/pensive-tesla-d0d355/src/examples/v1/exampleVouch.json +0 -25
  71. package/pensive-tesla-d0d355/src/examples/v2/exampleTransaction.json +0 -901
  72. package/pensive-tesla-d0d355/src/examples/v3/exampleAddParticipantVouch.json +0 -38
  73. package/pensive-tesla-d0d355/src/examples/v3/exampleCustomOverlay.json +0 -55
  74. package/pensive-tesla-d0d355/src/examples/v3/exampleCustomOverlay2.json +0 -93
  75. package/pensive-tesla-d0d355/src/examples/v3/exampleDocumentedVouch.json +0 -47
  76. package/pensive-tesla-d0d355/src/examples/v3/exampleElectronicRecord.json +0 -36
  77. package/pensive-tesla-d0d355/src/examples/v3/exampleTransaction.json +0 -1038
  78. package/pensive-tesla-d0d355/src/examples/v3/exampleVouch.json +0 -32
  79. package/pensive-tesla-d0d355/src/mappings/SendPropertyDetailsRequestSchema.json +0 -1588
  80. package/pensive-tesla-d0d355/src/mappings/adf.js +0 -198
  81. package/pensive-tesla-d0d355/src/schemas/v1/GeoJSON.json +0 -1279
  82. package/pensive-tesla-d0d355/src/schemas/v1/baspiNotes.html +0 -102
  83. package/pensive-tesla-d0d355/src/schemas/v1/energy-performance-certificate.json +0 -124
  84. package/pensive-tesla-d0d355/src/schemas/v1/freehold-information.json +0 -2051
  85. package/pensive-tesla-d0d355/src/schemas/v1/leasehold-information.json +0 -2064
  86. package/pensive-tesla-d0d355/src/schemas/v1/legal-information.json +0 -1045
  87. package/pensive-tesla-d0d355/src/schemas/v1/material-facts.json +0 -2109
  88. package/pensive-tesla-d0d355/src/schemas/v1/pdtf-transaction-search-results.json +0 -40
  89. package/pensive-tesla-d0d355/src/schemas/v1/pdtf-transaction.json +0 -191
  90. package/pensive-tesla-d0d355/src/schemas/v1/searches/drainage-and-water.json +0 -261
  91. package/pensive-tesla-d0d355/src/schemas/v1/searches/local-land-charges.json +0 -69
  92. package/pensive-tesla-d0d355/src/schemas/v1/searches/local-searches-required.json +0 -857
  93. package/pensive-tesla-d0d355/src/schemas/v1/searches.json +0 -237
  94. package/pensive-tesla-d0d355/src/schemas/v1/title-deed.json +0 -841
  95. package/pensive-tesla-d0d355/src/schemas/v2/baspiNotes.html +0 -102
  96. package/pensive-tesla-d0d355/src/schemas/v2/combined.json +0 -37731
  97. package/pensive-tesla-d0d355/src/schemas/v2/overlays/baspi.json +0 -8132
  98. package/pensive-tesla-d0d355/src/schemas/v2/overlays/con29DW.json +0 -705
  99. package/pensive-tesla-d0d355/src/schemas/v2/overlays/con29R.json +0 -2956
  100. package/pensive-tesla-d0d355/src/schemas/v2/overlays/fme1.json +0 -1259
  101. package/pensive-tesla-d0d355/src/schemas/v2/overlays/llc1.json +0 -25
  102. package/pensive-tesla-d0d355/src/schemas/v2/overlays/lpe1.json +0 -2171
  103. package/pensive-tesla-d0d355/src/schemas/v2/overlays/nts.json +0 -326
  104. package/pensive-tesla-d0d355/src/schemas/v2/overlays/oc1.json +0 -2799
  105. package/pensive-tesla-d0d355/src/schemas/v2/overlays/piq.json +0 -3419
  106. package/pensive-tesla-d0d355/src/schemas/v2/overlays/rds.json +0 -3736
  107. package/pensive-tesla-d0d355/src/schemas/v2/overlays/ta10.json +0 -5306
  108. package/pensive-tesla-d0d355/src/schemas/v2/overlays/ta6.json +0 -4533
  109. package/pensive-tesla-d0d355/src/schemas/v2/overlays/ta7.json +0 -1045
  110. package/pensive-tesla-d0d355/src/schemas/v2/pdtf-transaction.json +0 -34351
  111. package/pensive-tesla-d0d355/src/schemas/v2/skeleton.json +0 -3973
  112. package/pensive-tesla-d0d355/src/schemas/v3/combined.json +0 -48469
  113. package/pensive-tesla-d0d355/src/schemas/v3/compactSkeleton.txt +0 -4519
  114. package/pensive-tesla-d0d355/src/schemas/v3/overlays/README.md +0 -299
  115. package/pensive-tesla-d0d355/src/schemas/v3/overlays/baspi4.json +0 -8025
  116. package/pensive-tesla-d0d355/src/schemas/v3/overlays/baspi5.json +0 -8175
  117. package/pensive-tesla-d0d355/src/schemas/v3/overlays/con29DW.json +0 -716
  118. package/pensive-tesla-d0d355/src/schemas/v3/overlays/con29R.json +0 -2981
  119. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/ac.json +0 -333
  120. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/as.json +0 -74
  121. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/dk.json +0 -32
  122. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/dr.json +0 -73
  123. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/er.json +0 -85
  124. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/fd.json +0 -75
  125. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/hi.json +0 -51
  126. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/hs.json +0 -73
  127. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/ic.json +0 -59
  128. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/jk.json +0 -96
  129. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/la.json +0 -85
  130. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/lc.json +0 -75
  131. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/ma.json +0 -90
  132. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/mc.json +0 -38
  133. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/mi.json +0 -69
  134. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/nd.json +0 -43
  135. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/oa.json +0 -24
  136. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/oc.json +0 -57
  137. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/pc.json +0 -37
  138. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/ph.json +0 -194
  139. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/rw.json +0 -68
  140. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/sb.json +0 -73
  141. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/sc.json +0 -129
  142. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/sd.json +0 -63
  143. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/sf.json +0 -74
  144. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/sl.json +0 -68
  145. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/ta.json +0 -252
  146. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/tf.json +0 -103
  147. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/tr.json +0 -73
  148. package/pensive-tesla-d0d355/src/schemas/v3/overlays/extensions/wg.json +0 -350
  149. package/pensive-tesla-d0d355/src/schemas/v3/overlays/fme1.json +0 -1266
  150. package/pensive-tesla-d0d355/src/schemas/v3/overlays/llc1.json +0 -25
  151. package/pensive-tesla-d0d355/src/schemas/v3/overlays/lpe1.json +0 -2199
  152. package/pensive-tesla-d0d355/src/schemas/v3/overlays/nts.json +0 -2157
  153. package/pensive-tesla-d0d355/src/schemas/v3/overlays/nts2.json +0 -2742
  154. package/pensive-tesla-d0d355/src/schemas/v3/overlays/ntsl.json +0 -1813
  155. package/pensive-tesla-d0d355/src/schemas/v3/overlays/ntsl2.json +0 -2217
  156. package/pensive-tesla-d0d355/src/schemas/v3/overlays/oc1.json +0 -2817
  157. package/pensive-tesla-d0d355/src/schemas/v3/overlays/piq.json +0 -3322
  158. package/pensive-tesla-d0d355/src/schemas/v3/overlays/rds.json +0 -3665
  159. package/pensive-tesla-d0d355/src/schemas/v3/overlays/sef25.json +0 -1639
  160. package/pensive-tesla-d0d355/src/schemas/v3/overlays/sr24.json +0 -38
  161. package/pensive-tesla-d0d355/src/schemas/v3/overlays/ta10.json +0 -4654
  162. package/pensive-tesla-d0d355/src/schemas/v3/overlays/ta6ed6.json +0 -6534
  163. package/pensive-tesla-d0d355/src/schemas/v3/overlays/ta7.json +0 -1537
  164. package/pensive-tesla-d0d355/src/schemas/v3/overlays/ta7ed5.json +0 -1551
  165. package/pensive-tesla-d0d355/src/schemas/v3/pdtf-transaction.json +0 -41573
  166. package/pensive-tesla-d0d355/src/schemas/v3/skeleton.json +0 -5767
  167. package/pensive-tesla-d0d355/src/schemas/verifiedClaims/README.md +0 -21
  168. package/pensive-tesla-d0d355/src/schemas/verifiedClaims/pdtf-verified-claims.json +0 -447
  169. package/pensive-tesla-d0d355/src/utils/compactSkeleton.js +0 -84
  170. package/pensive-tesla-d0d355/src/utils/countTokens.js +0 -67
  171. package/pensive-tesla-d0d355/src/utils/extractExtensionOverlays.js +0 -624
  172. package/pensive-tesla-d0d355/src/utils/extractOverlay.js +0 -381
  173. package/pensive-tesla-d0d355/src/utils/extractProperties.js +0 -44
  174. package/pensive-tesla-d0d355/src/utils/listPathTitles.js +0 -36
  175. package/pensive-tesla-d0d355/src/utils/minimalSkeleton.js +0 -85
  176. package/pensive-tesla-d0d355/src/utils/pathList.csv +0 -903
  177. package/pensive-tesla-d0d355/src/utils/pathSkeleton.js +0 -181
  178. package/src/examples/v1/exampleAddParticipantVouch.json +0 -32
  179. package/src/examples/v1/exampleDocumentedVouch.json +0 -40
  180. package/src/examples/v1/exampleElectronicRecord.json +0 -30
  181. package/src/examples/v1/exampleTransaction.json +0 -878
  182. package/src/examples/v1/exampleVouch.json +0 -25
  183. package/src/examples/v2/exampleTransaction.json +0 -901
  184. package/src/examples/v3/exampleAddParticipantVouch.json +0 -38
  185. package/src/examples/v3/exampleCustomOverlay.json +0 -55
  186. package/src/examples/v3/exampleCustomOverlay2.json +0 -93
  187. package/src/examples/v3/exampleDocumentedVouch.json +0 -47
  188. package/src/examples/v3/exampleElectronicRecord.json +0 -36
  189. package/src/examples/v3/exampleTransaction.json +0 -1038
  190. package/src/examples/v3/exampleVouch.json +0 -32
  191. package/src/mappings/SendPropertyDetailsRequestSchema.json +0 -1588
  192. package/src/mappings/adf.js +0 -198
@@ -0,0 +1,1161 @@
1
+ {
2
+ "mappingVersion": 1,
3
+ "$id": "https://trust.propdata.org.uk/schemas/v4/mapping.json",
4
+ "description": "Generated mapping between PDTF V3 JSON Pointers and V4 entity documents. Do not edit by hand — regenerate with `npm run generate:v4`.",
5
+ "generator": "src/utils/generateV4Schemas.js",
6
+ "source": {
7
+ "packageName": "@pdtf/schemas",
8
+ "packageVersion": "3.6.0-dev.30",
9
+ "v3SchemaId": "https://trust.propdata.org.uk/schemas/v3/pdtf-transaction.json",
10
+ "combinedPath": "src/schemas/v3/combined.json",
11
+ "combinedSha256": "4e95946a946b37088b153052034fd0584cc27a6eb53f78ede52cd0ab1fde669f"
12
+ },
13
+ "entities": {
14
+ "Property": {
15
+ "$id": "https://trust.propdata.org.uk/schemas/v4/entities/property.json",
16
+ "kind": "derived",
17
+ "idScheme": "urn"
18
+ },
19
+ "Title": {
20
+ "$id": "https://trust.propdata.org.uk/schemas/v4/entities/title.json",
21
+ "kind": "derived",
22
+ "idScheme": "urn"
23
+ },
24
+ "Transaction": {
25
+ "$id": "https://trust.propdata.org.uk/schemas/v4/entities/transaction.json",
26
+ "kind": "derived",
27
+ "idScheme": "did"
28
+ },
29
+ "Person": {
30
+ "$id": "https://trust.propdata.org.uk/schemas/v4/entities/person.json",
31
+ "kind": "derived",
32
+ "idScheme": "did"
33
+ },
34
+ "Organisation": {
35
+ "$id": "https://trust.propdata.org.uk/schemas/v4/entities/organisation.json",
36
+ "kind": "standalone",
37
+ "idScheme": "did"
38
+ },
39
+ "Representation": {
40
+ "$id": "https://trust.propdata.org.uk/schemas/v4/entities/representation.json",
41
+ "kind": "credential",
42
+ "idScheme": "did"
43
+ },
44
+ "TransactionRole": {
45
+ "$id": "https://trust.propdata.org.uk/schemas/v4/entities/transactionRole.json",
46
+ "kind": "credential",
47
+ "idScheme": "did"
48
+ },
49
+ "Gift": {
50
+ "$id": "https://trust.propdata.org.uk/schemas/v4/entities/gift.json",
51
+ "kind": "credential",
52
+ "idScheme": "did"
53
+ },
54
+ "SellerCapacity": {
55
+ "$id": "https://trust.propdata.org.uk/schemas/v4/entities/sellerCapacity.json",
56
+ "kind": "credential",
57
+ "idScheme": "did"
58
+ },
59
+ "Offer": {
60
+ "$id": "https://trust.propdata.org.uk/schemas/v4/entities/offer.json",
61
+ "kind": "credential",
62
+ "idScheme": "did"
63
+ }
64
+ },
65
+ "roundTrip": {
66
+ "entities": [
67
+ "Property",
68
+ "Title",
69
+ "Transaction",
70
+ "Person",
71
+ "Representation",
72
+ "SellerCapacity",
73
+ "Offer",
74
+ "Gift",
75
+ "TransactionRole"
76
+ ],
77
+ "note": "All of these are required to reconstruct a V3 instance. The credentials are not redundant copies: role and every relationship live only on them, so that revoking a credential removes what it asserts rather than leaving a second copy on the transaction. Organisation is the one entity outside the round trip.",
78
+ "roleImpliedByCredential": {
79
+ "SellerCapacity": "Seller",
80
+ "Offer": "Buyer",
81
+ "Gift": "Giftor"
82
+ },
83
+ "strippedKeySuffixes": [
84
+ "Ref",
85
+ "Required"
86
+ ],
87
+ "knownExceptions": [
88
+ "Overlay metadata keys (*Ref, *Required) are schema-level only and are stripped from V4; they never appear in instance data.",
89
+ "A Title carrying only keys shared by both source arrays recomposes into propertyPack.titlesToBeSold only (primarySource), not into ownershipsToBeTransferred.",
90
+ "propertyPack.ownership.ownershipsToBeTransferred is canonicalised on recomposition: entries are emitted in propertyPack.titlesToBeSold order rather than their original order. The array is correlated by titleNumber and its order carries no meaning in V3, so this is a deliberate normalisation — it removes the index-divergence class of bug rather than reproducing it. Entry CONTENT is preserved exactly.",
91
+ "An explicitly empty container recomposes as absent: propertyPack {}, propertyPack.ownership {} and propertyPack.titlesToBeSold [] are all valid V3 but carry no data, and the entity model has no place to record 'present but empty'. (participants [] is invalid V3 — minItems 1 — so it does not arise.)",
92
+ "recompose always emits $schema, set to source.v3SchemaId. An instance that omitted it gains one; this is a normalisation, since a V3 instance is expected to declare its schema.",
93
+ "The round trip restores deep equality, NOT byte equality: object key order is not preserved, because keys are regrouped by entity and reassembled. JSON attaches no meaning to key order, but do not compare a recomposed instance to the original by hashing or string equality — compare structurally, or canonicalise first (e.g. JCS) if you need a stable digest."
94
+ ]
95
+ },
96
+ "extensionPolicy": {
97
+ "description": "What each rule does with instance keys the V3 schema does not define — platform extensions such as an externalIds namespace or a vendor's own block. `passthrough` carries them into the entity and back out again on recomposition; `drop` discards them. Exactly one rule per V3 node is the sink, so an unknown key has a single, predictable home. verifyCoverage() guarantees every V3 SCHEMA key has a V4 home; this is the answer for everything outside the schema.",
98
+ "values": [
99
+ "passthrough",
100
+ "drop"
101
+ ]
102
+ },
103
+ "arrayKeys": [
104
+ {
105
+ "pointer": "/participants",
106
+ "keys": [
107
+ {
108
+ "pointer": "/participantId",
109
+ "scope": "canonical"
110
+ },
111
+ {
112
+ "pointer": "/externalIds/{source}",
113
+ "scope": "vendor"
114
+ }
115
+ ]
116
+ },
117
+ {
118
+ "pointer": "/participants/{index}/verification/identity/reports",
119
+ "keys": [
120
+ {
121
+ "pointer": "/reportName",
122
+ "scope": "canonical"
123
+ }
124
+ ]
125
+ },
126
+ {
127
+ "pointer": "/participants/{index}/verification/antiMoneyLaundering/reports",
128
+ "keys": [
129
+ {
130
+ "pointer": "/reportName",
131
+ "scope": "canonical"
132
+ }
133
+ ]
134
+ },
135
+ {
136
+ "pointer": "/participants/{index}/verification/sourceOfFunds/reports",
137
+ "keys": [
138
+ {
139
+ "pointer": "/reportName",
140
+ "scope": "canonical"
141
+ }
142
+ ]
143
+ },
144
+ {
145
+ "pointer": "/propertyPack/media",
146
+ "keys": [
147
+ {
148
+ "pointer": "/mediaId",
149
+ "scope": "canonical"
150
+ }
151
+ ]
152
+ },
153
+ {
154
+ "pointer": "/propertyPack/buildInformation/roomDimensions/rooms",
155
+ "keys": [
156
+ {
157
+ "pointer": "/roomName",
158
+ "scope": "canonical"
159
+ }
160
+ ]
161
+ },
162
+ {
163
+ "pointer": "/propertyPack/nearbyFacilities/healthCare/{index}/openingHours",
164
+ "keys": [
165
+ {
166
+ "pointer": "/day",
167
+ "scope": "canonical"
168
+ }
169
+ ]
170
+ },
171
+ {
172
+ "pointer": "/propertyPack/ownership/ownershipsToBeTransferred",
173
+ "keys": [
174
+ {
175
+ "pointer": "/titleNumber",
176
+ "scope": "canonical"
177
+ }
178
+ ]
179
+ },
180
+ {
181
+ "pointer": "/propertyPack/energyEfficiency/recommendations",
182
+ "keys": [
183
+ {
184
+ "pointer": "/lmkKey",
185
+ "scope": "canonical"
186
+ }
187
+ ]
188
+ },
189
+ {
190
+ "pointer": "/propertyPack/fixturesAndFittings/basicFittings/otherItems",
191
+ "keys": [
192
+ {
193
+ "pointer": "/itemName",
194
+ "scope": "canonical"
195
+ }
196
+ ]
197
+ },
198
+ {
199
+ "pointer": "/propertyPack/fixturesAndFittings/kitchen/otherItems",
200
+ "keys": [
201
+ {
202
+ "pointer": "/itemName",
203
+ "scope": "canonical"
204
+ }
205
+ ]
206
+ },
207
+ {
208
+ "pointer": "/propertyPack/fixturesAndFittings/carpets/otherRooms",
209
+ "keys": [
210
+ {
211
+ "pointer": "/itemName",
212
+ "scope": "canonical"
213
+ }
214
+ ]
215
+ },
216
+ {
217
+ "pointer": "/propertyPack/fixturesAndFittings/curtainsAndCurtainRails/curtainRailsPolesPelmets/otherRooms",
218
+ "keys": [
219
+ {
220
+ "pointer": "/itemName",
221
+ "scope": "canonical"
222
+ }
223
+ ]
224
+ },
225
+ {
226
+ "pointer": "/propertyPack/fixturesAndFittings/curtainsAndCurtainRails/curtainsBlinds/otherRooms",
227
+ "keys": [
228
+ {
229
+ "pointer": "/itemName",
230
+ "scope": "canonical"
231
+ }
232
+ ]
233
+ },
234
+ {
235
+ "pointer": "/propertyPack/fixturesAndFittings/lightFittings/otherRooms",
236
+ "keys": [
237
+ {
238
+ "pointer": "/itemName",
239
+ "scope": "canonical"
240
+ }
241
+ ]
242
+ },
243
+ {
244
+ "pointer": "/propertyPack/fixturesAndFittings/fittedUnits/otherRooms",
245
+ "keys": [
246
+ {
247
+ "pointer": "/itemName",
248
+ "scope": "canonical"
249
+ }
250
+ ]
251
+ },
252
+ {
253
+ "pointer": "/propertyPack/fixturesAndFittings/outdoorArea/otherItems",
254
+ "keys": [
255
+ {
256
+ "pointer": "/itemName",
257
+ "scope": "canonical"
258
+ }
259
+ ]
260
+ },
261
+ {
262
+ "pointer": "/propertyPack/fixturesAndFittings/otherItems/otherItems",
263
+ "keys": [
264
+ {
265
+ "pointer": "/itemName",
266
+ "scope": "canonical"
267
+ }
268
+ ]
269
+ },
270
+ {
271
+ "pointer": "/propertyPack/environmentalIssues/flooding/floodRisk/riskSubcategories",
272
+ "keys": [
273
+ {
274
+ "pointer": "/subCategory",
275
+ "scope": "canonical"
276
+ }
277
+ ]
278
+ },
279
+ {
280
+ "pointer": "/propertyPack/environmentalIssues/radon/radonRisk/riskSubcategories",
281
+ "keys": [
282
+ {
283
+ "pointer": "/subCategory",
284
+ "scope": "canonical"
285
+ }
286
+ ]
287
+ },
288
+ {
289
+ "pointer": "/propertyPack/environmentalIssues/contaminatedLand/contaminatedLandRisk/riskSubcategories",
290
+ "keys": [
291
+ {
292
+ "pointer": "/subCategory",
293
+ "scope": "canonical"
294
+ }
295
+ ]
296
+ },
297
+ {
298
+ "pointer": "/propertyPack/environmentalIssues/groundStability/groundStabilityRisk/riskSubcategories",
299
+ "keys": [
300
+ {
301
+ "pointer": "/subCategory",
302
+ "scope": "canonical"
303
+ }
304
+ ]
305
+ },
306
+ {
307
+ "pointer": "/propertyPack/environmentalIssues/infrastructure/infrastructureRisk/riskSubcategories",
308
+ "keys": [
309
+ {
310
+ "pointer": "/subCategory",
311
+ "scope": "canonical"
312
+ }
313
+ ]
314
+ },
315
+ {
316
+ "pointer": "/propertyPack/environmentalIssues/energy/energyRisk/riskSubcategories",
317
+ "keys": [
318
+ {
319
+ "pointer": "/subCategory",
320
+ "scope": "canonical"
321
+ }
322
+ ]
323
+ },
324
+ {
325
+ "pointer": "/propertyPack/environmentalIssues/transportation/transportationRisk/riskSubcategories",
326
+ "keys": [
327
+ {
328
+ "pointer": "/subCategory",
329
+ "scope": "canonical"
330
+ }
331
+ ]
332
+ },
333
+ {
334
+ "pointer": "/propertyPack/environmentalIssues/planning/planningRisk/riskSubcategories",
335
+ "keys": [
336
+ {
337
+ "pointer": "/subCategory",
338
+ "scope": "canonical"
339
+ }
340
+ ]
341
+ },
342
+ {
343
+ "pointer": "/propertyPack/environmentalIssues/climate/climateRisk/riskSubcategories",
344
+ "keys": [
345
+ {
346
+ "pointer": "/subCategory",
347
+ "scope": "canonical"
348
+ }
349
+ ]
350
+ },
351
+ {
352
+ "pointer": "/propertyPack/environmentalIssues/coalMining/riskSubcategories",
353
+ "keys": [
354
+ {
355
+ "pointer": "/subCategory",
356
+ "scope": "canonical"
357
+ }
358
+ ]
359
+ },
360
+ {
361
+ "pointer": "/propertyPack/environmentalIssues/nonCoalMining/riskSubcategories",
362
+ "keys": [
363
+ {
364
+ "pointer": "/subCategory",
365
+ "scope": "canonical"
366
+ }
367
+ ]
368
+ },
369
+ {
370
+ "pointer": "/propertyPack/environmentalIssues/coastalErosion/riskSubcategories",
371
+ "keys": [
372
+ {
373
+ "pointer": "/subCategory",
374
+ "scope": "canonical"
375
+ }
376
+ ]
377
+ },
378
+ {
379
+ "pointer": "/propertyPack/guaranteesWarrantiesAndIndemnityInsurances/doubleGlazing/fensaCertificates/certificates",
380
+ "keys": [
381
+ {
382
+ "pointer": "/certificateId",
383
+ "scope": "canonical"
384
+ }
385
+ ]
386
+ },
387
+ {
388
+ "pointer": "/propertyPack/saleReadyDeclarations/sellerSignatures",
389
+ "keys": [
390
+ {
391
+ "pointer": "/signatureId",
392
+ "scope": "canonical"
393
+ },
394
+ {
395
+ "pointer": "/externalIds/{source}",
396
+ "scope": "vendor"
397
+ }
398
+ ]
399
+ },
400
+ {
401
+ "pointer": "/propertyPack/localSearches/localLandCharges",
402
+ "keys": [
403
+ {
404
+ "pointer": "/hmlrReference",
405
+ "scope": "canonical"
406
+ }
407
+ ]
408
+ },
409
+ {
410
+ "pointer": "/propertyPack/localSearches/localLandCharges/{index}/otherData",
411
+ "keys": [
412
+ {
413
+ "pointer": "/dataLabel",
414
+ "scope": "canonical"
415
+ }
416
+ ]
417
+ },
418
+ {
419
+ "pointer": "/propertyPack/localSearches/localAuthoritySearches/planningAndBuildingRegulations/decisionsAndPendingApplications/planningPermission",
420
+ "keys": [
421
+ {
422
+ "pointer": "/refNumber",
423
+ "scope": "canonical"
424
+ }
425
+ ]
426
+ },
427
+ {
428
+ "pointer": "/propertyPack/localSearches/localAuthoritySearches/planningAndBuildingRegulations/decisionsAndPendingApplications/listedBuildingConsent",
429
+ "keys": [
430
+ {
431
+ "pointer": "/refNumber",
432
+ "scope": "canonical"
433
+ }
434
+ ]
435
+ },
436
+ {
437
+ "pointer": "/propertyPack/localSearches/localAuthoritySearches/planningAndBuildingRegulations/decisionsAndPendingApplications/conservationAreaConsent",
438
+ "keys": [
439
+ {
440
+ "pointer": "/refNumber",
441
+ "scope": "canonical"
442
+ }
443
+ ]
444
+ },
445
+ {
446
+ "pointer": "/propertyPack/localSearches/localAuthoritySearches/planningAndBuildingRegulations/decisionsAndPendingApplications/lawfulnessOfExistingUse",
447
+ "keys": [
448
+ {
449
+ "pointer": "/refNumber",
450
+ "scope": "canonical"
451
+ }
452
+ ]
453
+ },
454
+ {
455
+ "pointer": "/propertyPack/localSearches/localAuthoritySearches/planningAndBuildingRegulations/decisionsAndPendingApplications/certificateOfLawfulnessOfProposedUse",
456
+ "keys": [
457
+ {
458
+ "pointer": "/refNumber",
459
+ "scope": "canonical"
460
+ }
461
+ ]
462
+ },
463
+ {
464
+ "pointer": "/propertyPack/localSearches/localAuthoritySearches/planningAndBuildingRegulations/decisionsAndPendingApplications/lawfulnessOfProposedListedWorks",
465
+ "keys": [
466
+ {
467
+ "pointer": "/refNumber",
468
+ "scope": "canonical"
469
+ }
470
+ ]
471
+ },
472
+ {
473
+ "pointer": "/propertyPack/localSearches/localAuthoritySearches/planningAndBuildingRegulations/decisionsAndPendingApplications/heritagePartnershipAgreement",
474
+ "keys": [
475
+ {
476
+ "pointer": "/refNumber",
477
+ "scope": "canonical"
478
+ }
479
+ ]
480
+ },
481
+ {
482
+ "pointer": "/propertyPack/localSearches/localAuthoritySearches/planningAndBuildingRegulations/decisionsAndPendingApplications/listedBuildingConsentOrder",
483
+ "keys": [
484
+ {
485
+ "pointer": "/refNumber",
486
+ "scope": "canonical"
487
+ }
488
+ ]
489
+ },
490
+ {
491
+ "pointer": "/propertyPack/localSearches/localAuthoritySearches/planningAndBuildingRegulations/decisionsAndPendingApplications/localListedBuildingConsentOrder",
492
+ "keys": [
493
+ {
494
+ "pointer": "/refNumber",
495
+ "scope": "canonical"
496
+ }
497
+ ]
498
+ },
499
+ {
500
+ "pointer": "/propertyPack/localSearches/localAuthoritySearches/planningAndBuildingRegulations/decisionsAndPendingApplications/buildingRegulationsApproval",
501
+ "keys": [
502
+ {
503
+ "pointer": "/refNumber",
504
+ "scope": "canonical"
505
+ }
506
+ ]
507
+ },
508
+ {
509
+ "pointer": "/propertyPack/localSearches/localAuthoritySearches/planningAndBuildingRegulations/decisionsAndPendingApplications/buildingRegulationsCompletion",
510
+ "keys": [
511
+ {
512
+ "pointer": "/refNumber",
513
+ "scope": "canonical"
514
+ }
515
+ ]
516
+ },
517
+ {
518
+ "pointer": "/propertyPack/localSearches/localAuthoritySearches/planningAndBuildingRegulations/decisionsAndPendingApplications/buildingRegulationsSelfCertification",
519
+ "keys": [
520
+ {
521
+ "pointer": "/refNumber",
522
+ "scope": "canonical"
523
+ }
524
+ ]
525
+ },
526
+ {
527
+ "pointer": "/propertyPack/titlesToBeSold",
528
+ "keys": [
529
+ {
530
+ "pointer": "/titleNumber",
531
+ "scope": "canonical"
532
+ }
533
+ ]
534
+ },
535
+ {
536
+ "pointer": "/propertyPack/titlesToBeSold/{index}/registerExtract/ocSummaryData/lease/leaseEntry/{index}/leaseParty",
537
+ "keys": [
538
+ {
539
+ "pointer": "/partyNumber",
540
+ "scope": "canonical"
541
+ }
542
+ ]
543
+ },
544
+ {
545
+ "pointer": "/propertyPack/searches",
546
+ "keys": [
547
+ {
548
+ "pointer": "/searchId",
549
+ "scope": "canonical"
550
+ }
551
+ ]
552
+ },
553
+ {
554
+ "pointer": "/propertyPack/documents",
555
+ "keys": [
556
+ {
557
+ "pointer": "/documentId",
558
+ "scope": "canonical"
559
+ },
560
+ {
561
+ "pointer": "/externalIds/{source}",
562
+ "scope": "vendor"
563
+ }
564
+ ]
565
+ },
566
+ {
567
+ "pointer": "/propertyPack/surveys",
568
+ "keys": [
569
+ {
570
+ "pointer": "/surveyId",
571
+ "scope": "canonical"
572
+ }
573
+ ]
574
+ },
575
+ {
576
+ "pointer": "/propertyPack/surveys/{index}/outside/chimneyStacks/photos",
577
+ "keys": [
578
+ {
579
+ "pointer": "/photoId",
580
+ "scope": "canonical"
581
+ }
582
+ ]
583
+ },
584
+ {
585
+ "pointer": "/propertyPack/surveys/{index}/outside/roofCoverings/photos",
586
+ "keys": [
587
+ {
588
+ "pointer": "/photoId",
589
+ "scope": "canonical"
590
+ }
591
+ ]
592
+ },
593
+ {
594
+ "pointer": "/propertyPack/surveys/{index}/outside/rainwaterPipesGutters/photos",
595
+ "keys": [
596
+ {
597
+ "pointer": "/photoId",
598
+ "scope": "canonical"
599
+ }
600
+ ]
601
+ },
602
+ {
603
+ "pointer": "/propertyPack/surveys/{index}/outside/mainWalls/photos",
604
+ "keys": [
605
+ {
606
+ "pointer": "/photoId",
607
+ "scope": "canonical"
608
+ }
609
+ ]
610
+ },
611
+ {
612
+ "pointer": "/propertyPack/surveys/{index}/outside/windows/photos",
613
+ "keys": [
614
+ {
615
+ "pointer": "/photoId",
616
+ "scope": "canonical"
617
+ }
618
+ ]
619
+ },
620
+ {
621
+ "pointer": "/propertyPack/surveys/{index}/outside/outsideDoors/photos",
622
+ "keys": [
623
+ {
624
+ "pointer": "/photoId",
625
+ "scope": "canonical"
626
+ }
627
+ ]
628
+ },
629
+ {
630
+ "pointer": "/propertyPack/surveys/{index}/outside/conservatoryPorches/photos",
631
+ "keys": [
632
+ {
633
+ "pointer": "/photoId",
634
+ "scope": "canonical"
635
+ }
636
+ ]
637
+ },
638
+ {
639
+ "pointer": "/propertyPack/surveys/{index}/outside/otherJoinery/photos",
640
+ "keys": [
641
+ {
642
+ "pointer": "/photoId",
643
+ "scope": "canonical"
644
+ }
645
+ ]
646
+ },
647
+ {
648
+ "pointer": "/propertyPack/surveys/{index}/outside/other/photos",
649
+ "keys": [
650
+ {
651
+ "pointer": "/photoId",
652
+ "scope": "canonical"
653
+ }
654
+ ]
655
+ },
656
+ {
657
+ "pointer": "/propertyPack/surveys/{index}/services/electricity/photos",
658
+ "keys": [
659
+ {
660
+ "pointer": "/photoId",
661
+ "scope": "canonical"
662
+ }
663
+ ]
664
+ },
665
+ {
666
+ "pointer": "/propertyPack/surveys/{index}/services/gasOil/photos",
667
+ "keys": [
668
+ {
669
+ "pointer": "/photoId",
670
+ "scope": "canonical"
671
+ }
672
+ ]
673
+ },
674
+ {
675
+ "pointer": "/propertyPack/surveys/{index}/services/water/photos",
676
+ "keys": [
677
+ {
678
+ "pointer": "/photoId",
679
+ "scope": "canonical"
680
+ }
681
+ ]
682
+ },
683
+ {
684
+ "pointer": "/propertyPack/surveys/{index}/services/heating/photos",
685
+ "keys": [
686
+ {
687
+ "pointer": "/photoId",
688
+ "scope": "canonical"
689
+ }
690
+ ]
691
+ },
692
+ {
693
+ "pointer": "/propertyPack/surveys/{index}/services/waterHeating/photos",
694
+ "keys": [
695
+ {
696
+ "pointer": "/photoId",
697
+ "scope": "canonical"
698
+ }
699
+ ]
700
+ },
701
+ {
702
+ "pointer": "/propertyPack/surveys/{index}/services/drainage/photos",
703
+ "keys": [
704
+ {
705
+ "pointer": "/photoId",
706
+ "scope": "canonical"
707
+ }
708
+ ]
709
+ },
710
+ {
711
+ "pointer": "/propertyPack/surveys/{index}/services/commonServices/photos",
712
+ "keys": [
713
+ {
714
+ "pointer": "/photoId",
715
+ "scope": "canonical"
716
+ }
717
+ ]
718
+ },
719
+ {
720
+ "pointer": "/propertyPack/valuations",
721
+ "keys": [
722
+ {
723
+ "pointer": "/valuationId",
724
+ "scope": "canonical"
725
+ }
726
+ ]
727
+ },
728
+ {
729
+ "pointer": "/valuationComparisonData/propertyDetails",
730
+ "keys": [
731
+ {
732
+ "pointer": "/uprn",
733
+ "scope": "canonical"
734
+ }
735
+ ]
736
+ },
737
+ {
738
+ "pointer": "/contracts",
739
+ "keys": [
740
+ {
741
+ "pointer": "/contractId",
742
+ "scope": "canonical"
743
+ }
744
+ ]
745
+ },
746
+ {
747
+ "pointer": "/contracts/{index}/signatures",
748
+ "keys": [
749
+ {
750
+ "pointer": "/signatureId",
751
+ "scope": "canonical"
752
+ },
753
+ {
754
+ "pointer": "/externalIds/{source}",
755
+ "scope": "vendor"
756
+ }
757
+ ]
758
+ },
759
+ {
760
+ "pointer": "/chain/onwardPurchase",
761
+ "keys": [
762
+ {
763
+ "pointer": "/transactionId",
764
+ "scope": "canonical"
765
+ },
766
+ {
767
+ "pointer": "/externalIds/{source}",
768
+ "scope": "vendor"
769
+ }
770
+ ]
771
+ },
772
+ {
773
+ "pointer": "/chain/buyersSale",
774
+ "keys": [
775
+ {
776
+ "pointer": "/transactionId",
777
+ "scope": "canonical"
778
+ },
779
+ {
780
+ "pointer": "/externalIds/{source}",
781
+ "scope": "vendor"
782
+ }
783
+ ]
784
+ }
785
+ ],
786
+ "arrayKeyScopes": {
787
+ "canonical": "Lives in the shared payload, so any party holding the transaction can resolve it. This is what claims and credentials should address.",
788
+ "vendor": "A per-source back-reference under externalIds. Resolvable only by a party that knows that source's namespace, and absent entirely on items that source did not write. Use as a fallback, never as the identifier in a credential presented to a third party."
789
+ },
790
+ "unkeyedArrays": {
791
+ "description": "Arrays of objects with no candidate key at all — neither a canonical identifier nor externalIds — so their items can only be addressed by position. Listed so the gap is visible rather than silent. Most are single-source provider payloads replaced wholesale, where position is stable in practice.",
792
+ "pointers": [
793
+ "/propertyPack/buildInformation/higherRiskBuildingRegistration/accountablePersons",
794
+ "/propertyPack/buildInformation/higherRiskBuildingRegistration/accountablePersons/{index}/accountability",
795
+ "/propertyPack/nearbyFacilities/schools",
796
+ "/propertyPack/nearbyFacilities/transport",
797
+ "/propertyPack/nearbyFacilities/healthCare",
798
+ "/propertyPack/legalOwners/namesOfLegalOwners",
799
+ "/propertyPack/localSearches/localLandCharges/{index}/availableDocument",
800
+ "/propertyPack/localSearches/localAuthoritySearches/planningAndBuildingRegulations/designationsAndProposals/plans",
801
+ "/propertyPack/localSearches/localAuthoritySearches/planningAndBuildingRegulations/designationsAndProposals/plans/{index}/designations",
802
+ "/propertyPack/localSearches/localAuthoritySearches/roadsAndPublicRightsOfWay/roadsFootwaysAndFootpaths/highwaysMaintainableAtPublicExpense",
803
+ "/propertyPack/localSearches/localAuthoritySearches/roadsAndPublicRightsOfWay/roadsFootwaysAndFootpaths/subjectToAdoption",
804
+ "/propertyPack/localSearches/localAuthoritySearches/roadsAndPublicRightsOfWay/roadsFootwaysAndFootpaths/toBeMadeUpWithReclaim",
805
+ "/propertyPack/localSearches/localAuthoritySearches/roadsAndPublicRightsOfWay/roadsFootwaysAndFootpaths/toBeMadeUpWithoutReclaim",
806
+ "/propertyPack/titlesToBeSold/{index}/registerExtract/ocSummaryData/lease/leaseEntry",
807
+ "/propertyPack/titlesToBeSold/{index}/additionalDocuments",
808
+ "/valuationComparisonData/propertyDetails/{index}/media",
809
+ "/contracts/{index}/contract/template/requiredSignatories"
810
+ ]
811
+ },
812
+ "projections": {
813
+ "Representation": {
814
+ "description": "A professional representation relationship. Emitted once per (representative, represented party) pair, so a conveyancer instructed jointly by two sellers yields two, and sellers who instruct separate conveyancers yield one each.",
815
+ "source": {
816
+ "entity": "Transaction",
817
+ "pointer": "/participants/{index}"
818
+ },
819
+ "emitWhen": "/actingFor is present and non-empty",
820
+ "fanOut": "/actingFor",
821
+ "resolveBy": "participantId",
822
+ "fields": {
823
+ "representative": "/participants/{index}/participant",
824
+ "representedParty": "/participants/{index}/actingFor/{n} resolved against /participants/*/participantId",
825
+ "role": "/participants/{index}/role",
826
+ "organisation": "/participants/{index}/organisation",
827
+ "organisationReference": "/participants/{index}/organisationReference",
828
+ "transaction": "/id"
829
+ }
830
+ },
831
+ "SellerCapacity": {
832
+ "description": "The capacity in which a seller sells — the relationship that embodies the Seller role. Emitted once per participant whose role is Seller, whether or not a capacity has been declared yet.",
833
+ "source": {
834
+ "entity": "Transaction",
835
+ "pointer": "/participants/{index}"
836
+ },
837
+ "emitWhen": "/role is \"Seller\", or /sellersCapacity is present",
838
+ "fields": {
839
+ "seller": "/participants/{index}/participant",
840
+ "sellersCapacity": "/participants/{index}/sellersCapacity",
841
+ "dateBecameOwnerOrAuthority": "/participants/{index}/dateBecameOwnerOrAuthority",
842
+ "transaction": "/id"
843
+ },
844
+ "notes": "V3 does not tie a seller's capacity to a particular title, so the optional `title` reference is left unset. A transaction selling more than one title therefore yields a capacity scoped to the transaction, not to a title."
845
+ },
846
+ "TransactionRole": {
847
+ "description": "A party's role where no more specific relationship credential applies — Lender, Landlord, Tenant, Giftor, Platform Support — or where the specific relationship is not yet established. Emitted so that every participant carrying a role has exactly one credential embodying it.",
848
+ "source": {
849
+ "entity": "Transaction",
850
+ "pointer": "/participants/{index}"
851
+ },
852
+ "emitWhen": "/role is present and no other credential names this participant as its role-bearer",
853
+ "fields": {
854
+ "participant": "/participants/{index}/participant",
855
+ "role": "/participants/{index}/role",
856
+ "organisation": "/participants/{index}/organisation",
857
+ "organisationReference": "/participants/{index}/organisationReference",
858
+ "transaction": "/id"
859
+ }
860
+ },
861
+ "Offer": {
862
+ "description": "An offer made by a prospective buyer — the relationship that embodies the Buyer role. Emitted once per participant carrying an offerId, merged with that offer's data from Transaction.offers.",
863
+ "source": {
864
+ "entity": "Transaction",
865
+ "pointer": "/participants/{index}"
866
+ },
867
+ "emitWhen": "/offerId is present",
868
+ "fields": {
869
+ "offerId": "/participants/{index}/offerId",
870
+ "buyer": "/participants/{index}/participant",
871
+ "…": "the remaining fields from /offers/{offerId}",
872
+ "transaction": "/id"
873
+ },
874
+ "notes": "An offer in Transaction.offers that no participant references stays transaction data and yields no credential, since Offer requires a buyer."
875
+ }
876
+ },
877
+ "collisions": [
878
+ {
879
+ "key": "titleNumber",
880
+ "entity": "Title",
881
+ "sources": [
882
+ "/propertyPack/titlesToBeSold/{index}/titleNumber",
883
+ "/propertyPack/ownership/ownershipsToBeTransferred/{index}/titleNumber"
884
+ ],
885
+ "rule": "same-fact",
886
+ "resolution": "Identical fact in both sources and the key that correlates them. Decomposition takes either; recomposition writes the value back to every source array it emits an entry for."
887
+ }
888
+ ],
889
+ "rules": [
890
+ {
891
+ "id": "title.titlesToBeSold",
892
+ "v3Pointer": "/propertyPack/titlesToBeSold/{index}",
893
+ "entity": "Title",
894
+ "entityPointer": "",
895
+ "keys": {
896
+ "mode": "include",
897
+ "values": [
898
+ "titleNumber",
899
+ "titleExtents",
900
+ "registerExtract",
901
+ "additionalDocuments",
902
+ "keyFacts",
903
+ "covenantAnalysis"
904
+ ]
905
+ },
906
+ "extensions": "passthrough",
907
+ "instance": {
908
+ "cardinality": "many",
909
+ "orderedBy": {
910
+ "entity": "Transaction",
911
+ "pointer": "/titlesToBeSold"
912
+ },
913
+ "correlateBy": "titleNumber",
914
+ "primarySource": true
915
+ },
916
+ "notes": "Primary source: it takes any key the V3 schema does not define, and recomposition emits one entry per id in Transaction.titlesToBeSold."
917
+ },
918
+ {
919
+ "id": "title.ownershipsToBeTransferred",
920
+ "v3Pointer": "/propertyPack/ownership/ownershipsToBeTransferred/{index}",
921
+ "entity": "Title",
922
+ "entityPointer": "",
923
+ "keys": {
924
+ "mode": "include",
925
+ "values": [
926
+ "titleNumber",
927
+ "titlePropertyDescription",
928
+ "ownershipType",
929
+ "estateRentcharges",
930
+ "titleRestrictions",
931
+ "wholeFreeholdForSale",
932
+ "managedFreeholdOrCommonholdInformation",
933
+ "leaseholdInformation",
934
+ "otherOwnershipDetails"
935
+ ]
936
+ },
937
+ "extensions": "drop",
938
+ "instance": {
939
+ "cardinality": "many",
940
+ "orderedBy": {
941
+ "entity": "Transaction",
942
+ "pointer": "/titlesToBeSold"
943
+ },
944
+ "correlateBy": "titleNumber",
945
+ "primarySource": false
946
+ },
947
+ "notes": "Indices of the two source arrays are NOT assumed to correspond; they are correlated by titleNumber value."
948
+ },
949
+ {
950
+ "id": "transaction.saleContext.legalOwners",
951
+ "v3Pointer": "/propertyPack/legalOwners",
952
+ "entity": "Transaction",
953
+ "entityPointer": "/saleContext/legalOwners",
954
+ "instance": {
955
+ "cardinality": "single"
956
+ }
957
+ },
958
+ {
959
+ "id": "transaction.saleContext",
960
+ "v3Pointer": "/propertyPack/ownership",
961
+ "entity": "Transaction",
962
+ "entityPointer": "/saleContext",
963
+ "keys": {
964
+ "mode": "exclude",
965
+ "values": [
966
+ "ownershipsToBeTransferred"
967
+ ]
968
+ },
969
+ "extensions": "passthrough",
970
+ "instance": {
971
+ "cardinality": "single"
972
+ }
973
+ },
974
+ {
975
+ "id": "property",
976
+ "v3Pointer": "/propertyPack",
977
+ "entity": "Property",
978
+ "entityPointer": "",
979
+ "keys": {
980
+ "mode": "exclude",
981
+ "values": [
982
+ "titlesToBeSold",
983
+ "ownership",
984
+ "legalOwners"
985
+ ]
986
+ },
987
+ "extensions": "passthrough",
988
+ "instance": {
989
+ "cardinality": "single"
990
+ }
991
+ },
992
+ {
993
+ "id": "transaction.participants",
994
+ "v3Pointer": "/participants/{index}",
995
+ "entity": "Transaction",
996
+ "entityPointer": "/participants/{index}",
997
+ "keys": {
998
+ "mode": "include",
999
+ "values": [
1000
+ "did",
1001
+ "participantId",
1002
+ "organisation",
1003
+ "organisationReference"
1004
+ ]
1005
+ },
1006
+ "extensions": "drop",
1007
+ "instance": {
1008
+ "cardinality": "many",
1009
+ "orderedBy": {
1010
+ "entity": "Transaction",
1011
+ "pointer": "/participants"
1012
+ }
1013
+ },
1014
+ "notes": "The roster only: transaction-scoped identity and firm. The entity reference itself is at /participants/{index}/participant."
1015
+ },
1016
+ {
1017
+ "id": "credential.sellerCapacity",
1018
+ "extensions": "drop",
1019
+ "v3Pointer": "/participants/{index}",
1020
+ "entity": "SellerCapacity",
1021
+ "entityPointer": "",
1022
+ "keys": {
1023
+ "mode": "include",
1024
+ "values": [
1025
+ "sellersCapacity",
1026
+ "dateBecameOwnerOrAuthority"
1027
+ ]
1028
+ },
1029
+ "instance": {
1030
+ "cardinality": "many",
1031
+ "matchOn": "/seller"
1032
+ },
1033
+ "impliesRole": "Seller"
1034
+ },
1035
+ {
1036
+ "id": "credential.offer",
1037
+ "extensions": "drop",
1038
+ "v3Pointer": "/participants/{index}",
1039
+ "entity": "Offer",
1040
+ "entityPointer": "",
1041
+ "keys": {
1042
+ "mode": "include",
1043
+ "values": [
1044
+ "offerId"
1045
+ ]
1046
+ },
1047
+ "instance": {
1048
+ "cardinality": "many",
1049
+ "matchOn": "/buyer"
1050
+ },
1051
+ "impliesRole": "Buyer"
1052
+ },
1053
+ {
1054
+ "id": "credential.gift",
1055
+ "extensions": "drop",
1056
+ "v3Pointer": "/participants/{index}",
1057
+ "entity": "Gift",
1058
+ "entityPointer": "",
1059
+ "keys": {
1060
+ "mode": "include",
1061
+ "values": [
1062
+ "giftDetails",
1063
+ "offerId"
1064
+ ]
1065
+ },
1066
+ "instance": {
1067
+ "cardinality": "many",
1068
+ "matchOn": "/donor"
1069
+ },
1070
+ "impliesRole": "Giftor"
1071
+ },
1072
+ {
1073
+ "id": "credential.representation",
1074
+ "extensions": "drop",
1075
+ "v3Pointer": "/participants/{index}",
1076
+ "entity": "Representation",
1077
+ "entityPointer": "",
1078
+ "keys": {
1079
+ "mode": "include",
1080
+ "values": [
1081
+ "role",
1082
+ "actingFor"
1083
+ ]
1084
+ },
1085
+ "fieldMap": {
1086
+ "role": "/role",
1087
+ "actingFor": "/representedParty"
1088
+ },
1089
+ "instance": {
1090
+ "cardinality": "many",
1091
+ "matchOn": "/representative"
1092
+ },
1093
+ "notes": "actingFor becomes one Representation per represented party; its role is the credential's own discriminator."
1094
+ },
1095
+ {
1096
+ "id": "credential.transactionRole",
1097
+ "extensions": "drop",
1098
+ "v3Pointer": "/participants/{index}",
1099
+ "entity": "TransactionRole",
1100
+ "entityPointer": "",
1101
+ "keys": {
1102
+ "mode": "include",
1103
+ "values": [
1104
+ "role"
1105
+ ]
1106
+ },
1107
+ "instance": {
1108
+ "cardinality": "many",
1109
+ "matchOn": "/participant"
1110
+ },
1111
+ "notes": "Carries role for the roles no specific credential covers, and for a party whose specific relationship is not yet established."
1112
+ },
1113
+ {
1114
+ "id": "person",
1115
+ "v3Pointer": "/participants/{index}",
1116
+ "entity": "Person",
1117
+ "entityPointer": "",
1118
+ "keys": {
1119
+ "mode": "include",
1120
+ "values": [
1121
+ "name",
1122
+ "dateOfBirth",
1123
+ "phone",
1124
+ "email",
1125
+ "address",
1126
+ "did",
1127
+ "externalIds",
1128
+ "participantStatus",
1129
+ "verification"
1130
+ ]
1131
+ },
1132
+ "extensions": "passthrough",
1133
+ "instance": {
1134
+ "cardinality": "many",
1135
+ "orderedBy": {
1136
+ "entity": "Transaction",
1137
+ "pointer": "/participants",
1138
+ "idField": "participant"
1139
+ }
1140
+ }
1141
+ },
1142
+ {
1143
+ "id": "transaction",
1144
+ "v3Pointer": "",
1145
+ "entity": "Transaction",
1146
+ "entityPointer": "",
1147
+ "keys": {
1148
+ "mode": "exclude",
1149
+ "values": [
1150
+ "propertyPack",
1151
+ "participants",
1152
+ "$schema"
1153
+ ]
1154
+ },
1155
+ "extensions": "passthrough",
1156
+ "instance": {
1157
+ "cardinality": "single"
1158
+ }
1159
+ }
1160
+ ]
1161
+ }