<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE spec PUBLIC "-//W3C//DTD Specification V2.1//EN"
               "../xmlspec-v21/xmlspec.dtd" [
	<!-- ================================================================ -->
	<!ENTITY draft.day "18">
	<!ENTITY draft.month "05">
	<!ENTITY draft.monthname "May">
	<!ENTITY draft.year "2007">
	<!ENTITY iso6.doc.date "&draft.year;-&draft.month;-&draft.day;">
	<!ENTITY basename "http://www.w3.org/2001/tag/doc/versioning-strategies">
	<!ENTITY draftname "&basename;-&draft.year;&draft.month;&draft.day;">
]>
<spec w3c-doctype="other">
	<?CVS $Id$?>
	<header>
		<title>[Editorial Draft] Extending and Versioning Languages: Strategies</title>
		<w3c-designation>&basename;-&iso6.doc.date;</w3c-designation>
		<w3c-doctype>Draft TAG Finding</w3c-doctype>
		<pubdate>
			<day>&draft.day;</day>
			<month>&draft.monthname;</month>
			<year>&draft.year;</year>
		</pubdate>
		<publoc>
			<loc href="&draftname;.html">&draftname;.html</loc>  ( <loc href="&draftname;.xml">xml</loc> )
		</publoc>
		<latestloc>
			<loc href="http://www.w3.org/2001/tag/doc/versioning-strategies">http://www.w3.org/2001/tag/doc/versioning-strategies</loc>
		</latestloc>
		<prevlocs>
			 Unapproved Editors Drafts:
			 			 <loc href="http://www.w3.org/2001/tag/doc/versioning-20070326.html">http://www.w3.org/2001/tag/doc/versioning-20070326.html</loc>, 
			 			 			 			 <loc href="http://www.w3.org/2001/tag/doc/versioning-20061212.html">
			 			 			 			 http://www.w3.org/2001/tag/doc/versioning-20061212.html</loc>, 
			 			 			 			 
			 <loc href="http://www.w3.org/2001/tag/doc/versioning-20060726.html">http://www.w3.org/2001/tag/doc/versioning-20060726.html</loc>,  
			 <loc href="http://www.w3.org/2001/tag/doc/versioning-20060717.html">http://www.w3.org/2001/tag/doc/versioning-20060717.html</loc>, 
			 <loc href="http://www.w3.org/2001/tag/doc/versioning-20060710.html">http://www.w3.org/2001/tag/doc/versioning-20060710.html</loc>, 
			 			 <loc href="http://www.w3.org/2001/tag/doc/versioning-20031116.html">http://www.w3.org/2001/tag/doc/versioning-20031116.html</loc>
			 <loc href="http://www.w3.org/2001/tag/doc/versioning-20031003.html">http://www.w3.org/2001/tag/doc/versioning-20031003.html</loc>
		</prevlocs>
		<authlist>
			<author>
				<name>David Orchard</name>
				<affiliation>BEA Systems, Inc.</affiliation>
				<email href="mailto:David.Orchard@BEA.com">David.Orchard@BEA.com</email>
			</author>

		</authlist>
		<copyright>
			<p>
				<loc href="http://www.w3.org/Consortium/Legal/ipr-notice-20000612#Copyright">Copyright</loc> &#xA9; 2003
<loc href="http://www.w3.org/">W3C</loc>
				<sup>&#xAE;</sup>
(<loc href="http://www.lcs.mit.edu/">MIT</loc>,
<loc href="http://www.inria.fr/">INRIA</loc>,
<loc href="http://www.keio.ac.jp/">Keio</loc>),
All Rights Reserved. W3C
<loc href="http://www.w3.org/Consortium/Legal/ipr-notice-20000612#Legal_Disclaimer">liability</loc>,
<loc href="http://www.w3.org/Consortium/Legal/ipr-notice-20000612#W3C_Trademarks">trademark</loc>,
<loc href="http://www.w3.org/Consortium/Legal/copyright-documents-19990405">document use</loc>, and
<loc href="http://www.w3.org/Consortium/Legal/copyright-software-19980720">software licensing</loc>
rules apply.
</p>
		</copyright>
		<abstract>
			<p>This document provides motivation for versioning, a number of questions that language designers must answer, and a variety of version identification strategies.  Separate documents contain the terminology definitions and XML language specific discussion.</p>
		</abstract>
		<status>
			<p>This document has been developed for discussion by the
<loc href="/2001/tag/">W3C Technical Architecture Group</loc>. It does
not yet represent the consensus opinion of the TAG.</p>
			<p>Publication of this finding does not imply endorsement by the W3C
Membership. This is a draft document and may be updated, replaced or
obsoleted by other documents at any time.</p>
			<p>
				<loc href="/2001/tag/findings">Additional TAG findings</loc>, both
approved and in draft state, may also be available. The TAG expects to
incorporate this and other findings into a Web Architecture Document
that will be published according to the process of the <loc href="/Consortium/Process-20010719/tr#Recs">W3C Recommendation
Track</loc>.</p>
			<p>Please send comments on this finding to the publicly archived TAG
mailing list <loc href="mailto:www-tag@w3.org">www-tag@w3.org</loc>
(<loc href="http://lists.w3.org/Archives/Public/www-tag/">archive</loc>).</p>
		</status>
		<pubstmt>
			<p>Chicago, Vancouver, Mountain View, et al.: World-Wide Web Consortium,
Draft TAG Finding, 2003.</p>
		</pubstmt>
		<sourcedesc>
			<p>Created in electronic form.</p>
		</sourcedesc>
		<langusage>
			<language id="EN">English</language>
		</langusage>
		<revisiondesc>
			<slist>
				<sitem>2003-07-29: Published draft</sitem>
			</slist>
		</revisiondesc>
	</header>
	<body>
		<div1 id="introduction">
			<head>Introduction</head>
			<p>The evolution of languages by adding, deleting, or 
changing syntax or semantics is called versioning. Making versioning work in
practice is one of the most difficult problems in computing. Arguably,
the Web rose dramatically in popularity because evolution and
versioning were built into HTML and HTTP. Both systems provide
explicit extensibility points and rules for understanding extensions
that enable their decentralized extension and versioning.</p>

			<p>This finding describes general problems and techniques in evolving systems in compatible and incompatible ways. These
