handoffprobe 0.1.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.
Files changed (295) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +533 -0
  3. package/dist/attacks/index.d.ts +3 -0
  4. package/dist/attacks/index.d.ts.map +1 -0
  5. package/dist/attacks/index.js +3 -0
  6. package/dist/attacks/index.js.map +1 -0
  7. package/dist/attacks/p0/approval.d.ts +5 -0
  8. package/dist/attacks/p0/approval.d.ts.map +1 -0
  9. package/dist/attacks/p0/approval.js +121 -0
  10. package/dist/attacks/p0/approval.js.map +1 -0
  11. package/dist/attacks/p0/authorization.d.ts +6 -0
  12. package/dist/attacks/p0/authorization.d.ts.map +1 -0
  13. package/dist/attacks/p0/authorization.js +241 -0
  14. package/dist/attacks/p0/authorization.js.map +1 -0
  15. package/dist/attacks/p0/credentials.d.ts +10 -0
  16. package/dist/attacks/p0/credentials.d.ts.map +1 -0
  17. package/dist/attacks/p0/credentials.js +206 -0
  18. package/dist/attacks/p0/credentials.js.map +1 -0
  19. package/dist/attacks/p0/identity.d.ts +10 -0
  20. package/dist/attacks/p0/identity.d.ts.map +1 -0
  21. package/dist/attacks/p0/identity.js +200 -0
  22. package/dist/attacks/p0/identity.js.map +1 -0
  23. package/dist/attacks/p0/index.d.ts +9 -0
  24. package/dist/attacks/p0/index.d.ts.map +1 -0
  25. package/dist/attacks/p0/index.js +9 -0
  26. package/dist/attacks/p0/index.js.map +1 -0
  27. package/dist/attacks/p0/lifecycle.d.ts +6 -0
  28. package/dist/attacks/p0/lifecycle.d.ts.map +1 -0
  29. package/dist/attacks/p0/lifecycle.js +142 -0
  30. package/dist/attacks/p0/lifecycle.js.map +1 -0
  31. package/dist/attacks/p0/target.d.ts +11 -0
  32. package/dist/attacks/p0/target.d.ts.map +1 -0
  33. package/dist/attacks/p0/target.js +177 -0
  34. package/dist/attacks/p0/target.js.map +1 -0
  35. package/dist/attacks/p0/tenant.d.ts +10 -0
  36. package/dist/attacks/p0/tenant.d.ts.map +1 -0
  37. package/dist/attacks/p0/tenant.js +155 -0
  38. package/dist/attacks/p0/tenant.js.map +1 -0
  39. package/dist/attacks/p0/types.d.ts +9 -0
  40. package/dist/attacks/p0/types.d.ts.map +1 -0
  41. package/dist/attacks/p0/types.js +2 -0
  42. package/dist/attacks/p0/types.js.map +1 -0
  43. package/dist/attacks/p1/approval.d.ts +5 -0
  44. package/dist/attacks/p1/approval.d.ts.map +1 -0
  45. package/dist/attacks/p1/approval.js +259 -0
  46. package/dist/attacks/p1/approval.js.map +1 -0
  47. package/dist/attacks/p1/audit.d.ts +4 -0
  48. package/dist/attacks/p1/audit.d.ts.map +1 -0
  49. package/dist/attacks/p1/audit.js +128 -0
  50. package/dist/attacks/p1/audit.js.map +1 -0
  51. package/dist/attacks/p1/authorization.d.ts +5 -0
  52. package/dist/attacks/p1/authorization.d.ts.map +1 -0
  53. package/dist/attacks/p1/authorization.js +239 -0
  54. package/dist/attacks/p1/authorization.js.map +1 -0
  55. package/dist/attacks/p1/index.d.ts +7 -0
  56. package/dist/attacks/p1/index.d.ts.map +1 -0
  57. package/dist/attacks/p1/index.js +7 -0
  58. package/dist/attacks/p1/index.js.map +1 -0
  59. package/dist/attacks/p1/race.d.ts +5 -0
  60. package/dist/attacks/p1/race.d.ts.map +1 -0
  61. package/dist/attacks/p1/race.js +255 -0
  62. package/dist/attacks/p1/race.js.map +1 -0
  63. package/dist/attacks/p1/replay.d.ts +6 -0
  64. package/dist/attacks/p1/replay.d.ts.map +1 -0
  65. package/dist/attacks/p1/replay.js +285 -0
  66. package/dist/attacks/p1/replay.js.map +1 -0
  67. package/dist/attacks/p1/types.d.ts +28 -0
  68. package/dist/attacks/p1/types.d.ts.map +1 -0
  69. package/dist/attacks/p1/types.js +2 -0
  70. package/dist/attacks/p1/types.js.map +1 -0
  71. package/dist/cli/config.d.ts +15 -0
  72. package/dist/cli/config.d.ts.map +1 -0
  73. package/dist/cli/config.js +100 -0
  74. package/dist/cli/config.js.map +1 -0
  75. package/dist/cli/diagnostics.d.ts +4 -0
  76. package/dist/cli/diagnostics.d.ts.map +1 -0
  77. package/dist/cli/diagnostics.js +23 -0
  78. package/dist/cli/diagnostics.js.map +1 -0
  79. package/dist/cli/discovery.d.ts +3 -0
  80. package/dist/cli/discovery.d.ts.map +1 -0
  81. package/dist/cli/discovery.js +75 -0
  82. package/dist/cli/discovery.js.map +1 -0
  83. package/dist/cli/execution-catalog.d.ts +12 -0
  84. package/dist/cli/execution-catalog.d.ts.map +1 -0
  85. package/dist/cli/execution-catalog.js +76 -0
  86. package/dist/cli/execution-catalog.js.map +1 -0
  87. package/dist/cli/protocols.d.ts +6 -0
  88. package/dist/cli/protocols.d.ts.map +1 -0
  89. package/dist/cli/protocols.js +6 -0
  90. package/dist/cli/protocols.js.map +1 -0
  91. package/dist/cli/reporters.d.ts +7 -0
  92. package/dist/cli/reporters.d.ts.map +1 -0
  93. package/dist/cli/reporters.js +126 -0
  94. package/dist/cli/reporters.js.map +1 -0
  95. package/dist/cli/run-cli.d.ts +6 -0
  96. package/dist/cli/run-cli.d.ts.map +1 -0
  97. package/dist/cli/run-cli.js +243 -0
  98. package/dist/cli/run-cli.js.map +1 -0
  99. package/dist/cli/test-command.d.ts +29 -0
  100. package/dist/cli/test-command.d.ts.map +1 -0
  101. package/dist/cli/test-command.js +118 -0
  102. package/dist/cli/test-command.js.map +1 -0
  103. package/dist/cli.d.ts +3 -0
  104. package/dist/cli.d.ts.map +1 -0
  105. package/dist/cli.js +11 -0
  106. package/dist/cli.js.map +1 -0
  107. package/dist/core/adapters.d.ts +23 -0
  108. package/dist/core/adapters.d.ts.map +1 -0
  109. package/dist/core/adapters.js +2 -0
  110. package/dist/core/adapters.js.map +1 -0
  111. package/dist/core/attacks.d.ts +29 -0
  112. package/dist/core/attacks.d.ts.map +1 -0
  113. package/dist/core/attacks.js +38 -0
  114. package/dist/core/attacks.js.map +1 -0
  115. package/dist/core/errors.d.ts +16 -0
  116. package/dist/core/errors.d.ts.map +1 -0
  117. package/dist/core/errors.js +22 -0
  118. package/dist/core/errors.js.map +1 -0
  119. package/dist/core/evidence.d.ts +18 -0
  120. package/dist/core/evidence.d.ts.map +1 -0
  121. package/dist/core/evidence.js +2 -0
  122. package/dist/core/evidence.js.map +1 -0
  123. package/dist/core/findings.d.ts +25 -0
  124. package/dist/core/findings.d.ts.map +1 -0
  125. package/dist/core/findings.js +4 -0
  126. package/dist/core/findings.js.map +1 -0
  127. package/dist/core/index.d.ts +10 -0
  128. package/dist/core/index.d.ts.map +1 -0
  129. package/dist/core/index.js +10 -0
  130. package/dist/core/index.js.map +1 -0
  131. package/dist/core/provenance.d.ts +8 -0
  132. package/dist/core/provenance.d.ts.map +1 -0
  133. package/dist/core/provenance.js +2 -0
  134. package/dist/core/provenance.js.map +1 -0
  135. package/dist/core/redaction.d.ts +4 -0
  136. package/dist/core/redaction.d.ts.map +1 -0
  137. package/dist/core/redaction.js +59 -0
  138. package/dist/core/redaction.js.map +1 -0
  139. package/dist/core/runner.d.ts +42 -0
  140. package/dist/core/runner.d.ts.map +1 -0
  141. package/dist/core/runner.js +181 -0
  142. package/dist/core/runner.js.map +1 -0
  143. package/dist/core/security-context.d.ts +64 -0
  144. package/dist/core/security-context.d.ts.map +1 -0
  145. package/dist/core/security-context.js +56 -0
  146. package/dist/core/security-context.js.map +1 -0
  147. package/dist/github-action/core.d.ts +34 -0
  148. package/dist/github-action/core.d.ts.map +1 -0
  149. package/dist/github-action/core.js +118 -0
  150. package/dist/github-action/core.js.map +1 -0
  151. package/dist/github-action/run-action.d.ts +2 -0
  152. package/dist/github-action/run-action.d.ts.map +1 -0
  153. package/dist/github-action/run-action.js +112 -0
  154. package/dist/github-action/run-action.js.map +1 -0
  155. package/dist/index.d.ts +6 -0
  156. package/dist/index.d.ts.map +1 -0
  157. package/dist/index.js +6 -0
  158. package/dist/index.js.map +1 -0
  159. package/dist/p0-fixture/a2a/executor.d.ts +22 -0
  160. package/dist/p0-fixture/a2a/executor.d.ts.map +1 -0
  161. package/dist/p0-fixture/a2a/executor.js +183 -0
  162. package/dist/p0-fixture/a2a/executor.js.map +1 -0
  163. package/dist/p0-fixture/a2a/harness.d.ts +16 -0
  164. package/dist/p0-fixture/a2a/harness.d.ts.map +1 -0
  165. package/dist/p0-fixture/a2a/harness.js +160 -0
  166. package/dist/p0-fixture/a2a/harness.js.map +1 -0
  167. package/dist/p0-fixture/authorization.d.ts +24 -0
  168. package/dist/p0-fixture/authorization.d.ts.map +1 -0
  169. package/dist/p0-fixture/authorization.js +66 -0
  170. package/dist/p0-fixture/authorization.js.map +1 -0
  171. package/dist/p0-fixture/constants.d.ts +17 -0
  172. package/dist/p0-fixture/constants.d.ts.map +1 -0
  173. package/dist/p0-fixture/constants.js +17 -0
  174. package/dist/p0-fixture/constants.js.map +1 -0
  175. package/dist/p0-fixture/handoff/adapter.d.ts +6 -0
  176. package/dist/p0-fixture/handoff/adapter.d.ts.map +1 -0
  177. package/dist/p0-fixture/handoff/adapter.js +8 -0
  178. package/dist/p0-fixture/handoff/adapter.js.map +1 -0
  179. package/dist/p0-fixture/index.d.ts +11 -0
  180. package/dist/p0-fixture/index.d.ts.map +1 -0
  181. package/dist/p0-fixture/index.js +11 -0
  182. package/dist/p0-fixture/index.js.map +1 -0
  183. package/dist/p0-fixture/mcp/fake-tools.d.ts +7 -0
  184. package/dist/p0-fixture/mcp/fake-tools.d.ts.map +1 -0
  185. package/dist/p0-fixture/mcp/fake-tools.js +322 -0
  186. package/dist/p0-fixture/mcp/fake-tools.js.map +1 -0
  187. package/dist/p0-fixture/mcp/harness.d.ts +16 -0
  188. package/dist/p0-fixture/mcp/harness.d.ts.map +1 -0
  189. package/dist/p0-fixture/mcp/harness.js +114 -0
  190. package/dist/p0-fixture/mcp/harness.js.map +1 -0
  191. package/dist/p0-fixture/mcp/types.d.ts +29 -0
  192. package/dist/p0-fixture/mcp/types.d.ts.map +1 -0
  193. package/dist/p0-fixture/mcp/types.js +2 -0
  194. package/dist/p0-fixture/mcp/types.js.map +1 -0
  195. package/dist/p0-fixture/payload-hash.d.ts +2 -0
  196. package/dist/p0-fixture/payload-hash.d.ts.map +1 -0
  197. package/dist/p0-fixture/payload-hash.js +20 -0
  198. package/dist/p0-fixture/payload-hash.js.map +1 -0
  199. package/dist/p0-fixture/reference.d.ts +8 -0
  200. package/dist/p0-fixture/reference.d.ts.map +1 -0
  201. package/dist/p0-fixture/reference.js +42 -0
  202. package/dist/p0-fixture/reference.js.map +1 -0
  203. package/dist/p0-fixture/scenario.d.ts +14 -0
  204. package/dist/p0-fixture/scenario.d.ts.map +1 -0
  205. package/dist/p0-fixture/scenario.js +22 -0
  206. package/dist/p0-fixture/scenario.js.map +1 -0
  207. package/dist/p0-fixture/state.d.ts +43 -0
  208. package/dist/p0-fixture/state.d.ts.map +1 -0
  209. package/dist/p0-fixture/state.js +85 -0
  210. package/dist/p0-fixture/state.js.map +1 -0
  211. package/dist/p0-fixture/target-adapter.d.ts +20 -0
  212. package/dist/p0-fixture/target-adapter.d.ts.map +1 -0
  213. package/dist/p0-fixture/target-adapter.js +62 -0
  214. package/dist/p0-fixture/target-adapter.js.map +1 -0
  215. package/dist/p1-fixture/approval-target-adapter.d.ts +47 -0
  216. package/dist/p1-fixture/approval-target-adapter.d.ts.map +1 -0
  217. package/dist/p1-fixture/approval-target-adapter.js +172 -0
  218. package/dist/p1-fixture/approval-target-adapter.js.map +1 -0
  219. package/dist/p1-fixture/audit-target-adapter.d.ts +36 -0
  220. package/dist/p1-fixture/audit-target-adapter.d.ts.map +1 -0
  221. package/dist/p1-fixture/audit-target-adapter.js +226 -0
  222. package/dist/p1-fixture/audit-target-adapter.js.map +1 -0
  223. package/dist/p1-fixture/barrier.d.ts +10 -0
  224. package/dist/p1-fixture/barrier.d.ts.map +1 -0
  225. package/dist/p1-fixture/barrier.js +44 -0
  226. package/dist/p1-fixture/barrier.js.map +1 -0
  227. package/dist/p1-fixture/clock.d.ts +7 -0
  228. package/dist/p1-fixture/clock.d.ts.map +1 -0
  229. package/dist/p1-fixture/clock.js +30 -0
  230. package/dist/p1-fixture/clock.js.map +1 -0
  231. package/dist/p1-fixture/index.d.ts +9 -0
  232. package/dist/p1-fixture/index.d.ts.map +1 -0
  233. package/dist/p1-fixture/index.js +9 -0
  234. package/dist/p1-fixture/index.js.map +1 -0
  235. package/dist/p1-fixture/race-target-adapter.d.ts +49 -0
  236. package/dist/p1-fixture/race-target-adapter.d.ts.map +1 -0
  237. package/dist/p1-fixture/race-target-adapter.js +384 -0
  238. package/dist/p1-fixture/race-target-adapter.js.map +1 -0
  239. package/dist/p1-fixture/replay-target-adapter.d.ts +44 -0
  240. package/dist/p1-fixture/replay-target-adapter.d.ts.map +1 -0
  241. package/dist/p1-fixture/replay-target-adapter.js +248 -0
  242. package/dist/p1-fixture/replay-target-adapter.js.map +1 -0
  243. package/dist/p1-fixture/state.d.ts +78 -0
  244. package/dist/p1-fixture/state.d.ts.map +1 -0
  245. package/dist/p1-fixture/state.js +191 -0
  246. package/dist/p1-fixture/state.js.map +1 -0
  247. package/dist/p1-fixture/target-adapter.d.ts +30 -0
  248. package/dist/p1-fixture/target-adapter.d.ts.map +1 -0
  249. package/dist/p1-fixture/target-adapter.js +142 -0
  250. package/dist/p1-fixture/target-adapter.js.map +1 -0
  251. package/dist/protocol-lab/a2a/executor.d.ts +13 -0
  252. package/dist/protocol-lab/a2a/executor.d.ts.map +1 -0
  253. package/dist/protocol-lab/a2a/executor.js +112 -0
  254. package/dist/protocol-lab/a2a/executor.js.map +1 -0
  255. package/dist/protocol-lab/a2a/harness.d.ts +11 -0
  256. package/dist/protocol-lab/a2a/harness.d.ts.map +1 -0
  257. package/dist/protocol-lab/a2a/harness.js +160 -0
  258. package/dist/protocol-lab/a2a/harness.js.map +1 -0
  259. package/dist/protocol-lab/evidence.d.ts +17 -0
  260. package/dist/protocol-lab/evidence.d.ts.map +1 -0
  261. package/dist/protocol-lab/evidence.js +28 -0
  262. package/dist/protocol-lab/evidence.js.map +1 -0
  263. package/dist/protocol-lab/fixture.d.ts +11 -0
  264. package/dist/protocol-lab/fixture.d.ts.map +1 -0
  265. package/dist/protocol-lab/fixture.js +54 -0
  266. package/dist/protocol-lab/fixture.js.map +1 -0
  267. package/dist/protocol-lab/handoff/adapter.d.ts +9 -0
  268. package/dist/protocol-lab/handoff/adapter.d.ts.map +1 -0
  269. package/dist/protocol-lab/handoff/adapter.js +13 -0
  270. package/dist/protocol-lab/handoff/adapter.js.map +1 -0
  271. package/dist/protocol-lab/handoff/translate.d.ts +3 -0
  272. package/dist/protocol-lab/handoff/translate.d.ts.map +1 -0
  273. package/dist/protocol-lab/handoff/translate.js +14 -0
  274. package/dist/protocol-lab/handoff/translate.js.map +1 -0
  275. package/dist/protocol-lab/mcp/fake-tools.d.ts +5 -0
  276. package/dist/protocol-lab/mcp/fake-tools.d.ts.map +1 -0
  277. package/dist/protocol-lab/mcp/fake-tools.js +58 -0
  278. package/dist/protocol-lab/mcp/fake-tools.js.map +1 -0
  279. package/dist/protocol-lab/mcp/harness.d.ts +7 -0
  280. package/dist/protocol-lab/mcp/harness.d.ts.map +1 -0
  281. package/dist/protocol-lab/mcp/harness.js +97 -0
  282. package/dist/protocol-lab/mcp/harness.js.map +1 -0
  283. package/dist/protocol-lab/models.d.ts +31 -0
  284. package/dist/protocol-lab/models.d.ts.map +1 -0
  285. package/dist/protocol-lab/models.js +2 -0
  286. package/dist/protocol-lab/models.js.map +1 -0
  287. package/dist/protocol-lab/run.d.ts +2 -0
  288. package/dist/protocol-lab/run.d.ts.map +1 -0
  289. package/dist/protocol-lab/run.js +22 -0
  290. package/dist/protocol-lab/run.js.map +1 -0
  291. package/dist/protocol-lab/target-adapter.d.ts +10 -0
  292. package/dist/protocol-lab/target-adapter.d.ts.map +1 -0
  293. package/dist/protocol-lab/target-adapter.js +33 -0
  294. package/dist/protocol-lab/target-adapter.js.map +1 -0
  295. package/package.json +77 -0
