@admoai/sdk-scenarios 1.0.0 → 1.2.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
@@ -4,6 +4,27 @@ Versioning: a scenario added or an `expect` tightened is a **minor** release; a
4
4
  removed, or a `request`/`expect` key renamed (every SDK's interpreter must change), is a
5
5
  **major** one. Each SDK vendors one version and its own CI checks the vendored bytes against it.
6
6
 
7
+ ## 1.2.0 — 2026-11-05
8
+
9
+ Adds `fixtureScenarios` F1–F15 and moves `schemaVersion` to 2 (admoai/adhub#4733): offline
10
+ scenarios for the six standard native formats, so every SDK proves it decodes them before the
11
+ engine serves them. Each decodes one golden decision-wire file, shipped in this package under
12
+ `fixtures/golden-wire/` (byte-identical to adhub's `ui/platform/lib/ad-formats/golden-wire/`,
13
+ copied at publish), optionally edited (`edits`: remove or add a field at one level), and asserts
14
+ what the app reads: the standard format, version and template source (null = absent), content
15
+ keys present and absent, slides in server order with their ids, positions and own trackers,
16
+ click, custom and video-event keys, and matched points. F14 is the gate-off wire (the three
17
+ standard fields removed); F15 adds unknown fields at every level. The 39 live scenarios are
18
+ unchanged. A runner that does not execute `fixtureScenarios` must refuse schemaVersion 2, so an
19
+ SDK cannot adopt this version and skip them silently.
20
+
21
+ ## 1.1.0 — 2026-10-21
22
+
23
+ Also ships `scenarios.feature`: the same 39 scenarios rendered as Gherkin for people to read
24
+ (admoai/adhub#4348). It is generated from `scenarios.json` by `tools/sdkfeaturegen` in adhub and
25
+ is never edited by hand; the SDK runners keep executing the JSON, which is byte-identical to
26
+ 1.0.0's.
27
+
7
28
  ## 1.0.0 — 2026-10-20
8
29
 
9
30
  The 39 scenarios the three SDKs already carried, byte for byte (sha256 `a55f68eb…`):
package/README.md CHANGED
@@ -4,9 +4,11 @@ The scenarios every AdMoai mobile SDK (iOS, Android, Flutter) must pass against
4
4
  decision-engine: given a request, the outcome a publisher's app observes. One definition,
5
5
  executed by a thin interpreter in each SDK, so the three cannot make different claims.
6
6
 
7
- This package is **data only**: `scenarios.json` (the manifest, `schemaVersion` inside). It
8
- carries no URLs, hosts, credentials or tenant identifiers — `check.sh` refuses a release that
9
- does.
7
+ This package is **data only**: `scenarios.json` (the manifest, `schemaVersion` inside) and
8
+ `scenarios.feature`, the same scenarios rendered as Gherkin for a PM or an integrating
9
+ publisher to read. The JSON is what the SDK runners execute; the feature is generated from it.
10
+ Neither carries URLs, hosts, credentials or tenant identifiers — `check.sh` refuses a release
11
+ whose manifest does.
10
12
 
11
13
  ## For an SDK
12
14
 
@@ -18,10 +20,20 @@ curl -sSfL "https://registry.npmjs.org/@admoai/sdk-scenarios/-/sdk-scenarios-$VE
18
20
  | tar -xzO package/scenarios.json | cmp - path/to/vendored/scenarios.json
19
21
  ```
20
22
 
23
+ From `schemaVersion` 2 the manifest also holds `fixtureScenarios`: offline scenarios that decode
24
+ a golden decision-wire file, so vendor `fixtures/golden-wire/` (the whole directory) beside the
25
+ manifest and verify those bytes the same way, file by file, against the tarball's
26
+ `package/fixtures/golden-wire/<file>`. A runner that cannot execute `fixtureScenarios` must
27
+ refuse a schemaVersion 2 manifest.
28
+
21
29
  ## For adhub (the source)
22
30
 
23
31
  The source of truth is `sdk/scenarios/` in admoai/adhub. To change a scenario: edit
24
- `scenarios.json`, bump `version` in `package.json` (minor: added or tightened; major: removed
32
+ `scenarios.json`, regenerate the Gherkin with `go run ./tools/sdkfeaturegen` from the
33
+ repository root, bump `version` in `package.json` (minor: added or tightened; major: removed
25
34
  or a key renamed), add a `CHANGELOG.md` entry, and run `sdk/scenarios/check.sh`. Merging to
26
- `main` publishes the new version (`.github/workflows/sdk-scenarios-release.yml`); each SDK then
35
+ `main` publishes the new version (`.github/workflows/sdk-scenarios-release.yml`, which first runs
36
+ `sdk/scenarios/stage-fixtures.sh` to copy adhub's `ui/platform/lib/ad-formats/golden-wire/*.json`
37
+ into the package's `fixtures/golden-wire/`; that directory is never committed, and a change to a
38
+ golden file needs a version bump too); each SDK then
27
39
  moves to it in its own PR. See `docs/guides/sdk-ci.md`.
@@ -0,0 +1,74 @@
1
+ {
2
+ "success": true,
3
+ "data": [
4
+ {
5
+ "placement": "map_vehicles",
6
+ "creatives": [
7
+ {
8
+ "contents": [
9
+ {
10
+ "key": "branded_image",
11
+ "type": "image",
12
+ "value": "https://cdn.admoai.com/media/volta-car.png"
13
+ },
14
+ {
15
+ "key": "accessible_label",
16
+ "type": "text",
17
+ "value": "Volta Coffee car"
18
+ },
19
+ {
20
+ "key": "destination_url",
21
+ "type": "url",
22
+ "value": "https://volta.example/menu"
23
+ }
24
+ ],
25
+ "advertiser": {
26
+ "name": "Volta Coffee",
27
+ "legalName": "Volta Coffee SpA",
28
+ "logoUrl": "https://cdn.admoai.com/media/volta-logo.png"
29
+ },
30
+ "template": {
31
+ "key": "branded_assets",
32
+ "style": "branded_asset"
33
+ },
34
+ "tracking": {
35
+ "impressions": [
36
+ {
37
+ "key": "default",
38
+ "url": "https://api.admoai.com/v1/tracking?e=tok.branded_assets.full.impression"
39
+ }
40
+ ],
41
+ "clicks": [
42
+ {
43
+ "key": "default",
44
+ "url": "https://api.admoai.com/v1/tracking?e=tok.branded_assets.full.click"
45
+ }
46
+ ],
47
+ "custom": [
48
+ {
49
+ "key": "asset_tap",
50
+ "url": "https://api.admoai.com/v1/tracking?e=tok.branded_assets.full.asset_tap"
51
+ }
52
+ ]
53
+ },
54
+ "metadata": {
55
+ "adId": "ad_01JDBPXZN4D94EPQC5MVQB9MR6",
56
+ "creativeId": "creative_01JD1Z5CNM4GMHEJJFHCYWGKJ4",
57
+ "advertiserId": "advertiser_01JDH315KXW0FP82VY8WMV97YE",
58
+ "placementId": "placement_01JDGX7Z9JHJR8PN9HZJPDNFWA",
59
+ "templateId": "template_01JDKPBTZ611WAFQXYSNYMNXQ1",
60
+ "priority": "standard",
61
+ "language": "en",
62
+ "format": "native",
63
+ "effectiveStandardFormatKey": "branded_assets",
64
+ "effectiveStandardFormatVersion": 1,
65
+ "templateSource": "admoai_standard",
66
+ "assetContext": "vehicle_marker"
67
+ }
68
+ }
69
+ ]
70
+ }
71
+ ],
72
+ "errors": null,
73
+ "warnings": null
74
+ }
@@ -0,0 +1,59 @@
1
+ {
2
+ "success": true,
3
+ "data": [
4
+ {
5
+ "placement": "map_vehicles",
6
+ "creatives": [
7
+ {
8
+ "contents": [
9
+ {
10
+ "key": "branded_image",
11
+ "type": "image",
12
+ "value": "https://cdn.admoai.com/media/volta-car.png"
13
+ }
14
+ ],
15
+ "advertiser": {
16
+ "name": "Volta Coffee",
17
+ "legalName": "Volta Coffee SpA",
18
+ "logoUrl": "https://cdn.admoai.com/media/volta-logo.png"
19
+ },
20
+ "template": {
21
+ "key": "branded_assets",
22
+ "style": "branded_asset"
23
+ },
24
+ "tracking": {
25
+ "impressions": [
26
+ {
27
+ "key": "default",
28
+ "url": "https://api.admoai.com/v1/tracking?e=tok.branded_assets.minimal.impression"
29
+ }
30
+ ],
31
+ "clicks": [],
32
+ "custom": [
33
+ {
34
+ "key": "asset_tap",
35
+ "url": "https://api.admoai.com/v1/tracking?e=tok.branded_assets.minimal.asset_tap"
36
+ }
37
+ ]
38
+ },
39
+ "metadata": {
40
+ "adId": "ad_01JD5G0KWPJS27NVHD88PECDV3",
41
+ "creativeId": "creative_01JDNVFDYH4MJS4NEPTAW7BTG8",
42
+ "advertiserId": "advertiser_01JDH315KXW0FP82VY8WMV97YE",
43
+ "placementId": "placement_01JDGX7Z9JHJR8PN9HZJPDNFWA",
44
+ "templateId": "template_01JDZZDBFPJPN49AB9VF53KXKX",
45
+ "priority": "standard",
46
+ "language": "en",
47
+ "format": "native",
48
+ "effectiveStandardFormatKey": "branded_assets",
49
+ "effectiveStandardFormatVersion": 1,
50
+ "templateSource": "admoai_standard",
51
+ "assetContext": "vehicle_marker"
52
+ }
53
+ }
54
+ ]
55
+ }
56
+ ],
57
+ "errors": null,
58
+ "warnings": null
59
+ }
@@ -0,0 +1,78 @@
1
+ {
2
+ "success": true,
3
+ "data": [
4
+ {
5
+ "placement": "home_feed",
6
+ "creatives": [
7
+ {
8
+ "contents": [
9
+ {
10
+ "key": "image",
11
+ "type": "image",
12
+ "value": "https://cdn.admoai.com/media/volta-latte.jpg"
13
+ },
14
+ {
15
+ "key": "headline",
16
+ "type": "text",
17
+ "value": "Two lattes, one price"
18
+ },
19
+ {
20
+ "key": "destination_url",
21
+ "type": "url",
22
+ "value": "https://volta.example/menu"
23
+ },
24
+ {
25
+ "key": "promo_code",
26
+ "type": "text",
27
+ "value": "VOLTA2X1"
28
+ }
29
+ ],
30
+ "advertiser": {
31
+ "name": "Volta Coffee",
32
+ "legalName": "Volta Coffee SpA",
33
+ "logoUrl": "https://cdn.admoai.com/media/volta-logo.png"
34
+ },
35
+ "template": {
36
+ "key": "city_promo_display",
37
+ "style": "compact"
38
+ },
39
+ "tracking": {
40
+ "impressions": [
41
+ {
42
+ "key": "default",
43
+ "url": "https://api.admoai.com/v1/tracking?e=tok.card.derived.impression"
44
+ }
45
+ ],
46
+ "clicks": [
47
+ {
48
+ "key": "default",
49
+ "url": "https://api.admoai.com/v1/tracking?e=tok.card.derived.click"
50
+ }
51
+ ],
52
+ "custom": [
53
+ {
54
+ "key": "save_offer",
55
+ "url": "https://api.admoai.com/v1/tracking?e=tok.card.derived.save_offer"
56
+ }
57
+ ]
58
+ },
59
+ "metadata": {
60
+ "adId": "ad_01JDQA9PJQC1M206VCD5CCX4ZM",
61
+ "creativeId": "creative_01JDF9Z54P5KNER7PRNWGZB98F",
62
+ "advertiserId": "advertiser_01JDH315KXW0FP82VY8WMV97YE",
63
+ "placementId": "placement_01JDGX7Z9JHJR8PN9HZJPDNFWA",
64
+ "templateId": "template_01JD7MGVP04YN16MAY9WW89EVB",
65
+ "priority": "standard",
66
+ "language": "en",
67
+ "format": "native",
68
+ "effectiveStandardFormatKey": "card",
69
+ "effectiveStandardFormatVersion": 1,
70
+ "templateSource": "based_on_standard"
71
+ }
72
+ }
73
+ ]
74
+ }
75
+ ],
76
+ "errors": null,
77
+ "warnings": null
78
+ }
@@ -0,0 +1,83 @@
1
+ {
2
+ "success": true,
3
+ "data": [
4
+ {
5
+ "placement": "home_feed",
6
+ "creatives": [
7
+ {
8
+ "contents": [
9
+ {
10
+ "key": "image",
11
+ "type": "image",
12
+ "value": "https://cdn.admoai.com/media/volta-latte.jpg"
13
+ },
14
+ {
15
+ "key": "brand_logo",
16
+ "type": "image",
17
+ "value": "https://cdn.admoai.com/media/volta-logo.png"
18
+ },
19
+ {
20
+ "key": "headline",
21
+ "type": "text",
22
+ "value": "Two lattes, one price"
23
+ },
24
+ {
25
+ "key": "supporting_text",
26
+ "type": "text",
27
+ "value": "This week at every Volta in Santiago."
28
+ },
29
+ {
30
+ "key": "cta_text",
31
+ "type": "text",
32
+ "value": "See the menu"
33
+ },
34
+ {
35
+ "key": "destination_url",
36
+ "type": "url",
37
+ "value": "https://volta.example/menu"
38
+ }
39
+ ],
40
+ "advertiser": {
41
+ "name": "Volta Coffee",
42
+ "legalName": "Volta Coffee SpA",
43
+ "logoUrl": "https://cdn.admoai.com/media/volta-logo.png"
44
+ },
45
+ "template": {
46
+ "key": "card",
47
+ "style": "tall"
48
+ },
49
+ "tracking": {
50
+ "impressions": [
51
+ {
52
+ "key": "default",
53
+ "url": "https://api.admoai.com/v1/tracking?e=tok.card.full.impression"
54
+ }
55
+ ],
56
+ "clicks": [
57
+ {
58
+ "key": "default",
59
+ "url": "https://api.admoai.com/v1/tracking?e=tok.card.full.click"
60
+ }
61
+ ],
62
+ "custom": []
63
+ },
64
+ "metadata": {
65
+ "adId": "ad_01JDC69A0M6C0QGBF17PHDJ81B",
66
+ "creativeId": "creative_01JDJFV4GFKCR82452R7XXHX23",
67
+ "advertiserId": "advertiser_01JDH315KXW0FP82VY8WMV97YE",
68
+ "placementId": "placement_01JDGX7Z9JHJR8PN9HZJPDNFWA",
69
+ "templateId": "template_01JD19FWQSE5QZCVMVD705VQ89",
70
+ "priority": "standard",
71
+ "language": "en",
72
+ "format": "native",
73
+ "effectiveStandardFormatKey": "card",
74
+ "effectiveStandardFormatVersion": 1,
75
+ "templateSource": "admoai_standard"
76
+ }
77
+ }
78
+ ]
79
+ }
80
+ ],
81
+ "errors": null,
82
+ "warnings": null
83
+ }
@@ -0,0 +1,63 @@
1
+ {
2
+ "success": true,
3
+ "data": [
4
+ {
5
+ "placement": "home_feed",
6
+ "creatives": [
7
+ {
8
+ "contents": [
9
+ {
10
+ "key": "image",
11
+ "type": "image",
12
+ "value": "https://cdn.admoai.com/media/volta-latte.jpg"
13
+ },
14
+ {
15
+ "key": "destination_url",
16
+ "type": "url",
17
+ "value": "https://volta.example/menu"
18
+ }
19
+ ],
20
+ "advertiser": {
21
+ "name": "Volta Coffee",
22
+ "legalName": "Volta Coffee SpA",
23
+ "logoUrl": "https://cdn.admoai.com/media/volta-logo.png"
24
+ },
25
+ "template": {
26
+ "key": "card",
27
+ "style": "default"
28
+ },
29
+ "tracking": {
30
+ "impressions": [
31
+ {
32
+ "key": "default",
33
+ "url": "https://api.admoai.com/v1/tracking?e=tok.card.minimal.impression"
34
+ }
35
+ ],
36
+ "clicks": [
37
+ {
38
+ "key": "default",
39
+ "url": "https://api.admoai.com/v1/tracking?e=tok.card.minimal.click"
40
+ }
41
+ ],
42
+ "custom": []
43
+ },
44
+ "metadata": {
45
+ "adId": "ad_01JD0R43Z2P97HWMHKNQKAY7EN",
46
+ "creativeId": "creative_01JD5WRV1EZCS0CB082W50BVNR",
47
+ "advertiserId": "advertiser_01JDH315KXW0FP82VY8WMV97YE",
48
+ "placementId": "placement_01JDGX7Z9JHJR8PN9HZJPDNFWA",
49
+ "templateId": "template_01JD1V81MZ1C8PC6HYXYPBQA8R",
50
+ "priority": "standard",
51
+ "language": "en",
52
+ "format": "native",
53
+ "effectiveStandardFormatKey": "card",
54
+ "effectiveStandardFormatVersion": 1,
55
+ "templateSource": "admoai_standard"
56
+ }
57
+ }
58
+ ]
59
+ }
60
+ ],
61
+ "errors": null,
62
+ "warnings": null
63
+ }
@@ -0,0 +1,119 @@
1
+ {
2
+ "success": true,
3
+ "data": [
4
+ {
5
+ "placement": "home_feed",
6
+ "creatives": [
7
+ {
8
+ "contents": [
9
+ {
10
+ "key": "slides",
11
+ "type": "group",
12
+ "value": [
13
+ {
14
+ "slideId": "slide_01JDS1H8VEM0ABE2PQ0JY6S38W",
15
+ "position": 1,
16
+ "contents": [
17
+ {
18
+ "key": "image",
19
+ "type": "image",
20
+ "value": "https://cdn.admoai.com/media/slide-a.jpg"
21
+ },
22
+ {
23
+ "key": "destination_url",
24
+ "type": "url",
25
+ "value": "https://volta.example/a"
26
+ }
27
+ ],
28
+ "tracking": {
29
+ "views": [
30
+ {
31
+ "key": "slide_view",
32
+ "url": "https://api.admoai.com/v1/tracking?e=tok.carousel.derived.slide1.slide_view"
33
+ }
34
+ ],
35
+ "clicks": [
36
+ {
37
+ "key": "default",
38
+ "url": "https://api.admoai.com/v1/tracking?e=tok.carousel.derived.slide1.click"
39
+ }
40
+ ]
41
+ }
42
+ },
43
+ {
44
+ "slideId": "slide_01JDDGXJE0JDBY21Y9KEJDD54A",
45
+ "position": 2,
46
+ "contents": [
47
+ {
48
+ "key": "image",
49
+ "type": "image",
50
+ "value": "https://cdn.admoai.com/media/slide-b.jpg"
51
+ },
52
+ {
53
+ "key": "destination_url",
54
+ "type": "url",
55
+ "value": "https://volta.example/b"
56
+ }
57
+ ],
58
+ "tracking": {
59
+ "views": [
60
+ {
61
+ "key": "slide_view",
62
+ "url": "https://api.admoai.com/v1/tracking?e=tok.carousel.derived.slide2.slide_view"
63
+ }
64
+ ],
65
+ "clicks": [
66
+ {
67
+ "key": "default",
68
+ "url": "https://api.admoai.com/v1/tracking?e=tok.carousel.derived.slide2.click"
69
+ }
70
+ ]
71
+ }
72
+ }
73
+ ]
74
+ },
75
+ {
76
+ "key": "promo_code",
77
+ "type": "text",
78
+ "value": "VOLTA2X1"
79
+ }
80
+ ],
81
+ "advertiser": {
82
+ "name": "Volta Coffee",
83
+ "legalName": "Volta Coffee SpA",
84
+ "logoUrl": "https://cdn.admoai.com/media/volta-logo.png"
85
+ },
86
+ "template": {
87
+ "key": "city_carousel",
88
+ "style": "carousel"
89
+ },
90
+ "tracking": {
91
+ "impressions": [
92
+ {
93
+ "key": "default",
94
+ "url": "https://api.admoai.com/v1/tracking?e=tok.carousel.derived.impression"
95
+ }
96
+ ],
97
+ "clicks": [],
98
+ "custom": []
99
+ },
100
+ "metadata": {
101
+ "adId": "ad_01JD849HTYNJ7SX6H5JRBKZ069",
102
+ "creativeId": "creative_01JDS1H8VEM0ABE2PQ0JY6S38W",
103
+ "advertiserId": "advertiser_01JDH315KXW0FP82VY8WMV97YE",
104
+ "placementId": "placement_01JDGX7Z9JHJR8PN9HZJPDNFWA",
105
+ "templateId": "template_01JDDGXJE0JDBY21Y9KEJDD54A",
106
+ "priority": "standard",
107
+ "language": "en",
108
+ "format": "native",
109
+ "effectiveStandardFormatKey": "carousel",
110
+ "effectiveStandardFormatVersion": 1,
111
+ "templateSource": "based_on_standard"
112
+ }
113
+ }
114
+ ]
115
+ }
116
+ ],
117
+ "errors": null,
118
+ "warnings": null
119
+ }