techniques are designed to allow compatible changes with or without
schema propagation. A number of questions, design patterns and rules
are discussed with a focus towards enabling versioning in XML
vocabularies, making use of XML Namespaces and XML Schema constructs.
This includes not only general rules, but also rules for working with
languages that provide an extensible container model, such as
SOAP and RDF/OWL.</p>
<p>The terminology definitions used throughout are defined in <bibref ref="versioning-terminology"/></p>
			<div2 id="whyworry">
				<head>Why Worry About Extensibility and Versioning?</head>
				<p>As texts, or messages, are exchanged between applications, they
are processed. Most applications are designed to discriminate between
valid and invalid inputs. In order to have any sort of
interoperability, a language must be defined or described in some
normative way so that the terms <quote>invalid</quote> and
<quote>valid</quote> have meaning.</p>
				<p>There is a range of mechanisms that can be employed for defining what constitutes the validity of a language. For example, DTDs, W3C XML Schemata, RELAX NG Schemata, methods based on Schematron and so on. These approaches might be augmented with normative prose documentation or even some application-specific validation logic. In many cases, the schema language is the only validation mechanism that is available.</p>
				<p>It is almost unheard of for a single version of a language to be
deployed without requiring some kind of augmentation. Invariably, the
original language designer did not include certain terms and
constraints. In fact, good designers should not try to define all the
possible terms and constraints. This is sometimes called
<quote>boiling the ocean</quote>. Knowing that a language will not be
all things to all people, a language designer can allow parties to
extend instances of the language or the language itself. Typically the
tools will allow the language designer to specify where extensions in
the instance and extensions in the language are allowed. Of note, we
do not call extending a text of a language
a new version. This limits our discussion of versioning to
changes in a language, not changes to instances.</p>
				<p>Whether you've deployed ten resources, or a hundred, or a million,
if you change a language in such a way that all those resources will
consider instances of the new language invalid, you've introduced
a versioning problem with real costs.</p>
				<p>Once a language is used outside of its development environment,
there will be some cost associated with changing it: software, user
expectations, and documentation may have to be updated to accommodate the
change. Once a language is used in environments outside of a single
realm of control, any changes made will introduce multiple versions of
the language.</p>
			</div2>
			<div2 id="whyversion">
				<head>Why Do Languages Change?</head>
				<p>There are many reasons why a different version of a language may
be needed. A few of them include:</p>
				<olist>
					<item>
						<p>Bugs may need to be fixed. Production use may reveal defects
or oversights that need to be fixed. This may involve changes to components
of the language or changes to the semantics of existing components.

</p>
					</item>
					<item>
						<p>Changing requirements may motivate changes in the schema design.
For example, a callback may be added to a service that performs some processing
so that it is able to notify the caller when processing has completed.
</p>
					</item>
					<item>
						<p>Different flavors of a schema may be desirable. For example, the
XHTML 1.0 Recommendation defines strict, transitional, and frameset
schemas. All three of those schemas purport to define the same namespace,
but they describe very different languages.</p>
						<p>And additional schemas may be defined by other specifications, such
as the XHTML Basic Recommendation.
</p>
					</item>
				</olist>
				<p>Whatever the cause, over time, different versions of the language
exist and designing applications to deal with this change in a
predictable, useful way requires a <emph>versioning</emph>
strategy.</p>
			</div2>
			
			<div2 id="howchange">
				<head>How Do Languages Change?</head>
				<p>At the most basic level, languages can change in only a few ways:</p>
				<ulist>
					<item>
						<p>
							<emph>Content</emph>: The allowable content can evolve through addition or deletion.  In XML, this becomes</p>
						<ulist>
							<item>
								<p>
									<emph>Elements</emph>New elements can be added, existing elements can
be removed, or the acceptable number of occurrences of an element can change.
In addition, the content of an element could change from element only content
to mixed content, or vice versa.</p>
								<p>For elements with simple content, the type or range of values that are
acceptable can change.</p>
							</item>
							<item>
								<p>
									<emph>Attributes</emph>: New attributes can be added, existing attributes
can be removed, or the type or range of values that are acceptable can change.
</p>
							</item>
						</ulist>
					</item>
					<item>
						<p>
							<emph>Semantics</emph>: The meaning of an existing term
can change.</p>
					</item>
				</ulist>
				<p>Of course, the difference between two versions of a language can
be an arbitrary number of these changes.</p>
				<p>One of the most important aspects of a change is whether or not it is
backwards or forwards compatible. </p>
				<p>Some typical backwards- and forwards-compatible changes:</p>
				<ulist>
					<item>
						<p>adding optional components (elements and/or attributes)</p>
					</item>
					<item>
						<p>adding optional content, for example extending an enumeration</p>
					</item>
				</ulist>
				<p>Some typical forwards-compatible changes:</p>
				<ulist>
					<item>
						<p>Decreasing the maximum allowed number of occurrences of a component but not to less than the minimum</p>
					</item>
					<item>
						<p>Decreasing the allowed range of a component</p>
					</item>
				</ulist>
				<p>Some typical backwards-compatible changes:</p>
				<ulist>
					<item>
						<p>Increasing the maximum allowed number of occurrences of a component</p>
					</item>
					<item>
						<p>Increasing the allowed range of a component</p>
					</item>
				</ulist>
				<p>Some typical incompatible changes:</p>
				<ulist>
					<item>
						<p>changing the meaning or semantics of existing components</p>
					</item>
					<item>
						<p>adding required components</p>
					</item>
					<item>
						<p>removing required components</p>
					</item>
					<item>
						<p>restricting a components content model,
such as changing a choice to a sequence in XML</p>
					</item>
				</ulist>
				<div3 id="whyextend">
				<head>Why Extend languages?</head>
				<p>The primary motivation to allow instances of a language to be
extended is to decentralize the task of designing, maintaining,
and implementing extensions. It allows
producers to change the instances without going through a centralized
authority. It means that changes can occur at the producer or consumer
without the language owner approving of them. Consider the effort that
the HTML Working Group put into modularity of HTML. Without some decentralized
process for extension, every single variant of HTML would have to be called
something else <emph>or</emph> the HTML Working Group would have to agree
to include it in the next revision of HTML.</p>
			</div3>
			</div2>
			<div2 id="vocabkind">
				<head>Kinds of Languages</head>
				<p>Ultimately, there are different kinds of languages. The
versioning approaches and strategies that are appropriate for one kind
of language may not be appropriate for another.  Among the various kinds
of vocabularies, we find:</p>
				<ulist>
					<item>
						<p>
							<emph>Just Names</emph>: some languages don't actually have a syntax or grammar; they're just lists of names. Using names to identify words
in the WordNet database, for example, or the names of functions and operators
in XPath2 are examples of <quote>just name</quote> languages.
</p>
					</item>
					<item>
