@hyperscale0/adl 1.0.0-alpha.2 → 1.0.0-beta.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 +7 -1
- package/README.md +16 -12
- package/docs/authoring-guide.md +24 -23
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,11 @@ follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html) from 1.0.0.
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [1.0.0-beta.1] - 2026-08-29
|
|
10
|
+
|
|
11
|
+
- This is the first beta and has no package behavior changes from
|
|
12
|
+
1.0.0-alpha.2.
|
|
13
|
+
|
|
9
14
|
## [1.0.0-alpha.2] - 2026-08-26
|
|
10
15
|
|
|
11
16
|
### Removed
|
|
@@ -54,6 +59,7 @@ write an adapter in; an adapter is still what you write.
|
|
|
54
59
|
the exported types derived from them, so the published schema cannot drift
|
|
55
60
|
from the type checker. No exported type changed shape.
|
|
56
61
|
|
|
57
|
-
[Unreleased]: https://github.com/hyperscale0/hyperscale-adl/compare/v1.0.0-
|
|
62
|
+
[Unreleased]: https://github.com/hyperscale0/hyperscale-adl/compare/v1.0.0-beta.1...HEAD
|
|
63
|
+
[1.0.0-beta.1]: https://github.com/hyperscale0/hyperscale-adl/compare/v1.0.0-alpha.2...v1.0.0-beta.1
|
|
58
64
|
[1.0.0-alpha.2]: https://github.com/hyperscale0/hyperscale-adl/compare/v1.0.0-alpha.1...v1.0.0-alpha.2
|
|
59
65
|
[1.0.0-alpha.1]: https://github.com/hyperscale0/hyperscale-adl/releases/tag/v1.0.0-alpha.1
|
package/README.md
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
# ADL
|
|
2
2
|
|
|
3
|
-
ADL
|
|
4
|
-
provider
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
ADL is the Adapter Declaration Language: the public format for declaring how a
|
|
4
|
+
bank or provider behaves at the control-plane boundary. Its validator and
|
|
5
|
+
conformance suite refuse incomplete interface facts before a generic runtime
|
|
6
|
+
can poll, classify, reconcile, or deduplicate provider results.
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
The three language boundaries stay separate. HSX authors settlement behavior.
|
|
9
|
+
UDL defines the canonical product contract. ADL declares how an external
|
|
10
|
+
provider performs or confirms work behind that contract.
|
|
10
11
|
|
|
11
|
-
**Status: alpha.**
|
|
12
|
-
|
|
12
|
+
**Status: alpha.** The surface can still change on a minor version until
|
|
13
|
+
1.0.0.
|
|
13
14
|
|
|
14
15
|
## Adapter symmetry
|
|
15
16
|
|
|
@@ -33,6 +34,9 @@ what a payment means. It states facts, and the checks in this package prove
|
|
|
33
34
|
those facts are complete enough for a generic runtime to poll, classify,
|
|
34
35
|
reconcile, and dedupe without guessing.
|
|
35
36
|
|
|
37
|
+
Conformance checks a declaration. It does not contact a provider, verify a
|
|
38
|
+
credential, certify regulatory readiness, or make a Product live.
|
|
39
|
+
|
|
36
40
|
## Install
|
|
37
41
|
|
|
38
42
|
```bash
|
|
@@ -100,14 +104,14 @@ empty finding list is the certification.
|
|
|
100
104
|
|
|
101
105
|
## Where to go next
|
|
102
106
|
|
|
103
|
-
- **[docs/authoring-guide.md](docs/authoring-guide.md)
|
|
107
|
+
- **[docs/authoring-guide.md](docs/authoring-guide.md)**: the whole job, field
|
|
104
108
|
by field, with the rule that enforces each one.
|
|
105
|
-
- **[examples/meridian-bank](examples/meridian-bank)
|
|
109
|
+
- **[examples/meridian-bank](examples/meridian-bank)**: a complete certified
|
|
106
110
|
adapter for a bank that does not exist, with fixtures and its own tests.
|
|
107
111
|
Copy it.
|
|
108
|
-
- **[conformance/cases.json](conformance/cases.json)
|
|
112
|
+
- **[conformance/cases.json](conformance/cases.json)**: every rule as data:
|
|
109
113
|
one broken fact per case, and what each gate says about it.
|
|
110
|
-
- **[spec/manifest.schema.json](spec/manifest.schema.json)
|
|
114
|
+
- **[spec/manifest.schema.json](spec/manifest.schema.json)**: JSON Schema
|
|
111
115
|
2020-12 for one declaration, for authors who are not writing TypeScript.
|
|
112
116
|
|
|
113
117
|
## Running conformance
|
package/docs/authoring-guide.md
CHANGED
|
@@ -15,9 +15,9 @@ credential, and never decides what a payment means.
|
|
|
15
15
|
|
|
16
16
|
That split is why the checks in ADL are declaration-level. Conformance
|
|
17
17
|
does not call your bank. It proves the facts you declared are complete enough
|
|
18
|
-
for a generic runtime to poll, classify, reconcile, and dedupe
|
|
19
|
-
guessing
|
|
20
|
-
|
|
18
|
+
for a generic runtime to poll, classify, reconcile, and dedupe without
|
|
19
|
+
guessing. Every guess a runtime makes about money is a provider-boundary
|
|
20
|
+
defect.
|
|
21
21
|
|
|
22
22
|
Two consequences worth internalizing before you write a line:
|
|
23
23
|
|
|
@@ -30,7 +30,7 @@ Two consequences worth internalizing before you write a line:
|
|
|
30
30
|
fact to post from. `validatePartnerBankProfile` refuses a profile whose
|
|
31
31
|
`notificationMechanisms` omits `poll`, whatever else it lists.
|
|
32
32
|
|
|
33
|
-
### Adapter
|
|
33
|
+
### Adapter symmetry
|
|
34
34
|
|
|
35
35
|
Hyperscale's own bank adapters are written against this package and nothing
|
|
36
36
|
more. There is no private adapter API, no internal hook, no second interface
|
|
@@ -108,18 +108,18 @@ Each `ProviderOperationBinding` carries:
|
|
|
108
108
|
| `resourceKind` | The platform resource the provider's answer commits onto. Must appear in `bindings`. |
|
|
109
109
|
| `resourceIdPath` | Where the resource id is read from. Non-blank, checked at load. |
|
|
110
110
|
| `meter` | Optional. The usage meter this operation feeds. |
|
|
111
|
-
| `envelope` | How
|
|
111
|
+
| `envelope` | How this operation's response carries its outcome. Required when the runtime sends a provider command, see below. |
|
|
112
112
|
| `statusEnquiry` | The authoritative read-after-write. Required on a REST command, see below. |
|
|
113
113
|
|
|
114
114
|
### The envelope class, per operation
|
|
115
115
|
|
|
116
116
|
`ProviderResponseEnvelope` has three inhabitants:
|
|
117
117
|
|
|
118
|
-
- `http_200_body_status
|
|
118
|
+
- `http_200_body_status`: every response is HTTP 200 and the outcome is a
|
|
119
119
|
status token in the body. A rejection arrives inside a success.
|
|
120
|
-
- `http_status_error_body
|
|
120
|
+
- `http_status_error_body`: the HTTP status carries the outcome and a failure
|
|
121
121
|
body is prose.
|
|
122
|
-
- `unconfirmed_until_live
|
|
122
|
+
- `unconfirmed_until_live`: the provider publishes no error sample, so the
|
|
123
123
|
class is honestly unknown.
|
|
124
124
|
|
|
125
125
|
Declare it **per operation**, never per provider. Real providers answer in more
|
|
@@ -130,9 +130,10 @@ Conformance requires the class on any binding where the runtime sends a command
|
|
|
130
130
|
and reads an answer, meaning `direction: "tenant_initiated"` on an `egress` of
|
|
131
131
|
`rest` or `sync_clearance`. Missing it is `response_envelope_unclassified`; a
|
|
132
132
|
declared `unconfirmed_until_live` is `response_envelope_unconfirmed`, because
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
no envelope, and declaring one there would be a
|
|
133
|
+
conformance requires the response class to be established first. Passing that
|
|
134
|
+
check does not grant live readiness. A `system_settlement` binding carries no
|
|
135
|
+
response of its own, so it owes no envelope, and declaring one there would be a
|
|
136
|
+
borrowed fact.
|
|
136
137
|
|
|
137
138
|
### Status enquiry, the read-after-write
|
|
138
139
|
|
|
@@ -165,10 +166,10 @@ enquiry support from a command URL, so:
|
|
|
165
166
|
|
|
166
167
|
`ProviderEgressMode` is how this adapter reaches the provider at all:
|
|
167
168
|
|
|
168
|
-
- `none
|
|
169
|
-
- `rest
|
|
170
|
-
- `batch_reconcile
|
|
171
|
-
- `sync_clearance
|
|
169
|
+
- `none`: the capability is learned entirely by observation;
|
|
170
|
+
- `rest`: per-command HTTP;
|
|
171
|
+
- `batch_reconcile`: files, reconciled after the fact;
|
|
172
|
+
- `sync_clearance`: one synchronous exchange that carries its own truth.
|
|
172
173
|
|
|
173
174
|
A `tenant_initiated` binding on `none` or `batch_reconcile` promises an
|
|
174
175
|
outbound call the egress mode cannot make: `egress_direction_incoherent`.
|
|
@@ -191,11 +192,11 @@ missing: polling is the fact.
|
|
|
191
192
|
`bindings` maps each resource kind this adapter settles to a
|
|
192
193
|
`ProviderResourceBinding`:
|
|
193
194
|
|
|
194
|
-
- `strict
|
|
195
|
-
- `claim
|
|
196
|
-
- `confirmation_only
|
|
195
|
+
- `strict`: the provider's fact must match the platform's row exactly;
|
|
196
|
+
- `claim`: the provider's fact claims an existing row;
|
|
197
|
+
- `confirmation_only`: the provider only confirms what the platform already
|
|
197
198
|
decided;
|
|
198
|
-
- `evidence_only
|
|
199
|
+
- `evidence_only`: the fact is recorded as evidence, and settles nothing.
|
|
199
200
|
|
|
200
201
|
Every `resourceKind` named by an operation binding or a webhook plan needs an
|
|
201
202
|
entry, or conformance reports `resource_binding_missing`: a provider fact with
|
|
@@ -226,8 +227,8 @@ would otherwise guess.
|
|
|
226
227
|
|
|
227
228
|
`wireCodec` (`rest_json`, `iso20022_xml`, `swift_mt`) and `auth`
|
|
228
229
|
(`ProviderAuthEnvelope` plus a signing scheme). Declaring a grant the bank will
|
|
229
|
-
not accept fails on the first
|
|
230
|
-
not assume client credentials.
|
|
230
|
+
not accept fails on the first provider call. Read the bank's token service and
|
|
231
|
+
do not assume client credentials.
|
|
231
232
|
|
|
232
233
|
### The idempotency spine
|
|
233
234
|
|
|
@@ -415,8 +416,8 @@ An adapter is handed over as source, never as a running service:
|
|
|
415
416
|
|
|
416
417
|
## Stability
|
|
417
418
|
|
|
418
|
-
The package is
|
|
419
|
-
|
|
419
|
+
The package is pre-1.0 and the surface can still change on a minor version
|
|
420
|
+
until it is `1.0.0`. Two promises hold now:
|
|
420
421
|
|
|
421
422
|
- conformance codes are append-only;
|
|
422
423
|
- a value removed from a vocabulary in `src/vocabulary.ts` is a breaking change
|
package/package.json
CHANGED