Team Topologies Team Topologies is the leading approach to organizing business and technology teams for fast flow, providing a practical, step-by‑step, adaptive model for organizational design and team interaction. .
One of the concepts from Team Topologies is the introducation of a Team API which helps teams to capture and improve their clarity of purpose.
The TeamAPI Specification is an attempt at codifying the Team API template into a machine readable definition that can be can then be used to generate documentation and visualizations of how the teams within your organization are interacting and how that changes over time.
- Definitions
- Specification
Stream-aligned teams should aim to produce a steady flow of feature delivery, with end-to-end responsibility for a service or application.
Platform teams provide the underlying internal services required by stream-aligned teams to deliver higher level services or functionalities, thus reducing extraneous cognitive load.
Enabling teams help stream-aligned teams detect and acquire missing capabilities but do not own services themselves.
Complicated subsystem teams off-load work from stream-aligned teams on particularly complicated subsystems.
Facilitating is where one team helps another and is the main operating model for enabling teams. This mode is used to help clear impediments and help discover gaps or inconsistencies in existing components and services used by other teams. There should be a focus on the quality of interaction between other teams. Like the Collaboration mode, Facilitating is a temporary interaction mode - the interaction should generally last for no more than a few weeks.
Collaboration is where teams work closely with other teams with different skill sets for a defined period of time (usually a few weeks). This is typically used when a high degree of adaptability or discovery is needed.
X-as-a-service (XaaS) is a natural interaction model after collaboration has discovered suitable boundaries. XaaS provides clear ownership of a service with a smaller cognitive load for teams consuming the service. It is important that this interaction mode provides a good developer experience and the service being consumed should generally be managed as [part of] a product.
The files describing team interactions in accordance with the TeamAPI Specification are represented as JSON objects and conform to the JSON standards. YAML, being a superset of JSON, can be used as well to represent a TAS (TeamAPI Specification) file.
For example, if a field is said to have an array value, the JSON array representation will be used:
{
"field" : [...]
}
While the API is described using JSON it does not impose a JSON input/output to the API itself.
All field names in the specification are case sensitive.
In order to preserve the ability to round-trip between YAML and JSON formats, YAML version 1.2 is recommended along with some additional constraints:
- Tags MUST be limited to those allowed by the JSON Schema ruleset
- Keys used in YAML maps MUST be limited to a scalar string, as defined by the YAML Failsafe schema ruleset
An TeamAPI document MAY be made up of a single document or be divided into multiple, connected parts at the discretion of the author. In the latter case, Reference Objects are used.
By convention, the TeamAPI Specification (TAS) file is named TeamAPI.json
or TeamAPI.yaml
.
This is the root document object for the API specification. It combines resource listing and API declaration together into one document.
Field Name | Type | Description |
---|---|---|
teamapi | TeamAPI Version String | Required. Specifies the TeamAPI Specification version being used. It can be used by tooling Specifications and clients to interpret the version. The structure shall be major .minor .patch , where patch versions must be compatible with the existing major .minor tooling. Typically patch versions will be introduced to address errors in the documentation, and tooling should typically be compatible with the corresponding major .minor (1.0.*). Patch versions will correspond to patches of this document. |
info | Info Object | Required. Core information about the team including their focus and fundamental team type. |
channels | [Channels Object] | A list of any channels that can be used to contact the team. |
searchTerms | [Search Terms] | Any terms specific to this team that people might use to search for. |
platform | Platform Object | If this is present, indicates that this team is part of a wider platform. |
services | [Services Object] | A list of any software, services or products that is currently owned by the team. |
work | Work Object | Details of the type of work the team takes part in. |
meetings | [Meetings Object] | A list of meetings that the team currently takes part in. |
interactions | [Interaction Object] | Team interactions that the team currently take part in. |
dependencies | [Dependency Object] | A list of other teams that the team have a dpendency on. |
This object can be extended with Specification Extensions.
The version string signifies the version of the TeamAPI Specification that the document complies to.
The format for this string must be major
.minor
.patch
. The patch
may be suffixed by a hyphen and extra alphanumeric characters.
A major
.minor
shall be used to designate the TeamAPI Specification version, and will be considered compatible with the TeamAPI Specification specified by that major
.minor
version.
The patch version will not be considered by tooling, making no distinction between 1.0.0
and 1.0.1
.
In subsequent versions of the TeamAPI Specification, care will be given such that increments of the minor
version should not interfere with operations of tooling developed to a lower minor version. Thus a hypothetical 1.1.0
specification should be usable with tooling designed for 1.0.0
.
Core information about the team including their focus and fundamental team type
Field Name | Type | Description |
---|---|---|
name | string |
Required. The name of the team. |
focus | string |
The core focus/goal of the team |
type | string |
stream-aligned, platform, complicated-subsystem, enabling. |
info:
name: Example stream A
focus: Core focus of the team
type: stream-aligned
A channel that can be used to contact the team
Field Name | Type | Description |
---|---|---|
type | string |
Required. The type of the communication channel. |
name | string |
Required. The name of the communication channel. |
channels:
- type: slack
name: example-stream-a
A term that can be used to find information about the team and it's products on an internal wiki or similar.
Field Name | Type | Description |
---|---|---|
term | string |
Required. The searchable term. |
searchTerms:
- term: Example team search term
If this is present, indicates that this team is part of a wider platform.
Field Name | Type | Description |
---|---|---|
$ref | string |
Required. A reference to the team api for the platform team that this team is part of |
platform:
- $ref: https://github.com/example.com/example-platform-team/teamapi.yml
Describes any software, services or products that is currently owned by the team.
Field Name | Type | Description |
---|---|---|
name | string |
Required. The name of the software owned by this team |
url | string |
A url to documentation describing the software |
versioning | Versioning Object | Details of the way in which this product is versioned |
repository | string |
A url to the repository containing source code for this service |
services:
- name: Example Service A
url: https://anexampleservice.com
versioning:
type: semantic
repository: https://github.com/example.com/example-service-a
Details of the way in which a service, subsystem or product is versioned.
Field Name | Type | Description |
---|---|---|
type | string |
Required. The versioning strategy employed i.e. semantic etc |
versioning:
type: semantic
Details of the type of work the team takes part in.
Field Name | Type | Description |
---|---|---|
services | Work Service Object | A list of services, software, products that the team is currently working on |
waysOfWorking | Ways Of Working Object | A list of the ways in which the team currently works |
crossTeam | CrossTeamWorkObject | A list of the cross-team work or improvements that the team currently takes part in |
versioning:
type: semantic
Details of a service that the team is currently working on.
Field Name | Type | Description |
---|---|---|
name | string |
The name of the service being worked on |
$ref | string |
A reference to the service being worked on |
work:
services:
- name: Improve the example service a
$ref: https://github.com/example.com/example-service-a
Details of how a team is working.
Field Name | Type | Description |
---|---|---|
name | string |
The name of the way of working |
$ref | string |
A reference to details about the way of working |
work:
waysOfWorking:
- name: Lean
$ref: https://example.internal-wiki.com/ways-of-working/lean
Details of meetings that the team attends.
meetings:
- purpose: daily sync
dayOfWeek: Wednesday
timeOfDay: 09:00
durationMinutes: 15
Details of team interactions that the team currently take part in
interactions:
- team-name: Example Platform Team
mode: X-as-a-service
purpose: The purpose of the interaction
startDate: 01/01/2022
expectedDuration: 3
expectedDurationUnit: months
$ref: https://github.com/example.com/example-platform-team/teamapi.yml
- team-name: Automation Test Enabling Team
mode: Facilitating
purpose: Introduce automation tests into the example service
startDate: unknown
$ref: https://github.com/example.com/automation-test-team/teamapi.yml
Details of dependencies on other teams that the team has
dependencies:
- team-name: Example stream b
description: We currently rely on example stream b to make changes to component X.
type: Blocking
$ref: https://github.com/example.com/example-stream-b-team/teamapi.yml
- teamName: Example Platform Team
description: We use the platform team to provide CI/CD services
type: OK
$ref: https://github.com/example.com/example-platform-team/teamapi.yml