@integraledger/lcp-placement-x402 0.9.0 → 0.10.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 CHANGED
@@ -1,5 +1,24 @@
1
1
  # @integraledger/lcp-placement-x402
2
2
 
3
+ ## 0.10.1
4
+
5
+ **0.10.0 was staged and withdrawn before approval; this is that release, re-cut.** The conformance corpus
6
+ was re-sealed after 0.10.0 was staged — its root moved `32fa90a6…` → `28bbf4ef…` when the vector tree was
7
+ brought inside the prose gates — so the staged `lcp-conformance` tarball carried a seal that no longer
8
+ matched the repository. The seal is what proves corpus authenticity to an independent implementer, and a
9
+ published version cannot be replaced, so the whole set was rejected and re-cut rather than shipping one
10
+ package that disagreed with its own source. No version 0.10.0 exists on the registry.
11
+
12
+ Released as part of a flat `0.10.1` across the whole suite. One number describes the set that was built,
13
+ tested and sealed together, so a consumer never has to work out which combination of versions was verified.
14
+
15
+ This package has no source change of its own in this release. What moved across the suite: three exported
16
+ names were corrected before anyone depends on them — `USDC_DECIMALS` became rail-qualified after it was
17
+ found to mean 6 on three rails and 7 on Stellar under one name, `VISA_TAP_PLACEMENT_TIER_A` lost the tier
18
+ it had baked into an identifier, and the memo codecs were named for the carrier they encode. Two wire
19
+ identities were respelled to match the vocabulary they are written into. Five gates were added or widened,
20
+ and a large number of documentation claims were corrected against the host specifications at HEAD.
21
+
3
22
  ## 0.9.0
4
23
 
5
24
  First public release.
package/README.md CHANGED
@@ -61,12 +61,14 @@ and the PaymentRequirements table), four facts were confirmed and each one decid
61
61
  Extension identifiers are implementation-defined strings — no registry, no reverse-domain rule — so the
62
62
  `legalContext` key is available today and this placement is Tier A on the wire.
63
63
 
64
- ### Drift from LCP v1.37 §C.4, recorded rather than absorbed
64
+ ### Drift from LCP v1.37 §C.4 recorded then adopted by v1.38
65
65
 
66
66
  The host governs: its live specification is binding and LCP's Appendix C is an illustration.
67
67
  Two differences, neither of which changes the design:
68
68
 
69
- - v1.37 renders the echo rule in RFC-2119 capitals ("MAY append to but **MUST NOT** delete or overwrite")
69
+ - v1.37 rendered the echo rule in RFC-2119 capitals ("MAY append to but **MUST NOT** delete or overwrite")
70
+ where the host states it in lower case and about the data rather than the map. **v1.38 §C.4 now says
71
+ exactly that**, so this item is discharged; it is kept because it is why the package reads the way it does
70
72
  and states it about the extensions map. The live spec states it in lower case and about the `info` payload.
71
73
  Same rule, weaker modality, one level lower.
72
74
  - The live spec also carries `extra` on `PaymentPayload.accepted`, which §C.4 does not mention.
@@ -181,16 +183,19 @@ the same defect as a carrier nobody can find.
181
183
  x402 defines only `info` and `schema` for an entry and the `legalContext` key is ours, so owning the entry is
182
184
  the point for the *seller* direction; entries *beside* ours in the `extensions` map are preserved
183
185
  unconditionally.
184
- - **`LEGAL_CONTEXT_SCHEMA_REF` points at a document the LCP TSC has not published yet**
185
- (`https://legalcontextprotocol.org/schemas/lcp-extension.json`). It is byte-identical to what emitters
186
- emits, and it is never fetched by anything in x402. Publishing it or repointing it — is a **wire change
187
- and must be made in both repos at once**; repointing it here alone would recreate the drift this package
188
- exists to close.
186
+ - **`LEGAL_CONTEXT_SCHEMA` is INLINED, not a reference.** It was a `$ref` at
187
+ `https://legalcontextprotocol.org/schemas/lcp-extension.json`, which returns 404 re-measured
188
+ 2026-08-11 and x402 makes `schema` a REQUIRED member of every extension entry, so that shipped a
189
+ required member no counterparty could resolve. All nine extensions published in the x402 repository inline
190
+ a complete JSON Schema, and one of them, Bazaar, forbids an external `$ref` outright. The exported value is
191
+ now a frozen literal that is byte-identical to what the placement emits. Changing it is a **wire change**:
192
+ it appears in every challenge.
189
193
 
190
194
  ## Provenance
191
195
 
