Comments on the CCXML WD of 29 June 2005

Voice Browser Working Group,

 

The CCXML working draft is looking very good.  Thanks for your efforts!

 

Below are some comments/questions on the latest draft (29 June 2005)
listed in document order.

 

Thanks again for the hard work,

 

Brian Frasca

Tellme Networks

frasca@tellme.com

 

----------------------------------------

 

1.  In section 3, the description for "Voice Dialog" says that it is
associated with an underlying connection that is distinct from the other
connections and conferences that it can be joined with.  This makes
total sense from an implementation point of view.  However, there are a
lot of properties for connection objects that aren't exposed for dialog
objects (e.g. local, remote, protocol, aai, etc.).  Should these
properties or the underlying connection object itself be exposed to the
CCXML application?

 

----------------------------------------

 

2.  Section 3 says that connection objects cannot accept events.  Why
not?  There may be cases where you want to send extra information to a
connection end-point and it would be nice if you could do this using a
<send> with the connection id as the target.  If the underlying
signaling is done using SIP, for example, this could translate into a
SIP INFO message to the specified connection.

 

----------------------------------------

 

3.  Section 3.4 says, "Scope element - a CCXML variable name which
defines a variable scope..."  Should the phrase "CCXML variable name" be
"CCXML element" instead?

 

----------------------------------------

 

4.  Section 3.5.3.8 says that using an optional "master" session for
inbound calls is equivalent to having multiple sessions <move> their
inbound calls to a single session.  However, the diagram in section
3.5.3.8 shows the master session receiving connection.alerting events
for each inbound call.

 

According to section 9.2.4, on the other hand, it seems like if a <move>
is done on an inbound call that the initial session will receive the
connection.alerting event and the target session to which the call is
moved will not.

 

Which case is correct?  Perhaps a master session isn't quite equivalent
to multiple moves?

 

----------------------------------------

 

5.  In section 5, the description for <move> says, "Move a event..."
Should that phrase read "Move an event source..." instead?

 

----------------------------------------

 

6.  In section 6.2.7.2, the description of the fetchid attribute of
<fetch> says, "... even if the request if for the same URL."  This
should read, "... even if the request *is* for the same URL."

 

----------------------------------------

 

7.  In section 6.2.9.2, the description of the timeout attribute of
<createccxml> says that an error.fetch event will be posted if the
timeout expires.  Should an error.createccxml event be posted instead or
at least in addition?

 

Also, what error event(s) should be posted if the initial document
cannot be fetched because it is older than maxage/maxstale allow?  Again
I would favor a single error.createccxml event and no error.fetch event.
It would be nice to be able to handle a single error event for
<createccxml> failures.

 

----------------------------------------

 

8.  Sections 6.2.9 and 6.3.  If a session created by <createccxml> fails
during document initialization (e.g. due to an ECMAScript error) should
the parent session receive an error.createccxml event or a ccxml.created
event?  I assume that if such an error occurs after document
initialization (i.e. after ccxml.loaded is sent to the new session) then
the parent session will have already received ccxml.created and will not
receive error.createccxml.

 

----------------------------------------

 

9.  Section 6.3.4 says that a ccxml.exit event is generated when a
document executes an <exit>.  However, if a child session terminates
without executing <exit> but instead due to an unhandled "error.*" or
kill event, will the parent session receive any event notifying it of
the child's demise?  It seems useful to notify the parent for any
termination condition.

 

----------------------------------------

 

10.  Section 6.3.6 notes that an event I/O processor can generate a
"standard" event such as ccxml.kill.  What happens if a standard event
is generated that does not include all of the required fields?  If the
receiving document tries to access a missing required field will an
error.semantic event be generated?  Can/should the platform do any
sanity checking and reject malformed events?

 