<p><emph>Markup</emph>: SGML, HTML, and the non-SGML variants of HTML are all markup languages.  XML languages are described in Versioning - XML</p>
</item>
					<item>
<p><emph>Non-markup Text</emph>: languages designed with a text format.  These may be programming languages such as Java or ECMAScript, or data formats like CSS or Comma Separated Values.  Typically these are intended for humans to author and or view.  </p>
</item>
<item>
<p><emph>binary</emph>: languages that are not in a text format.   These may be image formats like GIF, JPEG, or even binary encoded XML.  </p>
</item>
</ulist>
					
				<p>This is by no means an exhaustive list. Nor are these categories exclusive. Many languages have mixed modes.  For example, XQuery has a text mode and an XML mode. </p>
			</div2>
		</div1>

			
			<div1 id="strategies">
				<head>Versioning Strategies</head>

				<p>In broad terms, the strategies to versioning fall into a number of
classes ranging from <quote>none</quote> to a <quote>big bang</quote>:
</p>
				<ulist>
					<item>
						<p>
							<emph>None.</emph> No distinction is made
between versions of the language. Applications are either expected
not to care, or they are expected to cope with any version they
encounter.</p>
					</item>
					<item>
						<p>
							<emph>Compatible.</emph> Designers are expected to limit changes to
those that are either backwards or forwards compatible, or both.</p>
						<ulist>
							<item>
								<p>
									<emph>Backwards compatibility.</emph> Applications
are expected to behave properly if they receive a text of the 
<quote>older</quote> version of a language.  Backwards
compatible changes allow applications to behave properly if they receive
a text of the <quote>older</quote> version of the language. </p>
							</item>
							<item>
								<p>
									<emph>Forwards compatibility.</emph> Applications
are expected to behave properly if they receive a text of the 
<quote>newer</quote> version of a language. Forwards compatible
changes allow existing applications to behave properly if they receive
a text of the <quote>newer</quote> version of the language.</p>
							</item>
						</ulist>
					</item>
					<item>
						<p>
							<emph>Flavors.</emph> Applications are expected to behave
properly if they receive one of a set of flavors of the text type.
</p>
					</item>
					<item>
						<p>
							<emph>Big bang.</emph> Applications are expected to
abort if they see an unexpected version.</p>
					</item>
				</ulist>
				<p>There's no single approach that's always correct. Different
application domains will choose different approaches. But by the same
token, the approaches that are available depend on other choices,
especially with respect to namespaces. This dependency makes it
imperative to plan for versioning from the start. If you don't plan
for versioning from the start, when you do decide to adopt a plan for
versioning, you may be constrained in the available approaches by decisions that you've already made.</p>
				<p>A language commonly goes through a lifecycle of iterative development followed by deployment followed by deployment of new versions.  The point in the lifecycle will affect the selection of the versioning strategy for the language</p>
				<p>Just as there are a number of strategies, there are a number of
designs for implementing a strategy.  The internet - including MIME, markup languages, and XML languages have successfully used various strategies, either singly or in combination.  Summaries of strategies and requirements have been produced for earlier technologies and guided XML Namespaces and Schema, such as <bibref ref="Note-extlang"/>.</p>
<div2 id="problems">
				<head>Why Have a Strategy?</head>
				<p>Different kinds of languages and different versioning strategies expose
different problems. If you don't have a strategy at all, you are effectively
choosing the <quote>no versioning</quote> strategy.</p>
				<p>It's probably obvious that attempting to deploy a system that
provides no versioning mechanism is fraught with peril. Putting the
burden of version <quote>discovery</quote> on consumers is probably
impractical in anything except a closed system.</p>
				<p>At the other end of the spectrum is the "big bang" approach which
is also problematic.</p>
				<p>
					<quote>Big bang</quote> is a very coarse-grained approach to
versioning. It establishes a single version identifier, either a version number or namespace name, for an entire
text.</p>
				<p>The semantics of the "big bang" are that applications decide on the
basis of the text version whether or not they know how to process
that text. If the version isn't recognized, the entire text is
rejected. Typically, when introducing a new version using the
<emph>big bang</emph> approach, all of the software that produces or
consumes the texts is updated in a sweeping overhaul in
which the entire system is brought down, the new software deployed and
the system is restarted. This <emph>big bang</emph> approach to versioning is
practical only in circumstances where there is a single controlling
authority, and even in that case, it carries with it all manner of
problems. The process can take a considerable amount of time, leaving
the system out of commission for hours if not days. This can result in
significant losses if the system is a key component of a revenue
generating business process and the cost of coordinating the system
overhaul can also be quite costly as well.</p>
				<p>The "big bang" approach is appropriate when the new version is
radically different from its predecessor. But in many cases, the
changes are incremental and often a consumer could, in practice, cope
with the new version. For example, it might be that there are many
messages that don't use any features of the new version or perhaps it
is appropriate to simply ignore elements that are not recognized.</p>
				<p>Recall our Name example and consider a producer and a consumer exchanging name messages. Imagine that some future version of the name language defines a new
<quote>middle</quote> element. Because producers and consumers are distributed,
it may happen that an old consumer, one unprepared for a middle element, encounters a message sent by a newer producer.</p>
				<p>If big bang versioning is used, old systems will reject the new
message. However, if the versioning strategy allowed the old
consumer to simply ignore unrecognized content, it's quite possible
that other components of the system could simply adapt to the previous
behavior. In effect, the old system would ignore the middle element
and its descendents so it would <quote>see</quote> a message that
looks just like the old format it is expecting.</p>
				<p>For the producer, the result would be that the request is fulfilled,
though perhaps not quite the way it may have hoped.  For example, a request that results in a name response may return a name without the middle. In many
cases this may be better behavior than receiving an error. In
particular, producers using the new format can be written to cope with
the possibility that they will be speaking to older consumers.</p>
				<p>If the new system needs to make sure that middle is respected,
then it can change the language in an incompatible way to indicate that the new behavior is not considered backwards compatible.</p>
				<p>Often, what is needed is some sort of middle ground solution.</p>			
			</div2>
<div2>
<head>Versioning Designs</head>
				<p> For any given
strategy, there are various designs that achieve the strategy, and some may be more appropriate than others.  Among
them we find:</p>
<div3>
<head>Big Bang/Incompatible</head>
			<p>As desirable as compatible evolution often is, sometimes
a language may not want to allow it. In this model, a consumer will generate a
fault if it finds a component it doesn’t understand. An example might be a
security specification where a consumer must understand each and every
extension. This suffers from the significant drawback that it does not allow
compatible changes to occur in the language, as any changes require both
consumer and producer to change.  A few different designs for incompatible evolution are:
				<ulist>
					<item>
						<p>
							<emph>Must Understand All:</emph> consumers must understand all of the