192
196
  Cut against x402 v2 (`x402-foundation/x402@1fec3aa04e41`, `specs/x402-specification-v2.md`, read 2026-07-30) and reconciled
193
- against LCP v1.37 §C.4 the same day. The **paths and shapes** are matched field-for-field against the shipped
197
+ against LCP v1.37 §C.4 the same day, and re-read against **v1.38 §C.4** on 2026-08-12 which adopted the
198
+ drift items below and added §6.1's reserved keys. The **paths and shapes** are matched field-for-field against the
194
199
  shipped seller carrier and the buyer parsers that read it; the **resolution semantics diverge from a strict
195
200
  buyer gate in three recorded ways**, and *Drift from a strict buyer-side reader*
196
201
  above states each one and who closes it. Both drift sections are the disclosure, not a to-do list — a
@@ -8,10 +8,22 @@ import type { PlacementManifest } from "@integraledger/lcp-binding-core";
8
8
  * that does not break, not a reason to ship it. (`https://legalcontextprotocol.org/schemas/lcp-extension.json`
9
9
  * returns **404**, measured 2026-08-08 — the schema is inlined instead.)
10
10
  *
11
- * **Both extensions published in the x402 repository inline a complete JSON Schema** rather than
12
- * referencing an external document, and LCP v1.38 §C.4 says to do one or the other: "Because `schema` is a
13
- * REQUIRED member, publish a resolvable schema or inline it." Inlining also removes a hosting dependency
14
- * the deployment does not currently meet the same dependency the UCP capability still owes.
11
+ * **All nine extensions published in the x402 repository inline a complete JSON Schema** rather than
12
+ * referencing an external document `bazaar`, `builder-code`, `eip2612GasSponsoring`,
13
+ * `erc20ApprovalGasSponsoring`, `auth-hints`, `offer-receipt`, `http-message-signatures`,
14
+ * `payment-identifier`, `sign-in-with-x`, read at `x402-foundation/x402` HEAD 2026-08-11. Note that two of
15
+ * the nine are camelCase, so this package's `legalContext` key follows an established minority spelling
16
+ * rather than diverging from a unanimous one. LCP v1.38 §C.4 says to do one or the other — "Because
17
+ * `schema` is a REQUIRED member, publish a resolvable schema or inline it" — and adds that inlining is the
18
+ * safer of the two. Inlining also removes a hosting
19
+ * dependency the deployment does not currently meet — the same dependency the UCP capability still owes.
20
+ *
21
+ * **One of the nine makes it a rule, which settles the question.** The Bazaar extension requires a
22
+ * `schema`'s `$ref`/`$id` values to be "same-document JSON Pointer fragments (starting with `#`); external
23
+ * references (`http(s)://`, `file://`, or any other absolute/relative URI) are not allowed", and says a
24
+ * facilitator "must not resolve external `$ref`/`$id` values … when validating an untrusted `schema`". So a
25
+ * `$ref` here would not merely be unresolvable to a counterparty — it would be rejected outright by any
26
+ * facilitator cataloguing this extension.
15
27
  *
16
28
  * The shape is the §8.1 reference object this placement writes into `info`, and nothing more: it describes
17
29
  * the carrier, not the terms behind it.
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAuB/D,CAAC;AAEL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8EG;AACH,eAAO,MAAM,cAAc,EAAE,iBAkB5B,CAAC"}
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,oBAAoB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAuB/D,CAAC;AAEL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8EG;AACH,eAAO,MAAM,cAAc,EAAE,iBAkB5B,CAAC"}
package/dist/manifest.js CHANGED
@@ -7,10 +7,22 @@
7
7
  * that does not break, not a reason to ship it. (`https://legalcontextprotocol.org/schemas/lcp-extension.json`
8
8
  * returns **404**, measured 2026-08-08 — the schema is inlined instead.)
9
9
  *
