@firedrill-tools/netsuite 0.1.2

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.
Files changed (92) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +214 -0
  3. package/firedrill/agent.target.json +16 -0
  4. package/firedrill/baseline.scenario.json +6905 -0
  5. package/firedrill/concurrency-limited.scenario.json +11 -0
  6. package/firedrill/conformance.suite.json +21 -0
  7. package/firedrill/ns-analytics.drill.json +73 -0
  8. package/firedrill/ns-concurrency.drill.json +53 -0
  9. package/firedrill/ns-default-identity.drill.json +43 -0
  10. package/firedrill/ns-denied.drill.json +38 -0
  11. package/firedrill/ns-insufficient-permission.drill.json +53 -0
  12. package/firedrill/ns-invalid-login.drill.json +53 -0
  13. package/firedrill/ns-order-to-cash.drill.json +93 -0
  14. package/firedrill/ns-record-locked.drill.json +53 -0
  15. package/firedrill/ns-records.drill.json +68 -0
  16. package/firedrill/ns-role-ar-clerk.drill.json +58 -0
  17. package/firedrill/ns-role-sales-rep.drill.json +58 -0
  18. package/firedrill/ns-subsidiary-scope.drill.json +58 -0
  19. package/firedrill/ns-tight-limits.drill.json +58 -0
  20. package/firedrill/ns-transform-lost.drill.json +63 -0
  21. package/firedrill/ns-write-outage.drill.json +63 -0
  22. package/firedrill/record-locked.scenario.json +11 -0
  23. package/firedrill/tight-limits.scenario.json +17 -0
  24. package/firedrill/tools/netsuite/app/assets/ATTRIBUTION.md +37 -0
  25. package/firedrill/tools/netsuite/app/assets/fonts/LICENSE.txt +92 -0
  26. package/firedrill/tools/netsuite/app/assets/oracle-netsuite.svg +1 -0
  27. package/firedrill/tools/netsuite/app/assets/oracle.svg +1 -0
  28. package/firedrill/tools/netsuite/app/site/app.js +182 -0
  29. package/firedrill/tools/netsuite/app/site/assets/fonts/open-sans-latin-ext.woff2 +0 -0
  30. package/firedrill/tools/netsuite/app/site/assets/fonts/open-sans-latin.woff2 +0 -0
  31. package/firedrill/tools/netsuite/app/site/assets/oracle-netsuite.svg +1 -0
  32. package/firedrill/tools/netsuite/app/site/assets/oracle.svg +1 -0
  33. package/firedrill/tools/netsuite/app/site/icons.js +59 -0
  34. package/firedrill/tools/netsuite/app/site/index.html +68 -0
  35. package/firedrill/tools/netsuite/app/site/menus.js +111 -0
  36. package/firedrill/tools/netsuite/app/site/overlay.js +121 -0
  37. package/firedrill/tools/netsuite/app/site/store.js +95 -0
  38. package/firedrill/tools/netsuite/app/site/styles/base.css +131 -0
  39. package/firedrill/tools/netsuite/app/site/styles/chrome.css +183 -0
  40. package/firedrill/tools/netsuite/app/site/styles/pages.css +134 -0
  41. package/firedrill/tools/netsuite/app/site/styles/tables.css +92 -0
  42. package/firedrill/tools/netsuite/app/site/ui.js +119 -0
  43. package/firedrill/tools/netsuite/app/site/views/common.js +134 -0
  44. package/firedrill/tools/netsuite/app/site/views/customer-form.js +152 -0
  45. package/firedrill/tools/netsuite/app/site/views/customer.js +147 -0
  46. package/firedrill/tools/netsuite/app/site/views/customers.js +111 -0
  47. package/firedrill/tools/netsuite/app/site/views/home-chrome.js +75 -0
  48. package/firedrill/tools/netsuite/app/site/views/home-data.js +153 -0
  49. package/firedrill/tools/netsuite/app/site/views/home.js +162 -0
  50. package/firedrill/tools/netsuite/app/site/views/invoice-new.js +131 -0
  51. package/firedrill/tools/netsuite/app/site/views/invoice.js +232 -0
  52. package/firedrill/tools/netsuite/app/site/views/invoices.js +99 -0
  53. package/firedrill/tools/netsuite/app/site/views/items.js +95 -0
  54. package/firedrill/tools/netsuite/app/site/views/order-new.js +154 -0
  55. package/firedrill/tools/netsuite/app/site/views/order.js +214 -0
  56. package/firedrill/tools/netsuite/app/site/views/orders.js +93 -0
  57. package/firedrill/tools/netsuite/app/site/views/payments.js +65 -0
  58. package/firedrill/tools/netsuite/app/site/views/pickers.js +117 -0
  59. package/firedrill/tools/netsuite/app/site/views/subsidiaries.js +40 -0
  60. package/firedrill/tools/netsuite/app/site/views/suiteql.js +81 -0
  61. package/firedrill/tools/netsuite/behavior.mjs +13 -0
  62. package/firedrill/tools/netsuite/lib/body.mjs +185 -0
  63. package/firedrill/tools/netsuite/lib/collections.mjs +202 -0
  64. package/firedrill/tools/netsuite/lib/errors.mjs +91 -0
  65. package/firedrill/tools/netsuite/lib/handlers-meta.mjs +100 -0
  66. package/firedrill/tools/netsuite/lib/handlers-read.mjs +141 -0
  67. package/firedrill/tools/netsuite/lib/handlers-session.mjs +52 -0
  68. package/firedrill/tools/netsuite/lib/handlers-write.mjs +6 -0
  69. package/firedrill/tools/netsuite/lib/metadata.mjs +148 -0
  70. package/firedrill/tools/netsuite/lib/primitives.mjs +105 -0
  71. package/firedrill/tools/netsuite/lib/project-tran.mjs +153 -0
  72. package/firedrill/tools/netsuite/lib/project.mjs +178 -0
  73. package/firedrill/tools/netsuite/lib/q.mjs +280 -0
  74. package/firedrill/tools/netsuite/lib/session.mjs +188 -0
  75. package/firedrill/tools/netsuite/lib/suiteql-parse.mjs +382 -0
  76. package/firedrill/tools/netsuite/lib/suiteql-run.mjs +270 -0
  77. package/firedrill/tools/netsuite/lib/suiteql-select.mjs +118 -0
  78. package/firedrill/tools/netsuite/lib/suiteql-tables.mjs +162 -0
  79. package/firedrill/tools/netsuite/lib/tran.mjs +133 -0
  80. package/firedrill/tools/netsuite/lib/wire-decode.mjs +107 -0
  81. package/firedrill/tools/netsuite/lib/wire.mjs +228 -0
  82. package/firedrill/tools/netsuite/lib/write-customer.mjs +181 -0
  83. package/firedrill/tools/netsuite/lib/write-invoice.mjs +319 -0
  84. package/firedrill/tools/netsuite/lib/write-order.mjs +269 -0
  85. package/firedrill/tools/netsuite/netsuite.tool.json +4888 -0
  86. package/firedrill/transform-response-lost.scenario.json +11 -0
  87. package/firedrill/world.json +7711 -0
  88. package/firedrill/write-outage.scenario.json +11 -0
  89. package/firedrill.json +5 -0
  90. package/package.json +52 -0
  91. package/starter.json +6904 -0
  92. package/test/conformance.mjs +701 -0