text received and are expected to abort processing
if they do not. 
</p>
					</item>
					<item>
<p><emph>Must Understand Listed:</emph> consumers must understand the text portions that are listed in some well-defined place in the text.</p>
</item>
					<item>
<p><emph>Must Understand Marked:</emph> consumers must understand the text portions that are marked as being mandatory.  SOAP Header Blocks with the mustUnderstand attribute is an example.</p>
</item>
					</ulist>
					</p>
					</div3>
<div3 id="forwardsCompatible">
<head>Forwards Compatible</head>
			<p>Forwards compatible means that producers should be able to extend existing texts
with new texts without consumers having to change existing
implementations. Extensibility is one step towards this goal, but
achieving forwards compatibility also requires a processing model for the
extensions.  The behavior of software when it encounters an extension
should be clear. For this, we introduce the next rule: </p>
			<p role="practice">Provide Processing Model Rule: Languages SHOULD
specify a processing model for dealing with extensions.</p>
			<p>Achieving forwards-compatible evolution requires that the processing model must be a substitution mechanism.  The instance containing the extension, which isn't known by the consumer, must be transformed into an instance which is of a type known by the consumer.  </p>
			<p role="practice">Provide Substitution model: Languages MUST provide a substitution model for forwards-compatible evolution.</p>
			<div4>
<head>Must Ignore Unknowns</head>

			<p> Perhaps the simplest substitution model that enables forwards-compatible
changes is to ignore content that is not understood. This rule is:</p>
			<p role="practice">Must Ignore Unknowns Rule: Consumers MUST ignore
any text portion that they do not recognize.</p>
			<p>This rule does not require that the elements be physically removed;
only ignored for processing purposes. There is a great deal of
historic usage of the Must Ignore rule. HTML 1, 2 and 3.2 follow the
Must Ignore rule as they specify that any unknown start tags or end
tags are mapped to nothing during tokenization. HTTP 1.1 [<loc href="#rfc2616">7</loc>] specifies that a consumer should ignore any
headers it doesn't understand: "Unrecognized header fields SHOULD be
ignored by the recipient and MUST be forwarded by transparent
proxies." The Must Ignore rule for XML was first standardized in the
WebDAV specification RFC 2518 [<loc href="#rfc2518">6</loc>] section
14 and later separately published as the Flexible XML Processing
Profile [<loc href="#FlexXMLP">3</loc>].</p>
<p>Sometimes the must understand
and must ignore approaches can be combined for more selective use.  For example, SOAP processors must ignore headers they do not recognize unless the
header explicitly identifies itself as one that must be understood.</p>
			<p>There are two broad types of Must Ignore rules for
dealing with extensions, either ignoring the entire tree or just the unknown
part of the tree. The rule for ignoring the entire tree is:</p>
			<p role="practice">Must Ignore All Rule: The Must Ignore
rule applies to unrecognized texts and their descendents in
tree based formats.</p>
 <p>This variation on <emph>must
ignore</emph> requires the consumer to ignore the text and any children it does not
understand.  Most
data applications, such as Web services that use SOAP header blocks or WSDL extensions, adopt this approach to
dealing with unexpected markup. For XML, the Must Ignore all rule was
first standardized in the WebDAV specification RFC 2518 <bibref ref="rfc2518"/> section 14
and later separately published as the <bibref ref="FlexXMLP"/>.
</p>
			<p>For example, if a message is received with unrecognized
elements in a SOAP header block, they must be ignored unless marked as "Must
Understand" (see Rule 10 below). Note that this rule is not broken if the
unrecognized elements are written to a log file. That is, "ignored" doesn’t
mean that unrecognized extensions can’t be processed; only that they can’t be
the grounds for failure to process.</p>
			<p>Other applications may need a different rule as the
application may want to retain the content of an unknown element,
perhaps for display purposes. The rule for ignoring the element only is:</p>
			<p role="practice">Must Ignore Container Rule: The Must Ignore rule
applies only to the smallest portion of the tree.</p>
<p>This variation on <emph>must
ignore</emph> requires the consumer to ignore the smallest part of the text that is ignorable.  For markup languages, this could be just an element or attribute that it does not understand, but in the case of elements, to process the children of that element. The Must Ignore Container practice was
described in <bibref ref="rfc1866"/>
								</p>
			<p>This retains the element descendents in the processing model so
that they can still affect interpretation of the text, such as for
display purposes.</p>
			<p>Ignoring content is a simple solution to the problem of
