//Licensed under the Apache License, Version 2.0 (the "License");
//you may not use this file except in compliance with the License.
//You may obtain a copy of the License at
//
//http://www.apache.org/licenses/LICENSE-2.0
//
//Unless required by applicable law or agreed to in writing, software
//distributed under the License is distributed on an "AS IS" BASIS,
//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//See the License for the specific language governing permissions and
//limitations under the License.
= Podling Name Search Guide
Apache Incubator PMC
2002-10-16
:jbake-type: guide
:jbake-status: published
:idprefix:
:toc:
:imagesdir: ../images/
== Introduction

This guide is *not* _legal advice_ or _legal opinion_: 
*do not* use it as a substitute. 
Its aims are education and information *only*. 

This process filters out unsuitable names early, 
reducing the legal resources required and
limiting the potential disruption to a community of a forced name change 
later. A smooth path, but not the only one. If there are reasons
why this road isn't right for your podling, 
consult link:http://mail-archives.apache.org/mod_mbox/incubator-general/[incubator general].

=== Meet The Apache Branding Team

Names link:http://www.apache.org/foundation/marks/#whoweare[fall] within the responsibilities of the 
link:http://www.apache.org/foundation/[V.P., Brand Management] (and 
link:http://www.apache.org/foundation/marks/#whoweare[team]). Please start by reading:

- the link:http://www.apache.org/foundation/marks/[Apache Trademark Policy] (which introduces trademarks and outlines our policy);
- the link:http://www.apache.org/foundation/marks/faq/[Apache Trademark FAQs] (which answers questions asked by downstream consumers); and
- the link:http://www.apache.org/foundation/marks/pmcs.html[Apache Project Branding Requirements] (which guides PMCs).

For podlings in the Incubator, naming issues are managed co-operatively by the Brand and Incubator communities.
Rules for podlings include all branding requirements for PMCs, plus a few extras. 

=== Trademarks

Trademark law is a complex subject. 
Distinctive differences from other intellectual property laws (such as patent or copyright) mean that 
intuition or knowledge gained from other areas may not be applicable. 
The link:http://www.apache.org/foundation[Apache Software Foundation] is 
a link:http://www.apache.org/foundation/faq.html#is-ASF-a-corporation[US corporation]. 
Developing some understanding of the basic principles of US trademark law is therefore important.

Please read:

- link:http://www.apache.org/foundation/marks/#principles[Description of key trademark principles] for Apache projects;
- USPTO trademark
 - link:http://www.uspto.gov/trademarks/index.jsp[home] page
 - link:http://www.uspto.gov/trademarks/basics/index.jsp[basics], and follow the links for materials;
- link:http://en.wikibooks.org/wiki/US_Trademark_Law[US Trademark Law] WikiBook; and
- link:http://www.ifosslr.org/ifosslr/article/view/11/37[Passport Without A Visa: Open Source Software Licensing and Trademarks] by Tiki Dare and Harvey Anderson in the link:http://www.ifosslr.org/[International Free and Open Source Software Law Review].

==== Trademarks And The Apache License

Like link:http://www.ifosslr.org/ifosslr/article/view/11/37[many] 
link:http://www.opensource.org[open source] licenses, the
link:http://www.apache.org/licenses/LICENSE-2.0.html[Apache License, Version 2.0]
focuses on granting copyright and patent rights to the public. 
The _trademark_ section permits only very limited trademark rights.

[quote]
""
*6. Trademarks.*
This License does not grant permission to use the trade names, trademarks, 
service marks, or product names of the Licensor, except as required for 
reasonable and customary use in describing the origin of the Work and 
reproducing the content of the NOTICE file."
""
-- link:http://www.apache.org/licenses/LICENSE-2.0.html#trademarks[Apache License, Version 2.0]

All Apache projects share the Apache License. This issues standard *copy* 
and *patent* rights to 
downstream consumers. *Trademark* rights for Apache products are issued and managed independently, 
beyond the Apache License. This allows Apache communities to use trademark law to protect their reputation and that of the 
link:http://www.apache.org/foundation/[Foundation], within the broader
framework provided by the Brand team.