10
- * **Both extensions published in the x402 repository inline a complete JSON Schema** rather than
11
- * referencing an external document, and LCP v1.38 §C.4 says to do one or the other: "Because `schema` is a
12
- * REQUIRED member, publish a resolvable schema or inline it." Inlining also removes a hosting dependency
13
- * the deployment does not currently meet the same dependency the UCP capability still owes.
10
+ * **All nine extensions published in the x402 repository inline a complete JSON Schema** rather than
11
+ * referencing an external document `bazaar`, `builder-code`, `eip2612GasSponsoring`,
12
+ * `erc20ApprovalGasSponsoring`, `auth-hints`, `offer-receipt`, `http-message-signatures`,
13
+ * `payment-identifier`, `sign-in-with-x`, read at `x402-foundation/x402` HEAD 2026-08-11. Note that two of
14
+ * the nine are camelCase, so this package's `legalContext` key follows an established minority spelling
15
+ * rather than diverging from a unanimous one. LCP v1.38 §C.4 says to do one or the other — "Because
16
+ * `schema` is a REQUIRED member, publish a resolvable schema or inline it" — and adds that inlining is the
17
+ * safer of the two. Inlining also removes a hosting
18
+ * dependency the deployment does not currently meet — the same dependency the UCP capability still owes.
19
+ *
20
+ * **One of the nine makes it a rule, which settles the question.** The Bazaar extension requires a
21
+ * `schema`'s `$ref`/`$id` values to be "same-document JSON Pointer fragments (starting with `#`); external
22
+ * references (`http(s)://`, `file://`, or any other absolute/relative URI) are not allowed", and says a
23
+ * facilitator "must not resolve external `$ref`/`$id` values … when validating an untrusted `schema`". So a
24
+ * `$ref` here would not merely be unresolvable to a counterparty — it would be rejected outright by any
25
+ * facilitator cataloguing this extension.
14
26
  *
15
27
  * The shape is the §8.1 reference object this placement writes into `info`, and nothing more: it describes
16
28
  * the carrier, not the terms behind it.
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAC/B,MAAM,CAAC,MAAM,CAAC;IACZ,OAAO,EAAE,8CAA8C;IACvD,KAAK,EAAE,6BAA6B;IACpC,WAAW,EACT,qJAAqJ;IACvJ,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;IAC3B,oBAAoB,EAAE,KAAK;IAC3B,UAAU,EAAE;QACV,IAAI,EAAE;YACJ,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC;YACrC,WAAW,EACT,0GAA0G;SAC7G;QACD,KAAK,EAAE;YACL,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,CAAC;YACZ,WAAW,EACT,yGAAyG;SAC5G;KACF;CACF,CAAC,CAAC;AAEL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8EG;AACH,MAAM,CAAC,MAAM,cAAc,GAAsB;IAC/C,QAAQ,EAAE,MAAM;IAChB,OAAO,EAAE,eAAe;IACxB,IAAI,EAAE,GAAG;IACT,QAAQ,EAAE,kBAAkB;IAC5B,SAAS,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;IAClC,KAAK,EAAE,8BAA8B;IACrC,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,yBAAyB;YAC/B,QAAQ,EAAE,YAAY;YACtB,QAAQ,EAAE,QAAQ;SACnB;KACF;IACD,aAAa,EAAE,8CAA8C;IAC7D,YAAY,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC;IAC/B,OAAO,EACL,kRAAkR;CACrR,CAAC"}
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAC/B,MAAM,CAAC,MAAM,CAAC;IACZ,OAAO,EAAE,8CAA8C;IACvD,KAAK,EAAE,6BAA6B;IACpC,WAAW,EACT,qJAAqJ;IACvJ,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;IAC3B,oBAAoB,EAAE,KAAK;IAC3B,UAAU,EAAE;QACV,IAAI,EAAE;YACJ,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC;YACrC,WAAW,EACT,0GAA0G;SAC7G;QACD,KAAK,EAAE;YACL,IAAI,EAAE,QAAQ;YACd,SAAS,EAAE,CAAC;YACZ,WAAW,EACT,yGAAyG;SAC5G;KACF;CACF,CAAC,CAAC;AAEL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8EG;AACH,MAAM,CAAC,MAAM,cAAc,GAAsB;IAC/C,QAAQ,EAAE,MAAM;IAChB,OAAO,EAAE,eAAe;IACxB,IAAI,EAAE,GAAG;IACT,QAAQ,EAAE,kBAAkB;IAC5B,SAAS,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE;IAClC,KAAK,EAAE,8BAA8B;IACrC,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,yBAAyB;YAC/B,QAAQ,EAAE,YAAY;YACtB,QAAQ,EAAE,QAAQ;SACnB;KACF;IACD,aAAa,EAAE,8CAA8C;IAC7D,YAAY,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC;IAC/B,OAAO,EACL,kRAAkR;CACrR,CAAC"}
@@ -9,7 +9,7 @@ import { type ReferencePlacementAdapter } from "@integraledger/lcp-binding-core"
9
9
  * a generic enum — the abstraction leaking — so the write half is overridden here, in this package, where it
10
10
  * is reviewed like any other code. `extract` is the kit's unchanged: reading `extensions.legalContext.info` is
11
11
  * an ordinary object-path read, and the bare-hash alias at `accepts.0.extra.atrHash` is handled by its own