substitution. In order to achieve a compatible evolution, the newer texts
of a language must be transformable (or substitutable) into older texts. 
Object systems typically call this "polymorphism", where a new type can behave
as the old type.</p>
</div4>
<div4>
<head>Fallback Provided</head>
<p> A language can provide mechanisms for
explicit fallback if the text is not supported. <bibref ref="rfc1521"/> provides multipart/alternative for equivalent, and hence fallback, representations of content.  <bibref ref="html40"/> uses this approach in the NOFRAMES element.  In XML, the XML Inclusions specification <bibref ref="Xinclude"/> provides a fallback
element to handle the case where the putatively included resource cannot be
retreived.  There are many variations on where the fallback content can be found.  For example, a schema language could specify that fallback content is found in a text, in a schema, or even in the schema for the schema language.  
</p>
</div4>
<div4>
<head>Understanding unknown version identifiers</head>
<p>Providing forwards compatibility often requires more than a substitution model for texts, it must also provide a substitution model for any version identifiers.  </p>
<p role="practice">Provide Version Identification substitution model: Languages MUST provide a substitution model for version identifiers for forwards-compatible evolution.</p>
<p>The use of a version identifier requires a substitution from an unknown version to a known version for a consumer that doesn't understand the version identifier.</p>
<p>There could be an algorithmic approach. For version numbers, one could say that version numbers will only have a "major" change if there is an incompatible change. For example, version 1.1 of a language is by definition compatible with version 1.0 and version 2.0 is incompatible. Then, when the producer puts 1.0, 1.1, or 2.0, a consumer at any level will know whether it can process the content. This also means that there is a choice about which version number to put in, the lowest or the highest.  A document that contains "1.1" means that any 1.X processor can process it. A "2.0" document means that a 1.X processor cannot process it, but any "2.X" processor can. </p>
<p>Then the language have wording about processing unknown version numbers. Sample wording for a substitution model for version identifiers: "A processor of this version MUST not fault if it receives a document that contains the same major version number." This rule would be in conjunction with forwards-compatible design for the texts, such as "Must Ignore Unknowns".</p>
</div4>
<div4>
<head>Supporting functionality</head>
<p>
Additional functionality can be provided in a language for determining the capabilities of the system that the text is being interpreted in. A language can provide a mechanism for
explicit testing. The XSLT Specification provides a conditional logic
element and a function to test for the existence of extension functions. This allows
designers of stylesheets to deal with different consumer capabilities in an
explicit fashion.  
</p>
</div4>
</div3>
<div3 id="backwardsCompatible">
<head>Backwards compatible</head>
<p>In general, providing backwards compatibility is easier than providing forwards compatibility.  Backwards compatibility means supporting the previous versions of text in a newer consumer.   There are are two significant ways that backward compatibility can be supported.</p>
<div4>
<head>Replacement</head>
<p>In the replacement design, the new version of software replaces the old and the new version of the software supports the old and the new version.  That is, producer does not need to distinguish between the old and the newer consumer.  For example, a web resource that supports additional Name Information as input does not change the URI of the resource.  </p>
</div4>
<div4>
<head>Side-by-side</head>
<p>In the side-by-side design, the new version of the software and the old version of the software are deployed "side-by-side".  One variant of the approach is offering both versions of the system, for example by using different URIs for the old and new resources.  The request to one resource gets mapped to the other resource behind the scenes using a proxy or gateway.   This "alternative" approach works when the intermediary can completely handle or generate the new information (for backwards compatibility) or ignore the new information (for forwards compatibility).  For example, adding SSL security to a resource changes the URI but a Web server can typically handle mapping the https: URI to the older http: URI.   If both URIs are maintained, then the addition is a compatible change.  Another example is where new information is required, such as  the priority, and the intermediary can apply a default value to provide the required priority.  However, this too has its costs as multiple versions of the software must be supported and maintained over time and there is the added cost of developing the proxy or gateway between the two environments.  Further, this does not work in scenarios where the intermediary cannot generate the new required content.  For example, if a middle name is required in V2, a middle cannot be generated from just a family and a given name.</p>
</div4>
</div3>
<div3>
<head>Mixtures</head>
<p>Languages can choose a mixture of approaches. For example, XSLT provides
both an explicit fallback mechanism for some conditions and explicit testing
for others.  The SOAP specification, another example, specifies Must Ignore as the default strategy and the ability to dynamically mark components as being in the Must Understand strategy.</p>
</div3>
			</div2>
			
		</div1>
		<div1 id="requirements">
			<head>Language Requirements</head>
			<p>Given the types of versioning strategies and designs that are available, there are some key requirements  the language designer consider in choosing a strategy and design. </p>
			<div2>
				<head>What language form</head>
				<p>Languages can be expressed in text, comma separated values, XML, SGML, binary, source code, and almost any kind of form.  See the Architecture of the World-Wide Web section on data formats for more information - http://www.w3.org/TR/2004/REC-webarch-20041215/#formats.</p>
			</div2>
			<div2>
				<head>Can 3rd parties extend the language?</head>
				<p>It is sometimes desirable to prevent 3rd parties from extending
languages, but it does happen. An example may be a tightly constrained
security environment where distributed authoring is considered a "bug"
rather than a feature.</p>
			</div2>
			<div2>
				<head>Can 3rd parties extend the language in a compatible way?</head>
				<p>If so, a substitution mechanism is required for forwards compatibility.
If an older consumer has no mechanism for dealing with new content, then
forwards-compatible evolution isn't possible. One simple substitution
mechanism is simply ignoring the unrecognized components.</p>
			</div2>
			<div2>
				<head>Can 3rd parties extend the language in an incompatible way?</head>
				<p>If so, and if compatible extensions are also possible, then
it must be possible to identify incompatible changes so that
they can override the substitution mechanism used for extensible
changes.</p>
				<p>In environments where unrecognized components are ignored, a
"must understand" component can be added to identify incompatible
changes.</p>
				<p>If compatible changes are not possible, then incompatible changes
simply become the default. For example, WS-Security mandates that 3rd
parties can only provide incompatible extensions. Unlike most
languages, a security language has unique requirements where the
consequences of ignored data can be severe. WS-Security accomplished
this by specifying that all extensions are required to be understood
and there is no substitution mechanism.</p>
			</div2>
			<div2>
				<head>Can the designer extend the language in a compatible way?</head>
				<p>As with 3rd parties compatible extensions, a substitution mechanism
for the designer’s extensions is required for forwards
compatibility.</p>
			</div2>
			<div2>
				<head>Can the designer
extend the language in an incompatible way?</head>
				<p>In XML, the designer can always
do this by using new namespace names, element names or version
numbers.  In other languages, this may not be possible because there is no mechanism for indicating the incompatible change.</p>
			</div2>
			<div2>
				<head>Is the vocabulary a stand-alone language or an extension of
another vocabulary?</head>
				<p>A part of this question is whether the language depends on another
language. That determines which, if any, facilities are provided for
the containing language and what must be provided by a contained
language.</p>
				<p>SOAP is an example of a container language. The SOAP processing
model applies uniformly to all headers, which may employ
<code>soap:mustUnderstand</code> to identify incompatible changes,
even though the contents of the SOAP headers are languages independent
from SOAP.</p>
			</div2>

			<div2>
				<head>What Schema language(s)?</head>
				<p>Choosing a schema language or languages guides the language design
in many ways. Some features, particularly extensibility, must be
anticipated in the first version of a language in order to take
advantage of the features of some schema languages.</p>
				<p>In addition, various features may be incompatible across different
languages. For example, writing a V2 compatible schema in W3C XML
Schema requires special design, which is not required in a schema
language such as RELAX NG. Some of the language design choices
mandated by W3C XML Schema are discussed in other sections of this
Finding.</p>
			</div2>
			<div2>
				<head>Should extensions or versions be expressible in the Schema
language?</head>
				<p>The ability to write a schema for extensions or versions is
directly affected by the schema design and the compatibility
desires.</p>
			</div2>
			<div2>
<head>Requirements Summary</head>
<p>Every language design will make decisions about these requirements.  These requirements can be expressed in a table form:
<table>
<tbody>
<tr>
<th>Requirement</th>
</tr>
<tr>
<th>Language form</th>
<td></td>
</tr>
<tr>
<th>Schema Lang</th>
<td></td>
</tr>
<tr>
<th>3rd party compatibly extend</th>
<td></td>
</tr>
<tr>
<th>3rd party incompatibly extend</th>
<td></td>
</tr>
<tr>
<th>Designer incompatibly extend</th>
<td></td>
</tr>
<tr>
<th>stand-alone</th>
<td></td>
</tr>

