@integraledger/lcp-placement-x402 0.15.1 → 0.16.1
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 +14 -2
- package/README.md +7 -7
- package/dist/manifest.d.ts +4 -4
- package/dist/manifest.js +4 -4
- package/package.json +2 -2
- package/src/manifest.ts +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @integraledger/lcp-placement-x402
|
|
2
2
|
|
|
3
|
+
## 0.16.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- @integraledger/lcp-binding-core@0.16.1
|
|
8
|
+
|
|
9
|
+
## 0.16.0
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- @integraledger/lcp-binding-core@0.16.0
|
|
14
|
+
|
|
3
15
|
## 0.15.1
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
|
@@ -80,7 +92,7 @@
|
|
|
80
92
|
`placement-x402` — the inlined wire schema now IS the authority document minus `$id` and `$defs`
|
|
81
93
|
(Bazaar forbids both on the wire), drift-gated in `lcp-conformance` where the two packages meet.
|
|
82
94
|
`termsUrlFields` declares both slots the wire carries; the bare-hash alias is written (`extra` stopped
|
|
83
|
-
being wholly scheme-private when x402 §6.1 reserved names inside it, and LCP
|
|
95
|
+
being wholly scheme-private when x402 §6.1 reserved names inside it, and LCP §C.4's own Tier A
|
|
84
96
|
illustration carries the pair there); the `url` carrier admission is withdrawn (`carrierTypes` is
|
|
85
97
|
`sha256` alone — the schema on the wire is `const: "sha256"`, and no shipped reader ever accepted a url
|
|
86
98
|
in this slot). The `place` override shrinks to composition: the kit performs the whole placement and the
|
|
@@ -173,7 +185,7 @@ and a large number of documentation claims were corrected against the host speci
|
|
|
173
185
|
First public release.
|
|
174
186
|
|
|
175
187
|
`0.9.0` is deliberate: this is a release candidate for 1.0, not a preview. The implementation is complete
|
|
176
|
-
against LCP
|
|
188
|
+
against the published LCP specification and certified by the conformance corpus, and the remaining distance to 1.0 is the
|
|
177
189
|
specification's own — the standard is still moving through its steering committee, and this package will not
|
|
178
190
|
claim a stability its protocol has not yet promised.
|
|
179
191
|
|
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
|
|
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
|
-
-
|
|
73
|
-
where the host states it in lower case and about the data rather than the map. **
|
|
74
|
-
exactly that
|
|
75
|
-
|
|
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
|
|
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
|
package/dist/manifest.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
3
|
+
"version": "0.16.1",
|
|
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.
|
|
43
|
+
"@integraledger/lcp-binding-core": "0.16.1"
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|