@integraledger/lcp-placement-x402 0.15.0 → 0.16.0

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @integraledger/lcp-placement-x402
2
2
 
3
+ ## 0.16.0
4
+
5
+ ### Patch Changes
6
+
7
+ - @integraledger/lcp-binding-core@0.16.0
8
+
9
+ ## 0.15.1
10
+
11
+ ### Patch Changes
12
+
13
+ - Updated dependencies [431b8ec]
14
+ - @integraledger/lcp-binding-core@0.15.1
15
+
3
16
  ## 0.15.0
4
17
 
5
18
  ### Patch Changes
@@ -73,7 +86,7 @@
73
86
  `placement-x402` — the inlined wire schema now IS the authority document minus `$id` and `$defs`
74
87
  (Bazaar forbids both on the wire), drift-gated in `lcp-conformance` where the two packages meet.
75
88
  `termsUrlFields` declares both slots the wire carries; the bare-hash alias is written (`extra` stopped
76
- being wholly scheme-private when x402 §6.1 reserved names inside it, and LCP v1.38 §C.4's own Tier A
89
+ being wholly scheme-private when x402 §6.1 reserved names inside it, and LCP §C.4's own Tier A
77
90
  illustration carries the pair there); the `url` carrier admission is withdrawn (`carrierTypes` is
78
91
  `sha256` alone — the schema on the wire is `const: "sha256"`, and no shipped reader ever accepted a url
79
92
  in this slot). The `place` override shrinks to composition: the kit performs the whole placement and the
@@ -166,7 +179,7 @@ and a large number of documentation claims were corrected against the host speci
166
179
  First public release.
167
180
 
168
181
  `0.9.0` is deliberate: this is a release candidate for 1.0, not a preview. The implementation is complete
169
- against LCP v1.38 and certified by the conformance corpus, and the remaining distance to 1.0 is the
182
+ against the published LCP specification and certified by the conformance corpus, and the remaining distance to 1.0 is the
170
183
  specification's own — the standard is still moving through its steering committee, and this package will not
171
184
  claim a stability its protocol has not yet promised.
172
185
 
package/README.md CHANGED
@@ -64,16 +64,16 @@ and the PaymentRequirements table), four facts were confirmed and each one decid
64
64
  Extension identifiers are implementation-defined strings — no registry, no reverse-domain rule — so the
65
65
  `legalContext` key is available today and this placement is Tier A on the wire.
66
66
 
67
- ### Drift from LCP v1.37 §C.4 — recorded then adopted by v1.38
67
+ ### Drift from LCP §C.4 — recorded then adopted by LCP
68
68
 
69
69
  The host governs: its live specification is binding and LCP's Appendix C is an illustration.
70
70
  Two differences, neither of which changes the design:
71
71
 