</tbody>
</table>

</p>
</div2>
		</div1>
		<div1 id="decisions">
			<head>Language Design</head>
			<p>Upon answering these questions, there are some key
decisions that a language developer makes, whether they are consciously made or
not.</p>
			<div2>
				<head>Schema language design choices or constraints.</head>
				<p>If the language is intended to be capable of compatible extensibility, then a few
specific schema design choices must be followed.</p>

			</div2>
			<div2>
				<head>Substitution Mechanism.</head>
				<p>Forwards compatibility can only be achieved by providing a
substitution mechanism for Version 2 instances or Version 1 extensions
to V1 without knowledge of V2.  A V1 consumer must be able to
transform any instances, such as V1 + extensions, to a V1 instance in
order to process the instance. The "Must Ignore unknown" rule is a
simple substitution mechanism. This rule says that any extensions are
"ignored". Using it, a V1 + extensions text is transformed into a V1
text by ignoring the extensions. Others substitution mechanisms
exist, such as the fallback model in XSLT.</p>
			</div2>
			<div2>
				<head>Component identification</head>
				<p>The identification of components into language versions or
extensions has a variety of general mechanisms related to namespaces.
These are detailed in the Versioning section.</p>
			</div2>
			<div2>
				<head>Identification of incompatible extensions</head>
				<p>The identification of versions is covered by language
identification, but 3rd parties cannot arbitrarily change
versions or change namespaces. They may need a mechanism to indicate
that an extension is an incompatible change. A couple of mechanisms
are a "Must Understand" identifier (such as a flag or list of required
namespaces) or requiring that extensions are in substitution
groups.</p>
			</div2>
						<div2>
<head>Design Summary</head>
<p>Every language design will make a decision in these areas.  These designs can also be expressed in a table form:
<table>
<tbody>
<tr>
<th>Design</th>
</tr>
<tr>
<th>Schema design</th>
<td></td>
</tr>
<tr>
<th>Substitution Mechanism</th>
<td></td>
</tr>
<tr>
<th>Component Identification</th>
<td></td>
</tr>
<tr>
<th>Incompatible Ext identification</th>
<td></td>
</tr>


</tbody>
</table>

</p>
</div2>
		</div1>
		
		<div1 id="identify">
			<head>Identifying and Extending Languages</head>
			<p>Designing extensibility into languages typically results
in systems that are more loosely coupled.  Extensibility allows authors to
change instances without going through a centralized authority, and may allow
the centralized authority greater opportunities for versioning.  The common
characteristic of a compatible change is the use of extensibility.</p>
			<p>A supreme example of the benefits of extensibility is
HTML.  The first version of HTML was designed for extensibility; it said that
"unknown markup" may be encountered.  An example of this in action is the
addition of the IMG tag by the Mosaic browser team.  This is a great example of a language designed for extensibility.</p>
			<p>The first rule introduced in this Finding relating to
extensibility is:</p>
			<p role="practice">
Compatible Versioning rule: Any Language intended for compatible versioning MUST have extensibility.</p>
			<p>A fundamental requirement for extensibiliy and versioning is to be able to
determine the language Texts and sub-texts.  Any language that does not allow identification of the language will probably have a more difficult time being versioned.  </p>
<p role="practice">Language Identification rule: Any Languages intended for versioning SHOULD have a version identification strategy</p>
<div2>
<head>Version Numbers</head>
<p>Having multiple versions naturally leads to the need to identify versions.  
Version identification has traditionally been done with a
decimal separating the major versions from the minor versions, ie "8.1",
"1.0". Often the definition of a "major" change is that it is incompatible,
and the definition of a "minor" change is that it is forwards- and/or backwards
- compatible. Usually the first broadly available version starts at "1.0". A
compatible version change from 1.0 might be identified as "1.1" and an
incompatible change as "2.0".  </p>
<p>The version numbers can be contained in the texts, in the protocol messages containing in the text, or the address for the protocol messages.  Some examples are shown below:
<example>
						<head>Name examples.  </head>
						<eg><![CDATA[<name version="2.0">
  <given>Dave</given>
  <family>Orchard</family>
</name>

<span class="fn20">Dave Orchard</span>

urn:nameschemev2:given:Dave:family:Orchard

<?XML version="1.1"?>

GET /name/123456789  HTTP/1.1

GET /name/v2/123456789/ HTTP 1.1]]></eg>
					</example>
</p>

<p>It should be noted that associating version number changes with compatibility changes may be idealistic as
there abundant cases where this system does not hold. New major version
identifiers are often aligned with product releases, or incompatible changes
identified as a "minor" change. A good example of an incompatible changed
identified as a minor change is XML 1.1. XML 1.0 processors cannot process all
XML 1.1 documents because XML 1.1 extended XML 1.0 where XML 1.0 does not allow
such extension.</p>

				<p>Unfortunately, version numbers often wind up looking very similar to
the big bang approach.  In many approaches, each language is given a version identifier, almost always a
number, that's incremented each time the language changes. Although
it's possible to design a system with version numbers that enables
both backward and forward compatibility - for example XSLT - typically
a version change is treated as if that the new language is not backwards
compatible with the old language.</p>
				<p>Some efforts, such as HTTP, try to have the best of both worlds