@@ -0,0 +1,11 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "concurrency-limited",
4
+ "title": "Seeded account with the concurrency-limit fault active",
5
+ "faults": [
6
+ {
7
+ "packageId": "netsuite",
8
+ "faultId": "concurrency-limit"
9
+ }
10
+ ]
11
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "conformance",
4
+ "drills": [
5
+ "ns-records",
6
+ "ns-order-to-cash",
7
+ "ns-analytics",
8
+ "ns-role-ar-clerk",
9
+ "ns-role-sales-rep",
10
+ "ns-subsidiary-scope",
11
+ "ns-default-identity",
12
+ "ns-denied",
13
+ "ns-invalid-login",
14
+ "ns-insufficient-permission",
15
+ "ns-concurrency",
16
+ "ns-write-outage",
17
+ "ns-record-locked",
18
+ "ns-transform-lost",
19
+ "ns-tight-limits"
20
+ ]
21
+ }
@@ -0,0 +1,73 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "ns-analytics",
4
+ "title": "SuiteQL, the MCP-shaped record read and the metadata catalog",
5
+ "targetId": "conformance-agent",
6
+ "scenarioId": "baseline",
7
+ "actorId": "administrator",
8
+ "task": {
9
+ "instruction": "Run the analytics conformance flow against the synthetic NetSuite Tool and fail loudly on any unexpected status or body."
10
+ },
11
+ "assertions": [
12
+ {
13
+ "id": "suiteql-ok",
14
+ "kind": "operation.count",
15
+ "operation": {
16
+ "packageId": "netsuite",
17
+ "operationId": "suiteql.query"
18
+ },
19
+ "outcomes": [
20
+ "ok"
21
+ ],
22
+ "comparison": {
23
+ "operator": "greater_than_or_equal",
24
+ "value": 1
25
+ }
26
+ },
27
+ {
28
+ "id": "suiteql-run-ok",
29
+ "kind": "operation.count",
30
+ "operation": {
31
+ "packageId": "netsuite",
32
+ "operationId": "suiteql.run"
33
+ },
34
+ "outcomes": [
35
+ "ok"
36
+ ],
37
+ "comparison": {
38
+ "operator": "greater_than_or_equal",
39
+ "value": 1
40
+ }
41
+ },
42
+ {
43
+ "id": "record-get-ok",
44
+ "kind": "operation.count",
45
+ "operation": {
46
+ "packageId": "netsuite",
47
+ "operationId": "record.get"
48
+ },
49
+ "outcomes": [
50
+ "ok"
51
+ ],
52
+ "comparison": {
53
+ "operator": "greater_than_or_equal",
54
+ "value": 1
55
+ }
56
+ },
57
+ {
58
+ "id": "metadata-ok",
59
+ "kind": "operation.count",
60
+ "operation": {
61
+ "packageId": "netsuite",
62
+ "operationId": "record.metadata"
63
+ },
64
+ "outcomes": [
65
+ "ok"
66
+ ],
67
+ "comparison": {
68
+ "operator": "greater_than_or_equal",
69
+ "value": 2
70
+ }
71
+ }
72
+ ]
73
+ }
@@ -0,0 +1,53 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "ns-concurrency",
4
+ "title": "The concurrency limit blocks every operation",
5
+ "targetId": "conformance-agent",
6
+ "scenarioId": "concurrency-limited",
7
+ "actorId": "administrator",
8
+ "task": {
9
+ "instruction": "Run the concurrency conformance flow against the synthetic NetSuite Tool and fail loudly on any unexpected status or body."
10
+ },
11
+ "assertions": [
12
+ {
13
+ "id": "list-429",
14
+ "kind": "operation.count",
15
+ "operation": {
16
+ "packageId": "netsuite",
17
+ "operationId": "customer.list"
18
+ },
19
+ "outcomes": [
20
+ "tool_error"
21
+ ],
22
+ "comparison": {
23
+ "operator": "greater_than_or_equal",
24
+ "value": 1
25
+ }
26
+ },
27
+ {
28
+ "id": "transform-429",
29
+ "kind": "operation.count",
30
+ "operation": {
31
+ "packageId": "netsuite",
32
+ "operationId": "sales-order.transform"
33
+ },
34
+ "outcomes": [
35
+ "tool_error"
36
+ ],
37
+ "comparison": {
38
+ "operator": "greater_than_or_equal",
39
+ "value": 1
40
+ }
41
+ },
42
+ {
43
+ "id": "invoices-unchanged",
44
+ "kind": "state.count",
45
+ "packageId": "netsuite",
46
+ "namespace": "invoices",
47
+ "comparison": {
48
+ "operator": "equals",
49
+ "value": 11
50
+ }
51
+ }
52
+ ]
53
+ }
@@ -0,0 +1,43 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "ns-default-identity",
4
+ "title": "An actor with no NetSuite attributes acts as the seeded administrator",
5
+ "targetId": "conformance-agent",
6
+ "scenarioId": "baseline",
7
+ "actorId": "fresh",
8
+ "task": {
9
+ "instruction": "Run the default-identity conformance flow against the synthetic NetSuite Tool and fail loudly on any unexpected status or body."
10
+ },
11
+ "assertions": [
12
+ {
13
+ "id": "list-ok",
14
+ "kind": "operation.count",
15
+ "operation": {
16
+ "packageId": "netsuite",
17
+ "operationId": "customer.list"
18
+ },
19
+ "outcomes": [
20
+ "ok"
21
+ ],
22
+ "comparison": {
23
+ "operator": "greater_than_or_equal",
24
+ "value": 1
25
+ }
26
+ },
27
+ {
28
+ "id": "create-ok",
29
+ "kind": "operation.count",
30
+ "operation": {
31
+ "packageId": "netsuite",
32
+ "operationId": "customer.create"
33
+ },
34
+ "outcomes": [
35
+ "ok"
36
+ ],
37
+ "comparison": {
38
+ "operator": "greater_than_or_equal",
39
+ "value": 1
40
+ }
41
+ }
42
+ ]
43
+ }
@@ -0,0 +1,38 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "ns-denied",
4
+ "title": "An actor without grants is denied by the framework",
5
+ "targetId": "conformance-agent",
6
+ "scenarioId": "baseline",
7
+ "actorId": "no-grants",
8
+ "task": {
9
+ "instruction": "Run the denied conformance flow against the synthetic NetSuite Tool and fail loudly on any unexpected status or body."
10
+ },
11
+ "assertions": [
12
+ {
13
+ "id": "list-denied",
14
+ "kind": "operation.count",
15
+ "operation": {
16
+ "packageId": "netsuite",
17
+ "operationId": "customer.list"
18
+ },
19
+ "outcomes": [
20
+ "denied"
21
+ ],
22
+ "comparison": {
23
+ "operator": "greater_than_or_equal",
24
+ "value": 1
25
+ }
26
+ },
27
+ {
28
+ "id": "customers-unchanged",
29
+ "kind": "state.count",
30
+ "packageId": "netsuite",
31
+ "namespace": "customers",
32
+ "comparison": {
33
+ "operator": "equals",
34
+ "value": 12
35
+ }
36
+ }
37
+ ]
38
+ }
@@ -0,0 +1,53 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "ns-insufficient-permission",
4
+ "title": "A role with no permissions fails every operation",
5
+ "targetId": "conformance-agent",
6
+ "scenarioId": "baseline",
7
+ "actorId": "restricted",
8
+ "task": {
9
+ "instruction": "Run the insufficient-permission conformance flow against the synthetic NetSuite Tool and fail loudly on any unexpected status or body."
10
+ },
11
+ "assertions": [
12
+ {
13
+ "id": "list-403",
14
+ "kind": "operation.count",
15
+ "operation": {
16
+ "packageId": "netsuite",
17
+ "operationId": "customer.list"
18
+ },
19
+ "outcomes": [
20
+ "tool_error"
21
+ ],
22
+ "comparison": {
23
+ "operator": "greater_than_or_equal",
24
+ "value": 1
25
+ }
26
+ },
27
+ {
28
+ "id": "metadata-403",
29
+ "kind": "operation.count",
30
+ "operation": {
31
+ "packageId": "netsuite",
32
+ "operationId": "record.metadata"
33
+ },
34
+ "outcomes": [
35
+ "tool_error"
36
+ ],
37
+ "comparison": {
38
+ "operator": "greater_than_or_equal",
39
+ "value": 1
40
+ }
41
+ },
42
+ {
43
+ "id": "customers-unchanged",
44
+ "kind": "state.count",
45
+ "packageId": "netsuite",
46
+ "namespace": "customers",
47
+ "comparison": {
48
+ "operator": "equals",
49
+ "value": 12
50
+ }
51
+ }
52
+ ]
53
+ }
@@ -0,0 +1,53 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "ns-invalid-login",
4
+ "title": "A token issued for another account fails every operation",
5
+ "targetId": "conformance-agent",
6
+ "scenarioId": "baseline",
7
+ "actorId": "wrong-account",
8
+ "task": {
9
+ "instruction": "Run the invalid-login conformance flow against the synthetic NetSuite Tool and fail loudly on any unexpected status or body."
10
+ },
11
+ "assertions": [
12
+ {
13
+ "id": "list-401",
14
+ "kind": "operation.count",
15
+ "operation": {
16
+ "packageId": "netsuite",
17
+ "operationId": "customer.list"
18
+ },
19
+ "outcomes": [
20
+ "tool_error"
21
+ ],
22
+ "comparison": {
23
+ "operator": "greater_than_or_equal",
24
+ "value": 1
25
+ }
26
+ },
27
+ {
28
+ "id": "create-401",
29
+ "kind": "operation.count",
30
+ "operation": {
31
+ "packageId": "netsuite",
32
+ "operationId": "customer.create"
33
+ },
34
+ "outcomes": [
35
+ "tool_error"
36
+ ],
37
+ "comparison": {
38
+ "operator": "greater_than_or_equal",
39
+ "value": 1
40
+ }
41
+ },
42
+ {
43
+ "id": "customers-unchanged",
44
+ "kind": "state.count",
45
+ "packageId": "netsuite",
46
+ "namespace": "customers",
47
+ "comparison": {
48
+ "operator": "equals",
49
+ "value": 12
50
+ }
51
+ }
52
+ ]
53
+ }
@@ -0,0 +1,93 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "ns-order-to-cash",
4
+ "title": "Quote to cash: order, billing transform and payment",
5
+ "targetId": "conformance-agent",
6
+ "scenarioId": "baseline",
7
+ "actorId": "administrator",
8
+ "task": {
9
+ "instruction": "Run the order-to-cash conformance flow against the synthetic NetSuite Tool and fail loudly on any unexpected status or body."
10
+ },
11
+ "assertions": [
12
+ {
13
+ "id": "order-created",
14
+ "kind": "operation.count",
15
+ "operation": {
16
+ "packageId": "netsuite",
17
+ "operationId": "sales-order.create"
18
+ },
19
+ "outcomes": [
20
+ "ok"
21
+ ],
22
+ "comparison": {
23
+ "operator": "greater_than_or_equal",
24
+ "value": 1
25
+ }
26
+ },
27
+ {
28
+ "id": "order-billed",
29
+ "kind": "operation.count",
30
+ "operation": {
31
+ "packageId": "netsuite",
32
+ "operationId": "sales-order.transform"
33
+ },
34
+ "outcomes": [
35
+ "ok"
36
+ ],
37
+ "comparison": {
38
+ "operator": "greater_than_or_equal",
39
+ "value": 1
40
+ }
41
+ },
42
+ {
43
+ "id": "payment-taken",
44
+ "kind": "operation.count",
45
+ "operation": {
46
+ "packageId": "netsuite",
47
+ "operationId": "invoice.transform"
48
+ },
49
+ "outcomes": [
50
+ "ok"
51
+ ],
52
+ "comparison": {
53
+ "operator": "greater_than_or_equal",
54
+ "value": 1
55
+ }
56
+ },
57
+ {
58
+ "id": "customer-deleted",
59
+ "kind": "operation.count",
60
+ "operation": {
61
+ "packageId": "netsuite",
62
+ "operationId": "customer.delete"
63
+ },
64
+ "outcomes": [
65
+ "ok"
66
+ ],
67
+ "comparison": {
68
+ "operator": "greater_than_or_equal",
69
+ "value": 1
70
+ }
71
+ },
72
+ {
73
+ "id": "invoices-grew",
74
+ "kind": "state.count",
75
+ "packageId": "netsuite",
76
+ "namespace": "invoices",
77
+ "comparison": {
78
+ "operator": "greater_than_or_equal",
79
+ "value": 13
80
+ }
81
+ },
82
+ {
83
+ "id": "payments-grew",
84
+ "kind": "state.count",
85
+ "packageId": "netsuite",
86
+ "namespace": "customer-payments",
87
+ "comparison": {
88
+ "operator": "greater_than_or_equal",
89
+ "value": 6
90
+ }
91
+ }
92
+ ]
93
+ }
@@ -0,0 +1,53 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "ns-record-locked",
4
+ "title": "A concurrent change blocks edits and transforms",
5
+ "targetId": "conformance-agent",
6
+ "scenarioId": "record-locked",
7
+ "actorId": "administrator",
8
+ "task": {
9
+ "instruction": "Run the record-locked conformance flow against the synthetic NetSuite Tool and fail loudly on any unexpected status or body."
10
+ },
11
+ "assertions": [
12
+ {
13
+ "id": "update-409",
14
+ "kind": "operation.count",
15
+ "operation": {
16
+ "packageId": "netsuite",
17
+ "operationId": "customer.update"
18
+ },
19
+ "outcomes": [
20
+ "tool_error"
21
+ ],
22
+ "comparison": {
23
+ "operator": "greater_than_or_equal",
24
+ "value": 1
25
+ }
26
+ },
27
+ {
28
+ "id": "transform-409",
29
+ "kind": "operation.count",
30
+ "operation": {
31
+ "packageId": "netsuite",
32
+ "operationId": "sales-order.transform"
33
+ },
34
+ "outcomes": [
35
+ "tool_error"
36
+ ],
37
+ "comparison": {
38
+ "operator": "greater_than_or_equal",
39
+ "value": 1
40
+ }
41
+ },
42
+ {
43
+ "id": "invoices-unchanged",
44
+ "kind": "state.count",
45
+ "packageId": "netsuite",
46
+ "namespace": "invoices",
47
+ "comparison": {
48
+ "operator": "equals",
49
+ "value": 11
50
+ }
51
+ }
52
+ ]
53
+ }
@@ -0,0 +1,68 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "ns-records",
4
+ "title": "Read every NetSuite record collection and record",
5
+ "targetId": "conformance-agent",
6
+ "scenarioId": "baseline",
7
+ "actorId": "administrator",
8
+ "task": {
9
+ "instruction": "Run the records conformance flow against the synthetic NetSuite Tool and fail loudly on any unexpected status or body."
10
+ },
11
+ "assertions": [
12
+ {
13
+ "id": "customer-list-ok",
14
+ "kind": "operation.count",
15
+ "operation": {
16
+ "packageId": "netsuite",
17
+ "operationId": "customer.list"
18
+ },
19
+ "outcomes": [
20
+ "ok"
21
+ ],
22
+ "comparison": {
23
+ "operator": "greater_than_or_equal",
24
+ "value": 1
25
+ }
26
+ },
27
+ {
28
+ "id": "customer-get-ok",
29
+ "kind": "operation.count",
30
+ "operation": {
31
+ "packageId": "netsuite",
32
+ "operationId": "customer.get"
33
+ },
34
+ "outcomes": [
35
+ "ok"
36
+ ],
37
+ "comparison": {
38
+ "operator": "greater_than_or_equal",
39
+ "value": 1
40
+ }
41
+ },
42
+ {
43
+ "id": "read-errors",
44
+ "kind": "operation.count",
45
+ "operation": {
46
+ "packageId": "netsuite",
47
+ "operationId": "customer.get"
48
+ },
49
+ "outcomes": [
50
+ "tool_error"
51
+ ],
52
+ "comparison": {
53
+ "operator": "greater_than_or_equal",
54
+ "value": 3
55
+ }
56
+ },
57
+ {
58
+ "id": "customers-unchanged",
59
+ "kind": "state.count",
60
+ "packageId": "netsuite",
61
+ "namespace": "customers",
62
+ "comparison": {
63
+ "operator": "equals",
64
+ "value": 12
65
+ }
66
+ }
67
+ ]
68
+ }
@@ -0,0 +1,58 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "ns-role-ar-clerk",
4
+ "title": "The A/R clerk role may bill but not sell or delete",
5
+ "targetId": "conformance-agent",
6
+ "scenarioId": "baseline",
7
+ "actorId": "ar-clerk",
8
+ "task": {
9
+ "instruction": "Run the role-ar-clerk conformance flow against the synthetic NetSuite Tool and fail loudly on any unexpected status or body."
10
+ },
11
+ "assertions": [
12
+ {
13
+ "id": "order-create-denied",
14
+ "kind": "operation.count",
15
+ "operation": {
16
+ "packageId": "netsuite",
17
+ "operationId": "sales-order.create"
18
+ },
19
+ "outcomes": [
20
+ "tool_error"
21
+ ],
22
+ "comparison": {
23
+ "operator": "greater_than_or_equal",
24
+ "value": 1
25
+ }
26
+ },
27
+ {
28
+ "id": "delete-denied",
29
+ "kind": "operation.count",
30
+ "operation": {
31
+ "packageId": "netsuite",
32
+ "operationId": "customer.delete"
33
+ },
34
+ "outcomes": [
35
+ "tool_error"
36
+ ],
37
+ "comparison": {
38
+ "operator": "greater_than_or_equal",
39
+ "value": 1
40
+ }
41
+ },
42
+ {
43
+ "id": "payment-allowed",
44
+ "kind": "operation.count",
45
+ "operation": {
46
+ "packageId": "netsuite",
47
+ "operationId": "invoice.transform"
48
+ },
49
+ "outcomes": [
50
+ "ok"
51
+ ],
52
+ "comparison": {
53
+ "operator": "greater_than_or_equal",
54
+ "value": 1
55
+ }
56
+ }
57
+ ]
58
+ }
@@ -0,0 +1,58 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "id": "ns-role-sales-rep",
4
+ "title": "The sales rep role may sell but not see invoices",
5
+ "targetId": "conformance-agent",
6
+ "scenarioId": "baseline",
7
+ "actorId": "sales-rep",
8
+ "task": {
9
+ "instruction": "Run the role-sales-rep conformance flow against the synthetic NetSuite Tool and fail loudly on any unexpected status or body."
10
+ },
11
+ "assertions": [
12
+ {
13
+ "id": "invoice-list-denied",
14
+ "kind": "operation.count",
15
+ "operation": {
16
+ "packageId": "netsuite",
17
+ "operationId": "invoice.list"
18
+ },
19
+ "outcomes": [
20
+ "tool_error"
21
+ ],
22
+ "comparison": {
23
+ "operator": "greater_than_or_equal",
24
+ "value": 1
25
+ }
26
+ },
27
+ {
28
+ "id": "suiteql-denied",
29
+ "kind": "operation.count",
30
+ "operation": {
31
+ "packageId": "netsuite",
32
+ "operationId": "suiteql.query"
33
+ },
34
+ "outcomes": [
35
+ "tool_error"
36
+ ],
37
+ "comparison": {
38
+ "operator": "greater_than_or_equal",
39
+ "value": 1
40
+ }
41
+ },
42
+ {
43
+ "id": "order-created",
44
+ "kind": "operation.count",
45
+ "operation": {
46
+ "packageId": "netsuite",
47
+ "operationId": "sales-order.create"
48
+ },
49
+ "outcomes": [
50
+ "ok"
51
+ ],
52
+ "comparison": {
53
+ "operator": "greater_than_or_equal",
54
+ "value": 1
55
+ }
56
+ }
57
+ ]
58
+ }