72
- - v1.37 rendered the echo rule in RFC-2119 capitals ("MAY append to but **MUST NOT** delete or overwrite")
73
- where the host states it in lower case and about the data rather than the map. **v1.38 §C.4 now says
74
- exactly that**, so this item is discharged; it is kept because it is why the package reads the way it does
75
- and states it about the extensions map. The live spec states it in lower case and about the `info` payload.
76
- Same rule, weaker modality, one level lower.
72
+ - The appendix once rendered the echo rule in RFC-2119 capitals ("MAY append to but **MUST NOT** delete or
73
+ overwrite") where the host states it in lower case and about the data rather than the map. **LCP §C.4 now
74
+ says exactly that** — it records the rule "in lower case and about the `info` payload rather than the
75
+ map" — so this item is discharged; it is kept because it is why the package reads the way it does and
76
+ states it about the extensions map. Same rule, weaker modality, one level lower.
77
77
  - The live spec also carries `extra` on `PaymentPayload.accepted`, which §C.4 does not mention.
78
78
 
79
79
  ### Drift from a strict buyer-side reader, recorded for the same reason
@@ -188,7 +188,7 @@ needs a content-addressed value says so — it checks the decoded type as well a
188
188
 
189
189
  ## Provenance
190
190
 
191
- Cut against x402 v2 and reconciled against LCP v1.37 §C.4 on 2026-07-30, and re-read against **v1.38 §C.4**
191
+ Cut against x402 v2 and reconciled against LCP §C.4 on 2026-07-30, and re-read against **LCP §C.4**
192
192
  on 2026-08-12 — which adopted the drift items below and added §6.1's reserved keys. The host revision is
193
193
  `x402-foundation/x402@db5da2e65952` (`specs/x402-specification-v2.md`), which is what `spec-pins.json`
194
194
  records this tree read on 2026-08-11 and what `pnpm spec-drift` watches. The **paths and shapes** are
@@ -18,7 +18,7 @@ import type { PlacementManifest } from "@integraledger/lcp-binding-core";
18
18
  * fragments (starting with `#`); external references … are not allowed", and says a facilitator "must not
19
19
  * resolve external `$ref`/`$id` values … when validating an untrusted `schema`". So an external `$ref`
20
20
  * here would not merely be unresolvable to a counterparty that declines to fetch — wherever Bazaar
21
- * governs, it is rejected outright. LCP v1.38 §C.4 draws the same conclusion ("publish a resolvable
21
+ * governs, it is rejected outright. LCP §C.4 draws the same conclusion ("publish a resolvable
22
22
  * schema or inline it — and inlining is the safer of the two"). Dropping `$id` and `$defs` from the
23
23
  * inlined form is that rule applied: the authority document's `$id` is an absolute URL, and its `$defs`
24
24
  * carries the RECEIPT-time definition, which is not this challenge-time `info` and would bloat every 402.
@@ -42,7 +42,7 @@ export declare const LEGAL_CONTEXT_SCHEMA: Readonly<Record<string, unknown>>;
42
42
  *
43
43
  * **THE CANONICAL REPOSITORY IS THE FOUNDATION'S, and the citation moved on 2026-08-08.** Every
44
44
  * reference here named `coinbase/x402`, which the GitHub API reports as `"fork": true`;
45
- * `x402-foundation/x402` is `"fork": false` and is what LCP v1.38 §C.4's own *Checked against* line
45
+ * `x402-foundation/x402` is `"fork": false` and is what LCP §C.4's own *Checked against* line
46
46
  * reads. Citing a fork invites a reader to diff against a copy that may lag. The revision is pinned
47
47
  * rather than left as a bare repo name, because "the live spec" with no commit is not a claim anyone
48
48
  * can re-check.
@@ -71,7 +71,7 @@ export declare const LEGAL_CONTEXT_SCHEMA: Readonly<Record<string, unknown>>;
71
71
  *
72
72
  * **The extension key is `legalContext`, deliberately not a reverse-domain name.** x402 imposes no namespace
73
73
  * rule, and `legalContext` is the spelling emitters put on the wire, the spelling buyer parsers read, and the
74
- * one LCP v1.38 §C.4's own illustration shows. The `com.integraledger.*` reverse-domain namespace applies to
74
+ * one LCP §C.4's own illustration shows. The `com.integraledger.*` reverse-domain namespace applies to
75
75
  * hosts that REQUIRE one — UCP does; x402 does not — and renaming this key to suit a convention x402 does not
76
76
  * have would put a spelling on the wire that no counterparty reads.
77
77
  *
@@ -86,7 +86,7 @@ export declare const LEGAL_CONTEXT_SCHEMA: Readonly<Record<string, unknown>>;
86
86
  * and writing into another party's namespace is not our act. That reasoning has been overtaken. First, the
87
87
  * host itself no longer treats `extra` as wholly scheme-private: §6.1 reserves `assetTransferMethod` and
88
88
  * `paymentFlow` inside it as protocol-governed names, so `extra` is a host-managed extension surface with
89
- * scheme-specific residue, not a foreign namespace. Second, LCP v1.38 §C.4's own Tier A illustration puts
89
+ * scheme-specific residue, not a foreign namespace. Second, LCP §C.4's own Tier A illustration puts
90
90
  * `atrHash` AND `legalContextUrl` in `accepts[].extra` — a third-party reader built from the spec's example
91
91
  * reads `extra` first, and a challenge that leaves it empty is invisible to that reader. Third, the shipped
92
92
  * buyer parser reads BOTH carriers and reconciles, refusing disagreement — so the mirror cannot drift
package/dist/manifest.js CHANGED
@@ -17,7 +17,7 @@
17
17
  * fragments (starting with `#`); external references … are not allowed", and says a facilitator "must not
18
18
  * resolve external `$ref`/`$id` values … when validating an untrusted `schema`". So an external `$ref`
19
19
  * here would not merely be unresolvable to a counterparty that declines to fetch — wherever Bazaar
20
- * governs, it is rejected outright. LCP v1.38 §C.4 draws the same conclusion ("publish a resolvable
20
+ * governs, it is rejected outright. LCP §C.4 draws the same conclusion ("publish a resolvable
21
21
  * schema or inline it — and inlining is the safer of the two"). Dropping `$id` and `$defs` from the
22
22
  * inlined form is that rule applied: the authority document's `$id` is an absolute URL, and its `$defs`
23
23
  * carries the RECEIPT-time definition, which is not this challenge-time `info` and would bloat every 402.
@@ -65,7 +65,7 @@ export const LEGAL_CONTEXT_SCHEMA = Object.freeze({
65
65
  *
66
66
  * **THE CANONICAL REPOSITORY IS THE FOUNDATION'S, and the citation moved on 2026-08-08.** Every
67
67
  * reference here named `coinbase/x402`, which the GitHub API reports as `"fork": true`;
68
- * `x402-foundation/x402` is `"fork": false` and is what LCP v1.38 §C.4's own *Checked against* line
68
+ * `x402-foundation/x402` is `"fork": false` and is what LCP §C.4's own *Checked against* line
69
69
  * reads. Citing a fork invites a reader to diff against a copy that may lag. The revision is pinned
70
70
  * rather than left as a bare repo name, because "the live spec" with no commit is not a claim anyone
71
71
  * can re-check.
@@ -94,7 +94,7 @@ export const LEGAL_CONTEXT_SCHEMA = Object.freeze({
94
94
  *
95
95
  * **The extension key is `legalContext`, deliberately not a reverse-domain name.** x402 imposes no namespace
96
96
  * rule, and `legalContext` is the spelling emitters put on the wire, the spelling buyer parsers read, and the
97
- * one LCP v1.38 §C.4's own illustration shows. The `com.integraledger.*` reverse-domain namespace applies to
97
+ * one LCP §C.4's own illustration shows. The `com.integraledger.*` reverse-domain namespace applies to
98
98
  * hosts that REQUIRE one — UCP does; x402 does not — and renaming this key to suit a convention x402 does not
99
99
  * have would put a spelling on the wire that no counterparty reads.
100
100
  *
@@ -109,7 +109,7 @@ export const LEGAL_CONTEXT_SCHEMA = Object.freeze({
109
109
  * and writing into another party's namespace is not our act. That reasoning has been overtaken. First, the
110
110
  * host itself no longer treats `extra` as wholly scheme-private: §6.1 reserves `assetTransferMethod` and
111
111
  * `paymentFlow` inside it as protocol-governed names, so `extra` is a host-managed extension surface with
112
- * scheme-specific residue, not a foreign namespace. Second, LCP v1.38 §C.4's own Tier A illustration puts
112
+ * scheme-specific residue, not a foreign namespace. Second, LCP §C.4's own Tier A illustration puts
113
113
  * `atrHash` AND `legalContextUrl` in `accepts[].extra` — a third-party reader built from the spec's example
114
114
  * reads `extra` first, and a challenge that leaves it empty is invisible to that reader. Third, the shipped
115
115
  * buyer parser reads BOTH carriers and reconciles, refusing disagreement — so the mirror cannot drift
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integraledger/lcp-placement-x402",
3
- "version": "0.15.0",
3
+ "version": "0.16.0",
4
4
  "description": "Places an LCP reference into an x402 v2 payment challenge, and reads it back.",
5
5
  "keywords": [
6
6
  "lcp",
@@ -40,7 +40,7 @@
40
40
  },
41
41
  "homepage": "https://github.com/IntegraLedger/integra-protocol/tree/main/packages/placement-x402#readme",
42
42
  "dependencies": {
43
- "@integraledger/lcp-binding-core": "0.15.0"
43
+ "@integraledger/lcp-binding-core": "0.16.0"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@cfworker/json-schema": "4.1.1",
package/src/manifest.ts CHANGED
@@ -19,7 +19,7 @@ import type { PlacementManifest } from "@integraledger/lcp-binding-core";
19
19
  * fragments (starting with `#`); external references … are not allowed", and says a facilitator "must not
20
20
  * resolve external `$ref`/`$id` values … when validating an untrusted `schema`". So an external `$ref`
21
21
  * here would not merely be unresolvable to a counterparty that declines to fetch — wherever Bazaar
22
- * governs, it is rejected outright. LCP v1.38 §C.4 draws the same conclusion ("publish a resolvable
22
+ * governs, it is rejected outright. LCP §C.4 draws the same conclusion ("publish a resolvable
23
23
  * schema or inline it — and inlining is the safer of the two"). Dropping `$id` and `$defs` from the
24
24
  * inlined form is that rule applied: the authority document's `$id` is an absolute URL, and its `$defs`
25
25
  * carries the RECEIPT-time definition, which is not this challenge-time `info` and would bloat every 402.
@@ -73,7 +73,7 @@ export const LEGAL_CONTEXT_SCHEMA: Readonly<Record<string, unknown>> =
73
73
  *
74
74
  * **THE CANONICAL REPOSITORY IS THE FOUNDATION'S, and the citation moved on 2026-08-08.** Every
75
75
  * reference here named `coinbase/x402`, which the GitHub API reports as `"fork": true`;
76
- * `x402-foundation/x402` is `"fork": false` and is what LCP v1.38 §C.4's own *Checked against* line
76
+ * `x402-foundation/x402` is `"fork": false` and is what LCP §C.4's own *Checked against* line
77
77
  * reads. Citing a fork invites a reader to diff against a copy that may lag. The revision is pinned
78
78
  * rather than left as a bare repo name, because "the live spec" with no commit is not a claim anyone
79
79
  * can re-check.
@@ -102,7 +102,7 @@ export const LEGAL_CONTEXT_SCHEMA: Readonly<Record<string, unknown>> =
102
102
  *
103
103
  * **The extension key is `legalContext`, deliberately not a reverse-domain name.** x402 imposes no namespace
104
104
  * rule, and `legalContext` is the spelling emitters put on the wire, the spelling buyer parsers read, and the
105
- * one LCP v1.38 §C.4's own illustration shows. The `com.integraledger.*` reverse-domain namespace applies to
105
+ * one LCP §C.4's own illustration shows. The `com.integraledger.*` reverse-domain namespace applies to
106
106
  * hosts that REQUIRE one — UCP does; x402 does not — and renaming this key to suit a convention x402 does not
107
107
  * have would put a spelling on the wire that no counterparty reads.
108
108
  *
@@ -117,7 +117,7 @@ export const LEGAL_CONTEXT_SCHEMA: Readonly<Record<string, unknown>> =
117
117
  * and writing into another party's namespace is not our act. That reasoning has been overtaken. First, the
118
118
  * host itself no longer treats `extra` as wholly scheme-private: §6.1 reserves `assetTransferMethod` and
119
119
  * `paymentFlow` inside it as protocol-governed names, so `extra` is a host-managed extension surface with
120
- * scheme-specific residue, not a foreign namespace. Second, LCP v1.38 §C.4's own Tier A illustration puts
120
+ * scheme-specific residue, not a foreign namespace. Second, LCP §C.4's own Tier A illustration puts
121
121
  * `atrHash` AND `legalContextUrl` in `accepts[].extra` — a third-party reader built from the spec's example
122
122
  * reads `extra` first, and a challenge that leaves it empty is invisible to that reader. Third, the shipped
123
123
  * buyer parser reads BOTH carriers and reconciles, refusing disagreement — so the mirror cannot drift