Appendix: Release Manifests
Expand the generic command-adapter and specialized AIT native-family release manifest schemas, bounds, and ownership rules.
Audience: Release engineers and package maintainers
Release manifests#
RC.6 has two release manifest contracts with different scope:
| File | Profile and purpose |
|---|---|
ait-release.json | generic-command: reusable release adapter for one package with one or more components. |
ait-release-family.json | family: specialized coordinator for the official AIT native release family. |
Both files are read from the recorded release-source Snapshot. Unknown fields are rejected, paths are normalized repository-relative paths, and declarations are checked against the files actually present in that Snapshot.
Generic adapter: ait-release.json#
{
"schema": "ait.release.adapter/v1",
"package": {
"name": "sample-tool",
"version": "1.2.0",
"description": "Portable sample package.",
"license_files": [
{"path": "LICENSE", "role": "license"},
{"path": "NOTICE", "role": "notice"}
]
},
"components": [
{
"id": "cli",
"ecosystem": "native",
"working_directory": ".",
"dependency_files": ["Cargo.toml", "Cargo.lock"],
"commands": {
"prepare": [],
"test": [["cargo", "test", "--locked"]],
"build": [["cargo", "build", "--release", "--locked"]],
"smoke": [["target/release/sample-tool", "--version"]]
},
"artifacts": [
{"path": "target/release/sample-tool", "kind": "native-executable"}
]
}
]
}Root and package fields#
| Field | Contract |
|---|---|
schema | Exact string ait.release.adapter/v1. |
package | Required object. |
package.name | Required nonempty bounded single-line string. |
package.version | Required nonempty bounded single-line string. |
package.description | Optional string or null. |
package.license_files | Optional array of one through eight rows. |
license_files[].path | Normalized relative path to a file in the release source. Paths must be unique. |
license_files[].role | Exact license or notice; each role can occur at most once. |
components | Required array of one through 64 component objects. |
Component fields#
| Field | Contract |
|---|---|
id | Required identifier, unique across components. |
ecosystem | Required identifier describing the component toolchain. |
working_directory | Required normalized relative directory, or . for the root. It must exist in the source Snapshot. |
dependency_files | One through 64 unique normalized paths relative to working_directory; every file must exist. |
commands | Required object containing only prepare, test, build, and smoke. |
artifacts | One through 128 artifact rows. |
Command phases#
Each command is an argv array, not a shell string. test and build are required and each must contain one through 16 commands. prepare and smoke are optional and may contain zero through 16 commands. Every command contains one through 64 string arguments; the executable argument cannot be blank.
Commands run directly without an implicit shell. RC.6 replaces only an exact whole argv value matching one of these tokens:
$AIT_RELEASE_ID
$AIT_RELEASE_VERSION
$AIT_RELEASE_COMPONENT
$AIT_RELEASE_ECOSYSTEM
$AIT_RELEASE_TARGET
$SOURCE_DATE_EPOCHThe tokens are not substring interpolation and do not authorize arbitrary environment expansion. Newlines, carriage returns, and NUL characters are rejected in argv values.
Artifact fields#
| Field | Contract |
|---|---|
path | Required normalized relative output path, unique within the component. |
kind | Required identifier such as native-executable, python-wheel, or another adapter-defined kind. |
target | Optional identifier. Absence marks a portable artifact; a value associates the artifact with one release target. |
The selected build must produce every declared artifact as an exact regular file. A target selection includes matching target artifacts; the portable selection includes only artifacts without a target.
Generic bounds#
The manifest is limited to 1 MiB. Identifiers start with an ASCII letter or digit and then use letters, digits, ., _, or -. Text fields are bounded single-line strings. Relative paths use /, cannot be absolute, and cannot contain empty, ., or .. segments, drive prefixes, colons, or backslashes.
AIT family coordinator: ait-release-family.json#
This is not a generic multi-project manifest. Contract ait.release.family/v3 coordinates the official AIT native components, targets, public-source projection, and distribution identities.
{
"schema": "ait.release.family/v3",
"family": {
"name": "ait-native",
"version": "1.0.0-rc.6",
"channel": "rc",
"tag": "v1.0.0-rc.6"
},
"targets": ["aarch64-apple-darwin", "x86_64-unknown-linux-gnu"],
"public_source": {},
"components": [],
"distributions": [],
"compatibility": {}
}The empty objects and arrays above show the root shape only; they are not a valid release. A real family manifest must satisfy all relationships below.
Family identity and target matrix#
| Field | Contract |
|---|---|
schema | Exact string ait.release.family/v3. |
family.name | Required identifier. |
family.version | Stable MAJOR.MINOR.PATCH or RC MAJOR.MINOR.PATCH-rc.N, matching channel. |
family.channel | Exact rc or stable. |
family.tag | Exact v plus family.version. |
targets | One through 32 unique target identifiers. |
Components#
components contains one through 64 unique component objects.
| Field | Contract |
|---|---|
id | Required unique component identifier. |
source_repository | Required source Repository identifier. In v3 public-source mode it must be one of ait-core, ait-server, ait-runner, ait-python, or ait-node. |
source_snapshot | Required valid exact Snapshot ID. |
ecosystem | Required identifier. |
license | Required bounded SPDX-style expression. |
version_scheme | family or pep440. |
version | Must equal the family version for family, or its canonical PEP 440 mapping for pep440. |
artifacts | One through 32 unique artifact requirements. |
artifacts[].kind | Required artifact-kind identifier. |
artifacts[].targets | Unique target identifiers from the root matrix. An empty array means one portable artifact of that kind. |
The tuple of artifact kind and target must not be duplicated within a component.
Distributions#
distributions contains one through 128 rows. Every component must be covered by at least one distribution.
| Field | Contract |
|---|---|
channel | github, pypi, npm, oci, homebrew, apt, or winget. |
role | product, standalone, or implementation. |
identity | Required bounded distribution identity; the channel/identity pair must be unique. |
components | One through 64 declared component IDs. |
targets | One through 32 targets from the family matrix. Each selected component must provide that target or a portable artifact. |
public_source#
The v3 public-source object is deliberately exact because it produces one reviewable release monorepo.
| Field | Contract |
|---|---|
model | Exact release-monorepo. |
identity | Exact official public-source identity weita2026/ait-native. |
product_document | Exact docs/distribution.md. |
family_manifest | Exact ait-release-family.json. |
mapping_manifest | Exact ait-monorepo-source.json. |
build_entrypoints.unix | Exact build-release.sh. |
build_entrypoints.windows | Exact build-release.ps1. |
build_entrypoints.implementation | Exact build-release.mjs. |
subtrees | One row for every source Repository used by the components. |
subtrees[].source_repository | Declared source Repository. |
subtrees[].path | Exact same-named public directory. |
subtrees[].transforms | Ordered allowlisted transform IDs applied to that subtree. |
transforms | Exact transform definitions required by the selected source Repository set. |
transforms[].id | Bounded ASCII ID ending in /v1. |
transforms[].source_repository | Owning source Repository. |
transforms[].path, from, to | Exact allowlisted path rewrite tuple for that transform ID. |
The current allowlist contains only the sibling-core path projections required by the runner and Python source subtrees. Arbitrary source rewriting is not a manifest extension mechanism. The one GitHub product distribution must use the same public identity and cover every family component and target.
Compatibility map#
compatibility is a required object with at most 64 entries. Each key is an identifier and each value is a nonempty bounded single-line string. It records consumer-facing compatibility facts; it does not replace component versions, Snapshot pins, or the target matrix.
Review boundary#
- Record manifest edits in the same Snapshot as the referenced source and dependency-file changes.
- Never update a component
source_snapshotwithout reviewing its admitted artifacts, license, version, and distribution coverage. - Keep generated candidate, check, build, frozen, promotion, checksum, mapping, and receipt files out of this authoring reference. They are release outputs, not additional user configuration files.
- Use the complete
ait releasecommand reference to create, check, build, and inspect release evidence; do not hand-author output receipts.