12
- * declared encoding (S2/S6). One overridden member is composition; a second would mean this package had
12
+ * declared encoding. One overridden member is composition; a second would mean this package had
13
13
  * stopped using the kit, and the test suite says so.
14
14
  */
15
15
  export declare const x402Placement: ReferencePlacementAdapter;
package/dist/placement.js CHANGED
@@ -21,7 +21,7 @@ function refuse(code, detail) {
21
21
  * a generic enum — the abstraction leaking — so the write half is overridden here, in this package, where it
22
22
  * is reviewed like any other code. `extract` is the kit's unchanged: reading `extensions.legalContext.info` is
23
23
  * an ordinary object-path read, and the bare-hash alias at `accepts.0.extra.atrHash` is handled by its own
24
- * declared encoding (S2/S6). One overridden member is composition; a second would mean this package had
24
+ * declared encoding. One overridden member is composition; a second would mean this package had
25
25
  * stopped using the kit, and the test suite says so.
26
26
  */
27
27
  export const x402Placement = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@integraledger/lcp-placement-x402",
3
- "version": "0.9.0",
3
+ "version": "0.10.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.9.0"
43
+ "@integraledger/lcp-binding-core": "0.10.1"
44
44
  },
45
45
  "devDependencies": {
46
46
  "@cfworker/json-schema": "4.1.1",
package/src/manifest.ts CHANGED
@@ -9,10 +9,22 @@ import type { PlacementManifest } from "@integraledger/lcp-binding-core";
9
9
  * that does not break, not a reason to ship it. (`https://legalcontextprotocol.org/schemas/lcp-extension.json`
10
10
  * returns **404**, measured 2026-08-08 — the schema is inlined instead.)
11
11
  *
12
- * **Both extensions published in the x402 repository inline a complete JSON Schema** rather than
13
- * referencing an external document, and LCP v1.38 §C.4 says to do one or the other: "Because `schema` is a
14
- * REQUIRED member, publish a resolvable schema or inline it." Inlining also removes a hosting dependency
15
- * the deployment does not currently meet the same dependency the UCP capability still owes.
12
+ * **All nine extensions published in the x402 repository inline a complete JSON Schema** rather than
13
+ * referencing an external document `bazaar`, `builder-code`, `eip2612GasSponsoring`,
14
+ * `erc20ApprovalGasSponsoring`, `auth-hints`, `offer-receipt`, `http-message-signatures`,
15
+ * `payment-identifier`, `sign-in-with-x`, read at `x402-foundation/x402` HEAD 2026-08-11. Note that two of
16
+ * the nine are camelCase, so this package's `legalContext` key follows an established minority spelling
17
+ * rather than diverging from a unanimous one. LCP v1.38 §C.4 says to do one or the other — "Because
18
+ * `schema` is a REQUIRED member, publish a resolvable schema or inline it" — and adds that inlining is the
19
+ * safer of the two. Inlining also removes a hosting
20
+ * dependency the deployment does not currently meet — the same dependency the UCP capability still owes.
21
+ *
22
+ * **One of the nine makes it a rule, which settles the question.** The Bazaar extension requires a
23
+ * `schema`'s `$ref`/`$id` values to be "same-document JSON Pointer fragments (starting with `#`); external
24
+ * references (`http(s)://`, `file://`, or any other absolute/relative URI) are not allowed", and says a
25
+ * facilitator "must not resolve external `$ref`/`$id` values … when validating an untrusted `schema`". So a
26
+ * `$ref` here would not merely be unresolvable to a counterparty — it would be rejected outright by any
27
+ * facilitator cataloguing this extension.
16
28
  *
17
29
  * The shape is the §8.1 reference object this placement writes into `info`, and nothing more: it describes
18
30
  * the carrier, not the terms behind it.
package/src/placement.ts CHANGED
@@ -31,7 +31,7 @@ function refuse(code: string, detail: string): Outcome<never> {
31
31
  * a generic enum — the abstraction leaking — so the write half is overridden here, in this package, where it
32
32
  * is reviewed like any other code. `extract` is the kit's unchanged: reading `extensions.legalContext.info` is
33
33
  * an ordinary object-path read, and the bare-hash alias at `accepts.0.extra.atrHash` is handled by its own
34
- * declared encoding (S2/S6). One overridden member is composition; a second would mean this package had
34
+ * declared encoding. One overridden member is composition; a second would mean this package had
35
35
  * stopped using the kit, and the test suite says so.
36
36
  */
37
37
  export const x402Placement: ReferencePlacementAdapter = {