Browse RC.6 documentation
RC.6 Documentation revision 18

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:

FileProfile and purpose
ait-release.jsongeneric-command: reusable release adapter for one package with one or more components.
ait-release-family.jsonfamily: 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#

Code · 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#

FieldContract
schemaExact string ait.release.adapter/v1.
packageRequired object.
package.nameRequired nonempty bounded single-line string.
package.versionRequired nonempty bounded single-line string.
package.descriptionOptional string or null.
package.license_filesOptional array of one through eight rows.
license_files[].pathNormalized relative path to a file in the release source. Paths must be unique.
license_files[].roleExact license or notice; each role can occur at most once.
componentsRequired array of one through 64 component objects.

Component fields#

FieldContract
idRequired identifier, unique across components.
ecosystemRequired identifier describing the component toolchain.
working_directoryRequired normalized relative directory, or . for the root. It must exist in the source Snapshot.
dependency_filesOne through 64 unique normalized paths relative to working_directory; every file must exist.
commandsRequired object containing only prepare, test, build, and smoke.
artifactsOne 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:

Code · text
$AIT_RELEASE_ID
$AIT_RELEASE_VERSION
$AIT_RELEASE_COMPONENT
$AIT_RELEASE_ECOSYSTEM
$AIT_RELEASE_TARGET
$SOURCE_DATE_EPOCH

The 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#

FieldContract
pathRequired normalized relative output path, unique within the component.
kindRequired identifier such as native-executable, python-wheel, or another adapter-defined kind.
targetOptional 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.

Code · json
{
  "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#

FieldContract
schemaExact string ait.release.family/v3.
family.nameRequired identifier.
family.versionStable MAJOR.MINOR.PATCH or RC MAJOR.MINOR.PATCH-rc.N, matching channel.
family.channelExact rc or stable.
family.tagExact v plus family.version.
targetsOne through 32 unique target identifiers.

Components#

components contains one through 64 unique component objects.

FieldContract
idRequired unique component identifier.
source_repositoryRequired 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_snapshotRequired valid exact Snapshot ID.
ecosystemRequired identifier.
licenseRequired bounded SPDX-style expression.
version_schemefamily or pep440.
versionMust equal the family version for family, or its canonical PEP 440 mapping for pep440.
artifactsOne through 32 unique artifact requirements.
artifacts[].kindRequired artifact-kind identifier.
artifacts[].targetsUnique 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.

FieldContract
channelgithub, pypi, npm, oci, homebrew, apt, or winget.
roleproduct, standalone, or implementation.
identityRequired bounded distribution identity; the channel/identity pair must be unique.
componentsOne through 64 declared component IDs.
targetsOne 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.

FieldContract
modelExact release-monorepo.
identityExact official public-source identity weita2026/ait-native.
product_documentExact docs/distribution.md.
family_manifestExact ait-release-family.json.
mapping_manifestExact ait-monorepo-source.json.
build_entrypoints.unixExact build-release.sh.
build_entrypoints.windowsExact build-release.ps1.
build_entrypoints.implementationExact build-release.mjs.
subtreesOne row for every source Repository used by the components.
subtrees[].source_repositoryDeclared source Repository.
subtrees[].pathExact same-named public directory.
subtrees[].transformsOrdered allowlisted transform IDs applied to that subtree.
transformsExact transform definitions required by the selected source Repository set.
transforms[].idBounded ASCII ID ending in /v1.
transforms[].source_repositoryOwning source Repository.
transforms[].path, from, toExact 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_snapshot without 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 release command reference to create, check, build, and inspect release evidence; do not hand-author output receipts.

Version authority

Checked against the exact RC.6 source

This page is public documentation, not a second product contract. Use the exact source and distribution contract for release authority.

Owning component Snapshots
  • ait-coreSNP-8C859807E799
  • ait-serverSNP-25FF61FEEA4C
  • ait-runnerSNP-E50374CBA6E6
  • ait-pythonSNP-DF2C871D5400
  • ait-nodeSNP-46BB35869747