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

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