=== What Makes A Name Good
Good names for commercial products or _UNIX_ utilities have tended to work less well here at Apache.
Many successful Apache project names are memorable, unusual and a little 
link:http://www.sdtimes.com/TOP_FIVE_HEAD_SCRATCHINGEST_NAMES_FOR_APACHE_PROJECTS/By_Victoria_Reitano/About_APACHE_and_HADOOP_and_HARMONY_and_MYSQL_and_OODT_and_YAY/35959[whimsical].
These qualities also happen to be useful when it comes to securing trademark protection.
Have fun. Be creative.

=== Podling Suitable Name Search

The initial link:http://incubator.apache.org/guides/proposal.html[proposal] 
establishes a working name for the new podling.
Often some discussion and filtering of suitable names happens during the election
process but this proposed name is *not* final, only _provisional_. 
The community may choose to change it. Or the community may discover that the name is unsuitable:
in which case a suitable new name must be found. 

A podling needs to discover whether a name is suitable.
The Incubator community calls this process the _suitable name search_. 
This avoids any potential confusion with phrases like
_trademark search_ with technical meanings in the trademark community. 
Please be careful with language. In particular:

- avoid using loaded technical legal terms;
- use plain, simple English to describe what you did and what you found;
- avoid speculation; and
- don't offer _advice_ or _opinions_.

A suitable name search must be successfully completed before a podling can graduate.
This isn't the only way one might be done, just a smooth path.

Names are an essential part of building a brand and community. 
Switching names wastes the efforts put into establishing the original name.
Therefore complete this task as soon as possible.

== Conducting A Suitable Name Search

The aim - to find a name that is acceptable to the community and is not unsuitable.

A suitable name search has public and private elements. 
The link:https://issues.apache.org/jira/browse/PODLINGNAMESEARCH[tracker] provides the public record.
Incubator best practice evolves over time, documentation lags.
The public records of past searches are a primary source of guidance. 
Review now the records of previous searches, beginning with the most recent then working back.

The public record consists of _actions_ (how you searched) and _facts_ (what your search found). In particular,
in *all* public forums (mailing lists, issue trackers and so on):


-*Do not* speculate.
-*Do not* use loaded technical legal language. 
-*Do not* offer 
 -opinions,
 -advice,
 -interpretation, or
 -analysis.

Use the public lists in the Incubator to ask questions about _how_ the search should be conducted. 
Once the information is collected and collated, then ask the trademark team to help interpret and analyse these results
on the private lists, copying in the PPMC. Finally discuss the results of your investigation on the private PPMC list. 
Whether a name is suitable or unsuitable (or somewhere in between) should be recorded when the issue is closed.

=== Eliminate Unsuitable Names
To be suitable, a name needs to be

- judged _appropriate_ by the wider community; and
- _unique enough_ to avoid confusion

Facts and activities performed are link:https://issues.apache.org/jira/browse/PODLINGNAMESEARCH[recorded] for the public.
Interpretation and analysis of these facts happens on private mailing lists, the PPMC private in the first instance. 
Whether the name proved suitable or unsuitable should be entered into the public record 
but take care to use our language (_ethically unsuitable_ or 
_not unique enough_) and to avoid loaded legal terms.


==== The Main Sequence

Every podling is unique, but using a link:http://outreach.atnf.csiro.au/education/senior/astrophysics/stellarevolution_mainsequence.html[cosmic]
metaphor, most fit into a main sequence. For podlings on the main sequence,
most of the bugs should have been squashed and rough edges documented away, so expect a smooth journey. 
Away from the main sequence, process may need to be grown, documentation is likely be sparse
and progress less smooth. 

The main sequence is described here. This well known path is
appropriate for almost all podlings.
If there are good reasons to think that your podling is a special case, discuss this with the
link:http://mail-archives.apache.org/mod_mbox/incubator-general/[Incubator community]
and reach consensus on the way forward.

==== Appropriateness

Some names are not appropriate for open source projects. 
Acceptability under 
link:http://www.law.cornell.edu/uscode/15/1052.shtml[US Trademark Law] is a good base line. 
This excludes marks that