@@ -0,0 +1,155 @@
1
+ import { cloneSecurityContext } from '../../core/index.js';
2
+ import { P0_AUTHORIZED_TENANT, P0_CAPABILITY_UPDATE, P0_UNAUTHORIZED_RESOURCE, P0_UNAUTHORIZED_TENANT, createP0ReferenceContext, createP0UpdateInvoiceScenario, } from '../../p0-fixture/index.js';
3
+ function createUpdateAuthorizedContext() {
4
+ const context = createP0ReferenceContext();
5
+ if (context.upstreamAuthority === undefined || context.effectiveAuthority === undefined) {
6
+ throw new Error('HP-TENANT-001 requires authority bindings.');
7
+ }
8
+ context.capabilities = [P0_CAPABILITY_UPDATE];
9
+ context.upstreamAuthority.capabilities = [P0_CAPABILITY_UPDATE];
10
+ context.effectiveAuthority.capabilities = [P0_CAPABILITY_UPDATE];
11
+ return context;
12
+ }
13
+ function evidenceSequences(result) {
14
+ return result.evidence
15
+ .filter((event) => ['handoff.translate', 'p0.authorization', 'p0.tool.result'].includes(event.event))
16
+ .map((event) => event.sequence);
17
+ }
18
+ function executedInvoiceTenant(result) {
19
+ const output = result.output;
20
+ const value = output.mcpResult.envelope.output;
21
+ if (typeof value !== 'object' || value === null || !('invoice' in value)) {
22
+ return undefined;
23
+ }
24
+ const invoice = value.invoice;
25
+ if (typeof invoice !== 'object' || invoice === null || !('tenant' in invoice)) {
26
+ return undefined;
27
+ }
28
+ const tenant = invoice.tenant;
29
+ return typeof tenant === 'string' ? tenant : undefined;
30
+ }
31
+ function evaluateTenantMutation(result) {
32
+ const output = result.output;
33
+ const envelope = output.mcpResult.envelope;
34
+ const authorization = envelope.authorization;
35
+ const before = envelope.before.sideEffectCounter;
36
+ const after = envelope.after.sideEffectCounter;
37
+ const sequences = evidenceSequences(result);
38
+ if (authorization.invariantAllowed) {
39
+ return {
40
+ status: 'inconclusive',
41
+ observedBehavior: 'The tenant mutation did not produce an invalid tenant-bound authorization state.',
42
+ evidenceSequences: sequences,
43
+ };
44
+ }
45
+ if (!authorization.executed && after === before) {
46
+ return {
47
+ status: 'pass',
48
+ observedBehavior: 'The tenant-context mutation was rejected and no protected synthetic state changed.',
49
+ evidenceSequences: sequences,
50
+ };
51
+ }
52
+ if (authorization.executed && after > before) {
53
+ const tenant = executedInvoiceTenant(result);
54
+ const actualCrossTenant = tenant === P0_UNAUTHORIZED_TENANT;
55
+ return {
56
+ status: 'fail',
57
+ severity: actualCrossTenant ? 'critical' : 'high',
58
+ observedBehavior: actualCrossTenant
59
+ ? 'Authority originating in tenant:acme executed a protected mutation against a tenant:globex invoice.'
60
+ : 'A protected synthetic action executed after tenant context was lost.',
61
+ evidenceSequences: sequences,
62
+ };
63
+ }
64
+ return {
65
+ status: 'inconclusive',
66
+ observedBehavior: 'Tenant evidence and synthetic side-effect state could not establish a deterministic PASS or FAIL.',
67
+ evidenceSequences: sequences,
68
+ };
69
+ }
70
+ const TENANT_DEFINITION = {
71
+ id: 'HP-TENANT-001',
72
+ name: 'Tenant context loss or substitution',
73
+ category: 'tenant',
74
+ defaultSeverity: 'high',
75
+ priority: 'P0',
76
+ preconditions: [
77
+ 'Upstream authority originates in tenant:acme.',
78
+ 'The fixture contains an alternate tenant:globex resource.',
79
+ ],
80
+ mutationSteps: [
81
+ 'Variant A removes the tenant binding during handoff translation.',
82
+ 'Variant B substitutes tenant:acme with tenant:globex and targets the Globex invoice.',
83
+ ],
84
+ expectedInvariant: 'Authority from one tenant must not authorize another tenant.',
85
+ evidenceRequirements: [
86
+ 'upstream tenant',
87
+ 'translated tenant',
88
+ 'requested resource',
89
+ 'authorization result',
90
+ 'resulting resource data or state',
91
+ ],
92
+ applicability: {
93
+ a2a: ['1.0'],
94
+ mcp: ['2026-07-28'],
95
+ },
96
+ propertyClass: 'composition_responsibility',
97
+ sourceReferences: [
98
+ {
99
+ kind: 'project',
100
+ title: 'P0 Security Test Specification',
101
+ locator: 'docs/P0_TEST_SPECIFICATION.md#hp-tenant-001--tenant-context-loss-or-substitution',
102
+ },
103
+ ],
104
+ sideEffectClass: 'synthetic',
105
+ destructive: false,
106
+ };
107
+ const TENANT_CASE = {
108
+ definition: TENANT_DEFINITION,
109
+ evaluate: evaluateTenantMutation,
110
+ };
111
+ class LoseTenantContextAdapter {
112
+ id = 'p0-tenant-001:loss';
113
+ translate(context) {
114
+ const translated = cloneSecurityContext(context);
115
+ if (translated.effectiveAuthority === undefined) {
116
+ throw new Error('HP-TENANT-001 loss variant requires effective authority.');
117
+ }
118
+ translated.tenant = '';
119
+ translated.effectiveAuthority.tenant = '';
120
+ return translated;
121
+ }
122
+ }
123
+ class SubstituteTenantAdapter {
124
+ id = 'p0-tenant-001:substitution';
125
+ translate(context) {
126
+ const translated = cloneSecurityContext(context);
127
+ if (translated.effectiveAuthority === undefined) {
128
+ throw new Error('HP-TENANT-001 substitution variant requires effective authority.');
129
+ }
130
+ translated.tenant = P0_UNAUTHORIZED_TENANT;
131
+ translated.resource = P0_UNAUTHORIZED_RESOURCE;
132
+ translated.effectiveAuthority.tenant = P0_UNAUTHORIZED_TENANT;
133
+ translated.effectiveAuthority.resources = [P0_UNAUTHORIZED_RESOURCE];
134
+ return translated;
135
+ }
136
+ }
137
+ export const HP_TENANT_001_LOSS = {
138
+ attack: TENANT_CASE,
139
+ scenario: createP0UpdateInvoiceScenario(25001),
140
+ handoffAdapter: new LoseTenantContextAdapter(),
141
+ createContext: createUpdateAuthorizedContext,
142
+ };
143
+ export const HP_TENANT_001 = {
144
+ attack: TENANT_CASE,
145
+ scenario: createP0UpdateInvoiceScenario(25002),
146
+ handoffAdapter: new SubstituteTenantAdapter(),
147
+ createContext: createUpdateAuthorizedContext,
148
+ };
149
+ export const P0_TENANT_001_VARIANTS = [HP_TENANT_001_LOSS, HP_TENANT_001];
150
+ export const P0_TENANT_BASELINE = {
151
+ authorized: P0_AUTHORIZED_TENANT,
152
+ unauthorized: P0_UNAUTHORIZED_TENANT,
153
+ unauthorizedResource: P0_UNAUTHORIZED_RESOURCE,
154
+ };
155
+ //# sourceMappingURL=tenant.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant.js","sourceRoot":"","sources":["../../../src/attacks/p0/tenant.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { AttackCase, HandoffAdapter, SecurityContext } from '../../core/index.js';
2
+ import type { P0Scenario } from '../../p0-fixture/index.js';
3
+ export interface P0AttackPlan {
4
+ attack: AttackCase;
5
+ scenario: P0Scenario;
6
+ handoffAdapter: HandoffAdapter;
7
+ createContext(): SecurityContext;
8
+ }
9
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/attacks/p0/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEvF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE5D,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,UAAU,CAAC;IACrB,cAAc,EAAE,cAAc,CAAC;IAE/B,aAAa,IAAI,eAAe,CAAC;CAClC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/attacks/p0/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ import type { P1ApprovalAttackPlan } from './types.js';
2
+ export declare const HP_APPROVAL_002: P1ApprovalAttackPlan;
3
+ export declare const HP_APPROVAL_003: P1ApprovalAttackPlan;
4
+ export declare const P1_APPROVAL_ATTACKS: readonly P1ApprovalAttackPlan[];
5
+ //# sourceMappingURL=approval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval.d.ts","sourceRoot":"","sources":["../../../src/attacks/p1/approval.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AA0VvD,eAAO,MAAM,eAAe,EAAE,oBA4B7B,CAAC;AAEF,eAAO,MAAM,eAAe,EAAE,oBA0C7B,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,SAAS,oBAAoB,EAG9D,CAAC"}
@@ -0,0 +1,259 @@
1
+ import { P0_APPROVAL_ID, P0_APPROVED_REFUND_PAYLOAD, P0_AUTHORIZED_RESOURCE, P0_AUTHORIZED_TENANT, P0_CAPABILITY_REFUND, P0_CAPABILITY_UPDATE, createP0ReferenceContext, hashApprovalPayload, } from '../../p0-fixture/index.js';
2
+ const P1_APPROVAL_ALT_RESOURCE = 'invoice:INV-1003';
3
+ const P1_APPROVAL_UPDATE_ID = 'approval:update-invoice-1001';
4
+ const APPROVED_UPDATE_PAYLOAD = {
5
+ amountCents: 15000,
6
+ };
7
+ function projectSources(section) {
8
+ return [
9
+ {
10
+ kind: 'project',
11
+ title: 'P1 Security Test Specification',
12
+ locator: `docs/P1_TEST_SPECIFICATION.md#${section}`,
13
+ },
14
+ {
15
+ kind: 'project',
16
+ title: 'Attack Catalog',
17
+ locator: 'docs/ATTACK_CATALOG.md#v01-p1--add-after-p0-engine-is-credible',
18
+ },
19
+ ];
20
+ }
21
+ function createDefinition(input) {
22
+ return {
23
+ id: input.id,
24
+ name: input.name,
25
+ category: 'approval',
26
+ defaultSeverity: 'high',
27
+ priority: 'P1',
28
+ preconditions: input.preconditions,
29
+ mutationSteps: input.mutationSteps,
30
+ expectedInvariant: input.invariant,
31
+ evidenceRequirements: input.evidence,
32
+ applicability: {
33
+ a2a: ['1.0'],
34
+ mcp: ['2026-07-28'],
35
+ },
36
+ propertyClass: 'composition_responsibility',
37
+ sourceReferences: projectSources(input.section),
38
+ sideEffectClass: 'synthetic',
39
+ destructive: false,
40
+ };
41
+ }
42
+ function createUpdateScenario(id, resource, amountCents) {
43
+ return {
44
+ id,
45
+ tool: 'update_invoice',
46
+ buildArguments() {
47
+ return {
48
+ resource,
49
+ amountCents,
50
+ };
51
+ },
52
+ };
53
+ }
54
+ function createToolSubstitutionContext() {
55
+ const context = createP0ReferenceContext();
56
+ if (context.upstreamAuthority === undefined || context.effectiveAuthority === undefined) {
57
+ throw new Error('HP-APPROVAL-002 requires authority bindings.');
58
+ }
59
+ /*
60
+ * Both actions are allowed by
61
+ * ordinary authority.
62
+ *
63
+ * Therefore approval/tool binding
64
+ * is the property under test.
65
+ */
66
+ context.capabilities = [P0_CAPABILITY_REFUND, P0_CAPABILITY_UPDATE];
67
+ context.upstreamAuthority.capabilities = [P0_CAPABILITY_REFUND, P0_CAPABILITY_UPDATE];
68
+ context.effectiveAuthority.capabilities = [P0_CAPABILITY_REFUND, P0_CAPABILITY_UPDATE];
69
+ return context;
70
+ }
71
+ function createResourceReuseContext() {
72
+ const context = createP0ReferenceContext();
73
+ if (context.upstreamAuthority === undefined || context.effectiveAuthority === undefined) {
74
+ throw new Error('HP-APPROVAL-003 requires authority bindings.');
75
+ }
76
+ /*
77
+ * Both invoices belong to the same
78
+ * synthetic Acme tenant and are
79
+ * authorized normally.
80
+ *
81
+ * Only consent remains resource-bound
82
+ * to INV-1001.
83
+ */
84
+ context.resource = P1_APPROVAL_ALT_RESOURCE;
85
+ context.capabilities = [P0_CAPABILITY_UPDATE];
86
+ context.upstreamAuthority.resources = [P0_AUTHORIZED_RESOURCE, P1_APPROVAL_ALT_RESOURCE];
87
+ context.effectiveAuthority.resources = [P0_AUTHORIZED_RESOURCE, P1_APPROVAL_ALT_RESOURCE];
88
+ context.upstreamAuthority.capabilities = [P0_CAPABILITY_UPDATE];
89
+ context.effectiveAuthority.capabilities = [P0_CAPABILITY_UPDATE];
90
+ context.approval = {
91
+ approvalId: P1_APPROVAL_UPDATE_ID,
92
+ tool: 'update_invoice',
93
+ /*
94
+ * Resource binding is explicit
95
+ * in the P1 approval record.
96
+ * Keep this hash resource-neutral
97
+ * so the test isolates the
98
+ * resource binding itself.
99
+ */
100
+ payloadHash: hashApprovalPayload(APPROVED_UPDATE_PAYLOAD),
101
+ };
102
+ return context;
103
+ }
104
+ function relevantEvidenceSequences(result) {
105
+ const names = new Set([
106
+ 'p1.approval.binding',
107
+ 'p1.approval.blocked',
108
+ 'p1.approval.bypassed',
109
+ 'handoff.translate',
110
+ 'p0.authorization',
111
+ 'mcp.tool.call',
112
+ 'mcp.tool.result',
113
+ 'p0.tool.result',
114
+ ]);
115
+ return result.evidence.filter((event) => names.has(event.event)).map((event) => event.sequence);
116
+ }
117
+ function evaluateApprovalMismatch(result, messages) {
118
+ const output = result.output;
119
+ const evidenceSequences = relevantEvidenceSequences(result);
120
+ if (output.decision.allowed) {
121
+ return {
122
+ status: 'inconclusive',
123
+ observedBehavior: 'The intended approval mutation did not create an invalid approval binding.',
124
+ evidenceSequences,
125
+ };
126
+ }
127
+ const sideEffectDelta = output.sideEffectCounterAfter - output.sideEffectCounterBefore;
128
+ if (!output.executed && sideEffectDelta === 0) {
129
+ return {
130
+ status: 'pass',
131
+ observedBehavior: messages.pass,
132
+ evidenceSequences,
133
+ };
134
+ }
135
+ if (output.executed && sideEffectDelta === 1) {
136
+ return {
137
+ status: 'fail',
138
+ observedBehavior: messages.fail,
139
+ evidenceSequences,
140
+ };
141
+ }
142
+ return {
143
+ status: 'inconclusive',
144
+ observedBehavior: 'Approval and synthetic side-effect evidence could not establish a deterministic PASS or FAIL.',
145
+ evidenceSequences,
146
+ };
147
+ }
148
+ const APPROVAL_002_DEFINITION = createDefinition({
149
+ id: 'HP-APPROVAL-002',
150
+ name: 'Tool substitution after approval',
151
+ preconditions: [
152
+ 'A protected refund_payment action has valid consent.',
153
+ 'Ordinary authority also permits update_invoice so approval/tool binding can be tested independently.',
154
+ ],
155
+ mutationSteps: [
156
+ 'Keep the original approval ID and approved payload hash.',
157
+ 'Replace the selected downstream tool with update_invoice.',
158
+ 'Attempt the protected update using the original refund approval.',
159
+ ],
160
+ invariant: 'Approval bound to one tool must not authorize a different protected tool.',
161
+ evidence: [
162
+ 'approval ID',
163
+ 'approved tool',
164
+ 'executed tool',
165
+ 'approved payload hash',
166
+ 'translated context',
167
+ 'approval decision',
168
+ 'synthetic side-effect state',
169
+ ],
170
+ section: 'hp-approval-002--tool-substitution-after-approval',
171
+ });
172
+ const APPROVAL_003_DEFINITION = createDefinition({
173
+ id: 'HP-APPROVAL-003',
174
+ name: 'Approval reuse for another resource',
175
+ preconditions: [
176
+ 'A protected update is approved for invoice:INV-1001.',
177
+ 'A second same-tenant synthetic invoice exists and ordinary authority permits both resources.',
178
+ ],
179
+ mutationSteps: [
180
+ 'Keep the same approval ID and approved action.',
181
+ 'Change the execution resource from invoice:INV-1001 to invoice:INV-1003.',
182
+ 'Attempt the protected update without new consent.',
183
+ ],
184
+ invariant: 'Resource-bound approval must remain bound to the resource that was actually approved.',
185
+ evidence: [
186
+ 'approval ID',
187
+ 'approved resource',
188
+ 'executed resource',
189
+ 'approved payload hash',
190
+ 'approval decision',
191
+ 'resource version before and after',
192
+ 'synthetic side-effect state',
193
+ ],
194
+ section: 'hp-approval-003--approval-reuse-for-another-resource',
195
+ });
196
+ const APPROVAL_002_CASE = {
197
+ definition: APPROVAL_002_DEFINITION,
198
+ evaluate(result) {
199
+ return evaluateApprovalMismatch(result, {
200
+ pass: 'The substituted update_invoice tool was rejected because consent was issued for refund_payment.',
201
+ fail: 'update_invoice executed using approval that was issued for refund_payment.',
202
+ });
203
+ },
204
+ };
205
+ const APPROVAL_003_CASE = {
206
+ definition: APPROVAL_003_DEFINITION,
207
+ evaluate(result) {
208
+ return evaluateApprovalMismatch(result, {
209
+ pass: 'The second invoice was rejected because approval remained bound to invoice:INV-1001.',
210
+ fail: 'The protected update executed against invoice:INV-1003 using approval issued for invoice:INV-1001.',
211
+ });
212
+ },
213
+ };
214
+ export const HP_APPROVAL_002 = {
215
+ attack: APPROVAL_002_CASE,
216
+ scenario: {
217
+ id: 'approval-tool-substitution',
218
+ approval: {
219
+ approvalId: P0_APPROVAL_ID,
220
+ approvedTool: 'refund_payment',
221
+ approvedResource: P0_AUTHORIZED_RESOURCE,
222
+ approvedPayloadHash: hashApprovalPayload(P0_APPROVED_REFUND_PAYLOAD),
223
+ },
224
+ executedTool: 'update_invoice',
225
+ executedResource: P0_AUTHORIZED_RESOURCE,
226
+ p0Scenario: createUpdateScenario('p1-approval-tool-substitution', P0_AUTHORIZED_RESOURCE, 15000),
227
+ },
228
+ createContext: createToolSubstitutionContext,
229
+ };
230
+ export const HP_APPROVAL_003 = {
231
+ attack: APPROVAL_003_CASE,
232
+ scenario: {
233
+ id: 'approval-resource-reuse',
234
+ approval: {
235
+ approvalId: P1_APPROVAL_UPDATE_ID,
236
+ approvedTool: 'update_invoice',
237
+ approvedResource: P0_AUTHORIZED_RESOURCE,
238
+ approvedPayloadHash: hashApprovalPayload(APPROVED_UPDATE_PAYLOAD),
239
+ },
240
+ executedTool: 'update_invoice',
241
+ executedResource: P1_APPROVAL_ALT_RESOURCE,
242
+ seedInvoices: [
243
+ {
244
+ resource: P1_APPROVAL_ALT_RESOURCE,
245
+ tenant: P0_AUTHORIZED_TENANT,
246
+ amountCents: 9900,
247
+ currency: 'EUR',
248
+ version: 1,
249
+ },
250
+ ],
251
+ p0Scenario: createUpdateScenario('p1-approval-resource-reuse', P1_APPROVAL_ALT_RESOURCE, APPROVED_UPDATE_PAYLOAD.amountCents),
252
+ },
253
+ createContext: createResourceReuseContext,
254
+ };
255
+ export const P1_APPROVAL_ATTACKS = [
256
+ HP_APPROVAL_002,
257
+ HP_APPROVAL_003,
258
+ ];
259
+ //# sourceMappingURL=approval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval.js","sourceRoot":"","sources":["../../../src/attacks/p1/approval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { P1AuditAttackPlan } from './types.js';
2
+ export declare const HP_AUDIT_001: P1AuditAttackPlan;
3
+ export declare const P1_AUDIT_ATTACKS: readonly P1AuditAttackPlan[];
4
+ //# sourceMappingURL=audit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../../src/attacks/p1/audit.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AA+IpD,eAAO,MAAM,YAAY,EAAE,iBAa1B,CAAC;AAEF,eAAO,MAAM,gBAAgB,EAAE,SAAS,iBAAiB,EAAmB,CAAC"}
@@ -0,0 +1,128 @@
1
+ import { P0_CAPABILITY_UPDATE, createP0ReferenceContext, createP0UpdateInvoiceScenario, } from '../../p0-fixture/index.js';
2
+ const AUDIT_TASK_ID = 'task:P1-AUDIT-1001';
3
+ function createAuditContext() {
4
+ const context = createP0ReferenceContext();
5
+ if (context.upstreamAuthority === undefined || context.effectiveAuthority === undefined) {
6
+ throw new Error('HP-AUDIT-001 requires authority bindings.');
7
+ }
8
+ context.capabilities = [P0_CAPABILITY_UPDATE];
9
+ context.upstreamAuthority.capabilities = [P0_CAPABILITY_UPDATE];
10
+ context.effectiveAuthority.capabilities = [P0_CAPABILITY_UPDATE];
11
+ context.lifecycle = {
12
+ taskId: AUDIT_TASK_ID,
13
+ state: 'active',
14
+ };
15
+ return context;
16
+ }
17
+ function relevantEvidenceSequences(result) {
18
+ const relevant = new Set([
19
+ 'p1.audit.baseline',
20
+ 'p1.audit.lineage_mutation',
21
+ 'p1.audit.blocked',
22
+ 'p1.audit.bypassed',
23
+ 'a2a.receiver.receive',
24
+ 'handoff.translate',
25
+ 'mcp.tool.call',
26
+ 'mcp.tool.result',
27
+ 'p1.audit.final',
28
+ ]);
29
+ return result.evidence
30
+ .filter((event) => relevant.has(event.event))
31
+ .map((event) => event.sequence);
32
+ }
33
+ function evaluate(result) {
34
+ const output = result.output;
35
+ const evidenceSequences = relevantEvidenceSequences(result);
36
+ if (output.lineageReconstructable || output.translatedHasTaskBinding) {
37
+ return {
38
+ status: 'inconclusive',
39
+ observedBehavior: 'The intended audit mutation did not remove the mandatory governing task binding.',
40
+ evidenceSequences,
41
+ };
42
+ }
43
+ const delta = output.sideEffectCounterAfter - output.sideEffectCounterBefore;
44
+ if (!output.executed && delta === 0) {
45
+ return {
46
+ status: 'pass',
47
+ observedBehavior: 'The protected action was rejected when mandatory accountable task lineage was missing.',
48
+ evidenceSequences,
49
+ };
50
+ }
51
+ if (output.executed && output.sideEffectId !== null && delta === 1) {
52
+ return {
53
+ status: 'fail',
54
+ observedBehavior: 'A protected synthetic side effect executed after the handoff lost the mandatory governing task lineage.',
55
+ evidenceSequences,
56
+ };
57
+ }
58
+ return {
59
+ status: 'inconclusive',
60
+ observedBehavior: 'Audit-lineage evidence could not establish a deterministic PASS or FAIL.',
61
+ evidenceSequences,
62
+ };
63
+ }
64
+ const DEFINITION = {
65
+ id: 'HP-AUDIT-001',
66
+ name: 'Cross-protocol audit lineage break',
67
+ category: 'audit',
68
+ defaultSeverity: 'medium',
69
+ priority: 'P1',
70
+ preconditions: [
71
+ 'A protected synthetic update has a trustworthy original principal and governing task.',
72
+ 'The A2A to MCP handoff requires accountable task lineage.',
73
+ ],
74
+ mutationSteps: [
75
+ 'Retain normal authority while removing the governing task binding at the handoff.',
76
+ 'Allow the vulnerable fixture to continue into MCP.',
77
+ 'Check whether the resulting side effect can still be reliably attributed to the governing task.',
78
+ ],
79
+ expectedInvariant: 'Protected execution requiring accountability must preserve trustworthy original-principal and governing-task lineage across A2A, handoff and MCP.',
80
+ evidenceRequirements: [
81
+ 'original principal',
82
+ 'governing task ID',
83
+ 'delegation ID',
84
+ 'handoff ID',
85
+ 'MCP request identity',
86
+ 'selected tool and resource',
87
+ 'side-effect identity',
88
+ 'missing lineage element',
89
+ 'final correlation result',
90
+ ],
91
+ applicability: {
92
+ a2a: ['1.0'],
93
+ mcp: ['2026-07-28'],
94
+ },
95
+ propertyClass: 'composition_responsibility',
96
+ sourceReferences: [
97
+ {
98
+ kind: 'project',
99
+ title: 'P1 Security Test Specification',
100
+ locator: 'docs/P1_TEST_SPECIFICATION.md#hp-audit-001--cross-protocol-audit-lineage-break',
101
+ },
102
+ {
103
+ kind: 'project',
104
+ title: 'Attack Catalog',
105
+ locator: 'docs/ATTACK_CATALOG.md#v01-p1--add-after-p0-engine-is-credible',
106
+ },
107
+ ],
108
+ sideEffectClass: 'synthetic',
109
+ destructive: false,
110
+ };
111
+ const ATTACK = {
112
+ definition: DEFINITION,
113
+ evaluate,
114
+ };
115
+ export const HP_AUDIT_001 = {
116
+ attack: ATTACK,
117
+ scenario: {
118
+ id: 'cross-protocol-audit-lineage-break',
119
+ originalTaskId: AUDIT_TASK_ID,
120
+ delegationId: 'delegation:DEL-AUDIT-1001',
121
+ handoffId: 'handoff:HOF-AUDIT-1001',
122
+ mcpRequestId: 'mcp-request:MCP-AUDIT-1001',
123
+ p0Scenario: createP0UpdateInvoiceScenario(24801),
124
+ },
125
+ createContext: createAuditContext,
126
+ };
127
+ export const P1_AUDIT_ATTACKS = [HP_AUDIT_001];
128
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/attacks/p1/audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { P1AttackPlan } from './types.js';
2
+ export declare const HP_AUTH_004: P1AttackPlan;
3
+ export declare const HP_AUTH_005: P1AttackPlan;
4
+ export declare const P1_AUTHORIZATION_ATTACKS: readonly P1AttackPlan[];
5
+ //# sourceMappingURL=authorization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorization.d.ts","sourceRoot":"","sources":["../../../src/attacks/p1/authorization.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAqR/C,eAAO,MAAM,WAAW,EAAE,YA4DzB,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,YA4DzB,CAAC;AAEF,eAAO,MAAM,wBAAwB,EAAE,SAAS,YAAY,EAA+B,CAAC"}