by allowing for extensibility (in HTTP's case, via headers) as well as
version numbers that explicitly identify when a new version is
backwards compatible with an old version.</p>
				<p>One argument in favor of version numbers is that they allow one to
determine what is a 'new version' and what is an 'old version'. But in
practice this is not necessarily true. For example, RSS has 0.9x, 1.x,
and 2.x versions, all being actively developed in parallel. In effect
the version numbers, even though they appear to be ordered, are simply
opaque identifiers. Using version numbers does not gaurantee that
version 1+x has any particular relationship to version 1.</p>
<p>Version numbers typically work best when versioning and extending a language is done in a centralized and linear manner.  The makeup of each version can then be consistent and well described. </p> 
</div2>
<div2>
<head>XML Namespaces</head>

<p>There are many cases where decentralized and non-linear versioning is desired.  The desire for decentralized and non-linear versioning and extensibility was a large motivator for XML and for XML Namespaces.  The self-describing and extensible nature of XML markup, and the addition of XML
Namespaces, provides a framework for developing
languages that can evolve in a decentralized manner.  XML Namespaces
[<loc href="#XMLNamespaces"> XML Namespaces 1.0</loc>] provide a mechanism for associating a
URI with an XML element or attribute name, thus specifying the
language of the name. This also serves to prevent name collisions.</p>
</div2>		
		</div1>
		<div1>
<head>Case Studies</head>
<div2>
<head>HTML</head>
<table>
<tbody>
<tr>
<th>Requirement</th>
</tr>
<tr>
<th>Language form</th>
<td>Markup</td>
</tr>
<tr>
<th>Schema Lang</th>
<td>DTD with changes</td>
</tr>
<tr>
<th>3rd party compatibly extend</th>
<td>Yes</td>
</tr>
<tr>
<th>3rd party incompatibly extend</th>
<td>No</td>
</tr>
<tr>
<th>Designer incompatibly extend</th>
<td>Yes</td>
</tr>
<tr>
<th>stand-alone</th>
<td>Yes</td>
</tr>
<tr>
<th>Schema design</th>
<td>Extensible</td>
</tr>
<tr>
<th>Substitution Mechanism</th>
<td>Must Ignore Unknowns</td>
</tr>
<tr>
<th>Component Identification</th>
<td>DTD + Name </td>
</tr>
<tr>
<th>Incompatible Ext identification</th>
<td>None</td>
</tr>

</tbody>
</table>
</div2>
<div2>
<head>XML</head>
<table>
<tbody>
<tr>
<th>Requirement</th>
</tr>
<tr>
<th>Language form</th>
<td>Markup</td>
</tr>
<tr>
<th>Schema Lang</th>
<td>Simple Extended Backus-Naur Form</td>
</tr>
<tr>
<th>3rd party compatibly extend</th>
<td>No</td>
</tr>
<tr>
<th>3rd party incompatibly extend</th>
<td>No</td>
</tr>
<tr>
<th>Designer incompatibly extend</th>
<td>Yes</td>
</tr>
<tr>
<th>stand-alone</th>
<td>Yes</td>
</tr>
<tr>
<th>Schema design</th>
<td>Backus-Naur without extensibility in XML 1.0 constructs</td>
</tr>
<tr>
<th>Substitution Mechanism</th>
<td>None</td>
</tr>
<tr>
<th>Component Identification</th>
<td>Name or Qualified Name</td>
</tr>
<tr>
<th>Incompatible Ext identification</th>
<td>N/A</td>
</tr>

</tbody>
</table>

</div2>
<div2>
<head>CSS</head>
</div2>

<div2>
<head>Microformats</head>
<table>
<tbody>
<tr>
<th>Requirement</th>
</tr>
<tr>
<th>Language form</th>
<td>text documentation</td>
</tr>
<tr>
<th>Schema Lang</th>
<td>depending upon microformat</td>
</tr>
<tr>
<th>3rd party compatibly extend</th>
<td>Yes</td>
</tr>
<tr>
<th>3rd party incompatibly extend</th>
<td>No</td>
</tr>
<tr>
<th>Designer incompatibly extend</th>
<td>Yes</td>
</tr>
<tr>
<th>stand-alone</th>
<td>No, embedded in HTML</td>
</tr>
<tr>
<th>Schema design</th>
<td>text description of HTML including class attribute values</td>
</tr>
<tr>
<th>Substitution Mechanism</th>
<td>HTML's Must Ignore Unknown</td>
</tr>
<tr>
<th>Component Identification</th>
<td>string in class attribute</td>
</tr>
<tr>
<th>Incompatible Ext identification</th>
<td>None</td>
</tr>

</tbody>
</table>

</div2>
</div1>
		<div1>
			<head>Extension versus Versioning</head>
			<p>Languages that are designed for decentralized extensibility, notably but not limited to XML, have the interesting situation where the distinction between an extension
and a version can be quite blurred, depending upon the language designer’s choices. 
</p>
			<p>The typical way of thinking of these two concepts is that
extension is typically the addition of components over space; that is,
designers other than the language’s creator are adding components. Versioning
is typically the addition of components over time, under the designer’s
explicit control. In either case, a change to the language may be done in a
compatible or an incompatible way. The simple cases of extensions are
compatible decentralized additions and versions are compatible or incompatible
centralized changes are how we typically distinguish the terms. But these
break down depending upon how the language is designed.</p>
			<p>There are a couple of scenarios that illustrate the
ambiguity in these terms. Imagine that version 1.0 of a Name consists of
"First" and "Last" elements. A 3rd party author extends the Name
with a "middle" element in a new namespace which they control.</p>
			<p>In scenario 1, the Name author decides to formally
incorporate the middle name as an optional (and hence compatible) addition to
the name, producing version 1.1 of the Name type. They do this by referring to
the third party’s definition for middle names. This is typically
considered a new "version" of the Name and would probably result in a new
definition. If the Name author re-uses the existing names for compatible
revisions, there will be no difference in a text containing
middle that is of Version 1.0 or Version 1.1 type. The texts are
the same, and thus the distinction between a "version" and an "extension" is
meaningless for an individual text.</p>
			<p>In scenario 2, the middle author decides that the middle
name is a mandatory part of the Name type. They were provided a mechanism for
indicating an incompatible change and they use it. Now an instance of Name
with the middle is incompatible with version 1.0 of the Name. What "version"
of the Name is this middle, and is the middle an "extension" or a "version"? 
It isn’t 1.0. It’s probably more accurately thought of as a version defined by
the 3rd party. Again, the presence of the "extension" is actually
an incompatible change.</p>
			<p>These two examples—a 3rd party extension
being added into a compatible version and a 3rd party extension
resulting in an incompatible version—show the ability to specify
(in)compatibility has blurred the distinction between these two terms.   </p>
		</div1>
		<div1>
			<head>Conclusion</head>
			<p>This Finding is intended to motivate language designers to plan for versioning and
			extensibility in the languages from the very first version.  It details the downsides of 
			ignoring versioning.  To help the language designer provide versioning in their language, 
			the finding describes a number of questions, decisions
and rules for using in language
construction and extension. The main goal of the set of rules is to allow
language designers to know their options for language design, and make backwards-
and forwards-compatible changes to their languages to achieve loose coupling
between systems should that desirable.</p>
		</div1>
		<div1>
			<head>References</head>
			<blist>
				<bibl id="FOLDOC" href="http://wombat.doc.ic.ac.uk/foldoc/" key="FOLDOC">
					<titleref>Free Online Dictionary of Computing</titleref>.
</bibl>
				<bibl id="FlexXMLP" href="http://www.upnp.org/download/draft-goland-fxpp-01.txt" key="FlexXMLP">
					<titleref>Flexible XML Processing Profile</titleref>.
</bibl>
				<bibl id="rfc793" href="http://www.ietf.org/rfc/rfc793.txt" key="tcp">
					<titleref>RFC 793, TCP</titleref>
				</bibl>
				<bibl id="rfc1521" href="http://www.ietf.org/rfc/rfc1521.txt" key="MIME">
					<titleref>RFC 1521, MIME</titleref>.
</bibl>
				<bibl id="rfc1866" href="http://www.ietf.org/rfc/rfc1866.txt" key="HTML 2.0">
					<titleref>RFC 1866, HTML 2.0</titleref>.
</bibl>
				<bibl id="WebDAVXMLIgnorePost" href="http://lists.w3.org/Archives/Public/w3c-dist-auth/1997AprJun/0190.html" key="WebDAV XMLIgnore post">Yaron Goland<titleref>XML Ignore proposed for WebDAV</titleref>
				</bibl>
				<bibl id="rfc2518" href="http://www.ietf.org/rfc/rfc2518.txt" key="WebDAV">
					<titleref>RFC 2518, WebDAV</titleref>
				</bibl>
								<bibl id="rfc2616" href="http://www.ietf.org/rfc/rfc2616.txt" key="HTTP">
					<titleref>RFC 2616, HTTP</titleref>
				</bibl>
				<bibl id="html40" href="http://www.w3.org/TR/1998/REC-html40-19980424/" key="HTML 4.0">
					<titleref>HTML 4.0</titleref>.
</bibl>
				<bibl id="TBL-MandExt" href="http://www.w3.org/DesignIssues/Mandatory.html" key="TBL Mandatory Extensions">Berners-Lee.
<titleref>Web Architecture: Mandatory extensions</titleref>.
</bibl>
				<bibl id="TBL-Extensible" href="http://www.w3.org/DesignIssues/Extensible.html" key="TBL Extensible languages">Berners-Lee.
<titleref>Web Architecture: Extensible languages</titleref>.
</bibl>
				<bibl id="TBL-Evolution" href="http://www.w3.org/DesignIssues/Evolution.html" key="TBL Evolution">Berners-Lee.
<titleref>Web Architecture: Evolvability</titleref>.
</bibl>
				<bibl id="Note-extlang" href="http://www.w3.org/TR/1998/NOTE-webarch-extlang-19980210" key="Web Architecture: Extensible Languages">Berners-Lee and Connolly, ed.
<titleref>Web Architecture: Extensible Languages</titleref>
World Wide Web Consortium, 1998.</bibl>
				<bibl id="WD-doctypes" href="http://www.w3.org/MarkUp/WD-doctypes" key="HTML Document types">Connolly, ed.
<titleref>HTML Document dialects</titleref>
World Wide Web Consortium, 1996.</bibl>
				<bibl id="soap12" href="http://www.w3.org/TR/SOAP/" key="SOAP 1.2">
					<titleref>W3C
Recommendation, SOAP 1.2 Part 1: Messaging Framework</titleref>
				</bibl>
				<bibl id="versioning-terminology" href="http://www.w3.org/2001/tag/doc/versioning" key="Versioning">
					<titleref>Unapproved DRAFT TAG Finding, Versioning: Terminology</titleref>
				</bibl>
				<bibl id="wsdl11" href="http://www.w3.org/TR/WSDL/" key="WSDL 1.1">
					<titleref>W3C Note, WSDL 1.1</titleref>
				</bibl>
				<bibl id="ws-policy" href="http://www.w3.org/Submissions/WS-Policy/" key="WS-Policy 1.2">
					<titleref>W3C Note, WS-Policy 1.2</titleref>
				</bibl>
				<bibl id="XML1-0" href="http://www.w3.org/TR/REC-xml" key="XML 1.0">
					<titleref>W3C Recommendation, XML 1.0</titleref>
				</bibl>
				<bibl id="Xinclude" href="http://www.w3.org/TR-Xinclude" key="XInclude">
					<titleref>W3C Working Draft, XML Inclusions</titleref>
				</bibl>
				<bibl id="XMLNamespaces" href="http://www.w3.org/TR/REC-xml-names" key="XML Namespaces">
					<titleref>W3C Recommendation, XML Namespaces</titleref>
				</bibl>
				<bibl id="XMLSchemaPart2" href="http://www.w3.org/TR/xmlschema-2" key="XML Schema Part 2">
					<titleref>W3C Recommendation, XML Schema, Part 2</titleref>
				</bibl>
				<bibl id="XMLSchemaWildcardTestCollection" href="http://www.w3.org/XML/2001/05/xmlschema-test-collection/result-ms-wildcards.htm" key="XML Schema Wildcard Test Collection">
					<titleref>XML Schema Wildcard Test collection</titleref>
				</bibl>
				<bibl id="XFrontSchemaBestPractices" href="http://www.xfront.com/BestPracticesHomepage.html" key="XFront Schema Best Practices">
					<titleref>XFront Schema Best Practices</titleref>
				</bibl>
				<bibl id="XMLDOTCOMSchemaDesignPatterns" href="http://www.xml.com/pub/a/2002/07/03/schema_design.html" key="XML.com Schema Design Patterns">Dare Obasanjo<titleref>XML.com Schema design patterns</titleref>
				</bibl>
				<bibl id="daveowritings" href="http://www.pacificspirit.com/Authoring/Compatibility" key="Dave Orchard writings on Extensibility and Versioning">
					<titleref>Dave Orchard writings on extensibility and versioning</titleref>
				</bibl>
			</blist>
		</div1>
		<div1 id="ack">
			<head>Acknowledgements</head>
			<p>The author thanks Norm Walsh for many contributions as co-editor until 2005.  Also thanks the many reviewers that have
contributed to the document particularly David Bau, William Cox, Ed Dumbill,
Chris Ferris, Yaron Goland, Rhys Lewis, Hal Lockhart, Mark Nottingham, Jeffrey Schlimmer,
Cliff Schmidt, and Norman Walsh.</p>
		</div1>
	</body>
	<back>
	<inform-div1 id="changelog">
			<head>Change Log</head>
			<table border="1">
				<caption>Changes</caption>
				<thead>
					<tr>
						<th>Who</th>
						<th>When</th>
						<th>What</th>
					</tr>
				</thead>
				<tbody>
					<tr>
						<td>DBO</td>
						<td>20070518</td>
						<td>Incorporated Rhys' comments, added version identifier story to forwards compatible evolution, split part 1 into terminology and strategies documents.</td>
					</tr>
				</tbody>
			</table>
		</inform-div1>
	</back>
</spec>