Furthermore, even if all required fields are present the values might
still be invalid (e.g. ids that don't exist) or the event itself could
even be incorrect (e.g. claiming that an ongoing fetch has completed
before it really has).

 

In general, how much freedom does a platform have to detect and reject
incorrect or malicious events?

 

----------------------------------------

 

11.  In section 7.1, the first example includes the following
transition:

 

<transition event="connection.connected" name="evt">

    <dialogstart prepareddialogid="evt.dialogid" 

                    connectionid="evt.connectionid"/>

</transition>

 

Should "evt.dialogid" be "evt.connection.dialogid" instead?

 

----------------------------------------

 

12.  Section 7.1 shows a pattern for using <dialogprepare> on an inbound
call.  Is there an equivalent pattern for an outbound call?  Would the
following be the correct pattern?

 

<transition event="..." name="evt">

    <dialogprepare src="..."> <!-- no connectionid -->

</transition>

<transition event="dialog.prepared" name="evt">

    <createcall dest="..." joinid="evt.dialogid"> <!-- use joinid -->

</transition>

<transition event="connection.connected" name="evt">

    <dialogstart prepareddialogid="evt.connection.dialogid"

                 connectionid="evt.connectionid"/>

</transition>

 

Perhaps it's worth including an outbound example in this section?

 

----------------------------------------

 

13.  In section 7.1, all of the patterns show the <dialogstart>
occurring after the <accept>.  However, I didn't see anything that
explicitly states this must be the case.  Is it legal for a
<dialogstart> to be executed against a connection that is in the
alerting or progressing state or is it required that the connection be
in the connected state?

 

Perhaps more to the point, in general, what is it possible to do with a
connection before accepting it?  For example, is it possible to play a
custom ringback tone before accepting the call or play an Intercept
announcement like "The number you dialed has changed.  Please check the
number..." or "The number you dialed is no longer in service..." without
ever answering/accepting the call.

 

----------------------------------------

 

14.  The end of section 7.1 states:  "It is possible for Dialogs to
exist that are not joined to a Connection.  For example this could be
due to a Connection disconnecting or the user performing an <unjoin/>
operation."

 

Is it possible, however, for a dialog to be started without initially
being joined to any connection or conference?

 

Will this happen if (1) neither a connectionid nor conferenceid is
specified on both the <dialogprepare> (if present) and <dialogstart> and
(2) the event triggering the transition containing <dialogstart> does
not contain a connection or conference id (e.g. ccxml.loaded)?  Or, will
that scenerio result in an error and if so which one?

 

If it's legal for a dialog to be started in such a state, then is it
possible to do this from a transition triggered by an event containing a
connection?  In other words, is it possible to mask what would otherwise
be the default connectionid for <dialogstart>?  If so, how?

 

If it's not legal for dialog to start off "unjoined" then that seems a
little asymmetric.  If there's ever a valid use case for having an
unjoined dialog (perhaps having it already running in the background so
you can quickly join a call to it) then not being able to create a
dialog in that state may lead to awkward hacks in application code.  On
the other hand, if there's never a valid use case for having an unjoined
dialog then why is it permitted?

 

----------------------------------------

 

15.  Section 7.2.  If a dialog is terminated with <dialogterminate>
while it is still being prepared (i.e. before the dialog.prepared event
is processed) which event(s) should be posted?
error.dialog.notprepared?  dialog.exit?  Both?

 

Section 7.2.1.1 states that an error.dialog.notprepared event should be
posted if the dialog cannot be prepared for any reason.  Section 7.2.3.1
implies that a <dialogterminate> will always result in a dialog.exit
event being posted.  If these are both true then I would expect both
events to be posted.

 

If both events are posted then is there a required ordering?  For
example, should the error.dialog.notprepared always be delivered before
the dialog.exit?

 

What should happen if there is already a dialog.prepared event in the
queue when the <dialogterminate> is processed?  Should the
dialog.prepared event still be delivered followed later by a dialog.exit
event?

 

----------------------------------------

 

16.  Section 7.2.  <fetch> and <createccxml> both have a timeout
attribute.  For similar reasons, should <dialogstart> and
<dialogprepare> also have a timeout attribute?

 

Furthermore, is it legal for a platform to have built-in timeout periods
of its own?  For example, can a platform decide that if it ever takes
more than 30 seconds to fetch a document it will abort the fetch and
post an error.fetch event?  Is it legal for the platform to abort a
fetch after 30 seconds even if the application specifies 60 seconds in
the timeout field?

 

----------------------------------------

 

17.  Section 7.2.  If the dialogid attribute is included both in a
<dialogprepare> element and its associated <dialogstart> element, is it
required that the value returned be identical in both cases?  I assume
(and very much hope) that the ids must match but it might be worth
stating this explicitly one way or the other.

 

----------------------------------------

 

18.  Section 7.2.1.1 says that if a dialog manager does not support
preparation then the plaform must save the values that were provided in
the src, namelist, and connectionid attributes (for use in a subsequent
<dialogstart>).  Wouldn't the platform also have to save the values of
the other attributes as well (e.g. type, conferenceid, etc.)?

 

----------------------------------------

 

19.  Section 7.2.2.1 says that the dialog.exit event will be posted to
the event queue of the CCXML session that started it.  If the dialog was
moved (via <move>), however, wouldn't the dialog.exit event be posted to
the new "owner" session?

 

----------------------------------------

 

20.  In section 7.2.2.2, the description of the prepareddialogid
attribute of <dialogstart> refers to the "error.dialogwrongstate" event.
I believe this should be the "error.dialog.wrongstate" event.

 

Also, is this event posted instead of or in addition to the usual
error.dialog.notstarted event?  Section 7.2.2.1 says that an
error.dialog.notstarted event is posted if the dialog cannot be started
for "any" reason so I would expect that either both events are posted or
else that wording is too strong.

 

Posting two separate events for a single error seems a little confusing.
On the other hand, having to catch two different events to handle
<dialogstart> errors seems a bit awkward (and "error.dialog.*" doesn't
quite work since it pulls in error.dialog.notprepared).

 

Is it really important to use an error.dialog.wrongstate event or would
it be better to just use a single error.dialog.notstarted event for all
cases when <dialogstart> fails?

 

----------------------------------------

 

21.  In section 7.2.2.2, the descriptions of both the connectionid and
conferenceid attributes of <dialogstart> say that they will post an
"error.fetch" event if both are specified.  Wouldn't it be more
consistent to post an "error.dialog.notstarted" event instead?  Or is
the intention that both error events should be posted?  As noted above,
posting multiple error events for a single error seems confusing.

 

----------------------------------------

 

22.  Section 7.2.2.2.  What does it mean if any of the maxstage,
maxstale, enctype, or method attributes are specified in both a
<dialogprepare> element and its associated <dialogstart> element?  Are
these attributes ignored in the <dialogstart> element?  Should it be
invalid to include them in conjunction with the prepareddialogid
attribute?

 

----------------------------------------

 

23.  Section 7.3.3.  What happens if a dialog terminates normally
concurrently with the CCXML application executing a <dialogterminate>?
Is the platform required to detect this and only post a single
dialog.exit event?  It seems like that should be the case or else it may
complicate the application logic.

 

----------------------------------------

 

24.  Section 7.4.  The duplex properties of a dialog object is allowed
to have the values "full", "half", or "undefined".  If set to "half" the
description states that the dialog is *receiving* a media stream.
However, the mediadirection attribute of <dialogprepare> and
<dialogstart> allows "dialogtransmit" as well as "dialogreceive" to be
specified.  Shouldn't the duplex property distinguish which direction
the media is streaming for half duplex connections?

 

Also, in the same description, "froma" should be "from a".

 

----------------------------------------

 

25.  In section 8.2.1.2, the type for the "name" attribute of <var> is
listed as "ECMAScript Expression".  Should this type "string" instead?
All of the examples use simple unquoted strings for this field.

 

----------------------------------------

 

26.  In section 8.2.1.2, the table states that the "expr" attribute of
<var> is not required and has no default value but that it must be a
valid ECMAScript expression.  Should the default value be the ECMAScript
"undefined" value?

 

----------------------------------------

 

27.  Section 8.2.2.2.  The type for the timeout, maxage, maxstale, and
charset attributes of <script> is "Character string".  Should the type
be "ECMAScript Expression" instead?  Other elements such as
<dialogstart> allow the timeout, maxage, and maxstale attributes to be
expressions.

 

----------------------------------------

 

28.  In section 9.2.2.2, the table states that the "name" attribute of
<transition> is supposed to be "An ECMAScript left hand side expression
evaluating to a previously defined variable."  However, none of the
examples in the spec ever use <var> to declare the event variable.  Does
the event variable really need to be previously declared?  If so, then
the examples should probably be fixed.

 

----------------------------------------

 

29.  In section 10.2.1, the diagram shows a connection.signal transition
from the PROGRESSING state but the table does not.

 

----------------------------------------

 

30.  Section 10.5.2.  What event should be posted if <redirect> fails?
Should there be an error.redirect event analogous to the error.merge
event?

 

----------------------------------------

 

31.  In sections 10.5.2.2 and 10.5.4.2, the descriptions for dest
attribute of <redirect> and <createcall> state "A platform must support
a telephone URI, as described in [RFC2806] or a SIP URI as described in
[RFC3261]."  Is this saying a platform must support both RFCs or at
least one of them?

 

----------------------------------------

 

32.  Section 11.1.

 

> <!-- Set our initial state -->

> <assign name="currentstate" expr="'initial'" />

 

This should use <var> instead of <assign>.

 

> <!-- happens when pin.vxml VoiceXML dialog thread exits -->

> <transition state="in_vxml_session" event="dialog.exit" name="evt">

>     <createcall dest="evt.values.telnum" name="out_connectionid" />

>     <assign name="currentstate" expr="'calling'" />

> </transition>

 

The value of evt.values.telnum is a 7-digit number.  Is that a valid
RFC2806 URL?

 

There is no "name" attribute for the <createcall> element.  It should be
"connectionid" instead.

 

----------------------------------------

 

33.  Section 11.3.

 

> <assign expr="evt.accepted" name="accepted" />

 

The namelist returned by outbound_greetings.vxml used a variable named
"willaccept".  Should "evt.accepted" be changed to
"evt.values.willaccept"?

 

----------------------------------------

 

34.  Appendix D contain this sentence:  "The sections below define the
eventing relationship between the CCXML and VoiceXML environments."
Should "eventing" be changed to "event"?

 

----------------------------------------

 

35.  Section D.11 (VoiceXML 2.0 Example).

 

The variables "maxtime_sendid" and "evt" are not declared.

 

--------------------

 

> Handle an transfer request from a VXML script.

 

Should read: "Handle a transfer..."

 

--------------------

 

> <send data="connection.disconnect.transfer" ...

> <send data="dialog.transfer.complete" ...

 

The data attribute is an ECMAScript expression so these strings should
be inside single quotes.

 

--------------------

 

> <assign name="results" ...

 

Either the "results" variable should be declared under <ccxml> or else
the places where <assign> is used on it should be changed to <var>.

 

--------------------

 

> <!-- Join the two calls together -->

> <join id1="in_connectionid" id2="in_connectionid" duplex="full" />

 

One of the connection ids should be out_connectionid.  BTW, what will
happen if both ids being joined are the same?  Will it generate an error
or will the caller be talking to themself?

 

--------------------

 

> <!-- If maxtime has been set then we setup a timer -->

> <if cond="vxml_maxtime != undefined">

>     <send data="maxtime" 

>         target="session.id"

>         delay="vxml_maxtime" 

>         sendid="maxtime_sendid"/>

> </if>

 

There is no variable "maxtime" declared and the event that is waited for
later is named 'vxml_maxtime'.  Should this be:

 

    <send data="'vxml_maxtime'" ...>

 

--------------------

 

> <assign name="results" expr="far_end_disconnect" />

> <assign name="results" expr="near_end_disconnect" />

> <assign name="results" expr="maxtime_disconnect" />

 

The expression is a string so it should be in single quotes.

 

--------------------

 

> <assign name="mystate" expr="'userDisconnected'" />

 

Elsewhere, the state is called 'userDisconnect'.

 

--------------------

 

> - We are only going to deal with stuff if it the event is 

 

Should read: "...stuff if the event..."

 

--------------------

 

> - Should this happen we just disconnect the outbound call let

 

Should read: "...outbound call leg..."

 

Received on Sunday, 31 July 2005 07:22:12 UTC