[quote]
____
Consists of or comprises immoral, deceptive, or scandalous matter;
or matter which may disparage or falsely suggest a connection with persons, 
living or dead, institutions, beliefs, or national symbols, or bring them into contempt, or disrepute; 
____
-- link:http://www.law.cornell.edu/uscode/15/1052.shtml[US Code 15:1052]

Proposals with inappropriate names are unlikely to pass the initial hustings but spend a few moments considering 
whether anything has been missed. Check for alternative meanings, perhaps in foreign languages.

==== Unique Enough Names

The name needs be unique enough to avoid confusion with software that already exists. 
For the community to be able to protect its reputation for quality and openness,
its name needs to unique enough to have potential as a trademark.

But this isn't only about being able to register trademark protection.
Ethics also plays a role. Even where a name may offer enough protection, existing adoption 
of the name by an active community may mean that the choice needs to be eliminated on ethical grounds. 
There is some judgment involved in this decision. So, involve the wider Incubator community if a name is already
used.

==== How To Collect Evidence Of Uniqueness

To decide whether a potential name is _unique enough_ to be suitable

- Collect evidence about current name usage.
- link:https://issues.apache.org/jira/browse/PODLINGNAMESEARCH[Record] the facts.
- Analyse and interpret these facts; in private with help from the brand team.
- Reach consensus about whether the name is unique enough.
- link:https://issues.apache.org/jira/browse/PODLINGNAMESEARCH[Record] whether the name is suitable.
- If unsuitable then the community should pick a more unique name and repeat this process.

==== Evidence Of Open Source Adoption

Existing adoption amongst another active open source community may give ethical 
reasons for eliminating a name. This is an example of a condition with a fractal 
boundary. Not every name which has been used before need be eliminated as unsuitable
but this is an issue which needs to be discussed more widely and
a consensus reached with the broad 
link:http://mail-archives.apache.org/mod_mbox/incubator-general/[Incubator community]. 

Look for evidence of existing adoption amongst open source communities by searching well known
foundries (for example link:http://www.github.com[GitHub] and 
link:http://www.sourceforge.net[Sourceforge]) 
and the web (use several search engines for example link:http://www.bing.com[Bing],
link:http://www.google.com[Google] and link:http://www.yahoo.com[Yahoo]).
Review recent link:https://issues.apache.org/jira/browse/PODLINGNAMESEARCH[records]
for contemporary details about where to search.
link:https://issues.apache.org/jira/browse/PODLINGNAMESEARCH[Record] each search and describe the results.  

If the name been used by the same community before it arrived at Apache, that's fine but should be noted in the 
link:https://issues.apache.org/jira/browse/PODLINGNAMESEARCH[record].

=== Evidence Of Registration

A number of online resources exist which may help to discover evidence of 
competing registered trademarks.
Not every trademark is registered. Not every registered trademark is listed in these resources.
Even if evidence is found of existing registrations, 
this does not necessary eliminate the proposed name. Just 
link:https://issues.apache.org/jira/browse/PODLINGNAMESEARCH[record] the facts.
Leave analysis and interpretation to private lists. 
When a search returns a large number of hits, focus on live registrations related to software.
 
The foremost online resource is TESS run by USPTO. Before using
TESS, please browse the documentation links from 
link:http://www.uspto.gov/trademarks/index.jsp[USPTO trademark home].

Other resources which allow cheap searches of their databases exist but are often
ephemeral. Review the link:https://issues.apache.org/jira/browse/PODLINGNAMESEARCH[records]
for the state of this art.

==== Evidence Of Use On The World Wide Web

Registration of trademark is not required. Rights may also be obtained by use of a mark in commerce.

Use a variety of web search engines (for example, link:http://www.bing.com[bing], link:http://www.google.com[google]
and link:http://search.yahoo.com[yahoo]) to survey usage on the world wide web.

Search for:

- The name itself (e.g., `Cassandra`).  The results returned by a search for the name itself may provide evidence of well known usages of the term.
- The name, plus `software`. The results returned by searching for `Cassandra software` may provide evidence of existing use in trade.
- The name, plus key functionality the software provides: e.g., `Cassandra "big data"`.
- The name, plus `open source`: e.g., `Cassandra open source`.
