feat(spec): add Lifecycle official extension (resolves #65) - #97
Open
marianogonzalez wants to merge 1 commit into
Open
feat(spec): add Lifecycle official extension (resolves #65)#97marianogonzalez wants to merge 1 commit into
marianogonzalez wants to merge 1 commit into
Conversation
Resolves Agent-Card#65 by adding an official extension — https://ai-catalog.org/extensions/lifecycle — rather than a native `lifecycle` field on the Catalog Entry as the original issue proposed. An entry carries `version` (which revision this is) and `updatedAt` (when the entry last changed) but nothing that expresses where that revision sits in its lifecycle: whether it is a preview, generally available, deprecated with a scheduled end-of-life, or already retired — nor how a consumer should migrate off it. The extension lets a publisher advertise that state on a per-version entry so a consumer can filter deprecated or retired artifacts at discovery, plan around a known end-of-life, and follow a producer-supplied migration path to a successor. Because the extension is additive and unrecognized `extensions` keys are ignored, it needs no `specVersion` change — a catalog carrying it remains a conformant 1.0 document. Changes: - adr/0023-lifecycle-metadata-extension.md (new): records the official-extension decision (consistent with the closed-core philosophy of ADR-0012), the open-text `status` rationale, the `replacedBy` naming rule, and the interpret-then-fail-safe rule for unrecognized values. - specification/ai-catalog.md: registers the extension in the Official Extensions list; adds the Lifecycle Metadata Extension section (status, releaseDate, deprecated object, rules, example, consumer behavior); adds an informative CDDL block; adds a Privacy Considerations note. - Developer docs: a new annotated example (docs/examples/ lifecycle-metadata.md), authoring guidance in Creating a Catalog, a filtering section in Consuming Catalogs, cross-links, and a nav entry. `status` is open text with RECOMMENDED values `preview`, `active`, `deprecated`, and `retired` — each a state a consumer can actually reach (a not-yet-released "planned" state is deliberately excluded). An unrecognized status is neither rejected nor silently discarded: a consumer SHOULD interpret it against the recommended states (an agent consumer can do so semantically) and, when it cannot, treat the artifact conservatively rather than assume it is `active` — failing safe, not open. `replacedBy` is an artifact identifier and follows the same naming rule as a Catalog Entry `identifier`: the `urn:air` structure is HIGHLY RECOMMENDED and MUST be used for open or federated systems. Signed-off-by: marianogonzalez <mariano.gonzalez@salesforce.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This PR resolves #65
(communicate an artifact's software-lifecycle state at discovery time) by
adding an official extension —
https://ai-catalog.org/extensions/lifecycle— rather than a nativelifecyclefield on the Catalog Entry as the original issue proposed.A Catalog Entry carries
version(which revision this is) andupdatedAt(when the entry last changed), but nothing that expresses where that
revision sits in its lifecycle: whether it is a preview, generally
available, deprecated with a scheduled end-of-life, or already retired —
nor how a consumer should move off it. Agents evolve: a v1 is superseded by
a breaking v2, an endpoint is scheduled for shutdown, a successor ships with
a migration guide. The extension lets a publisher advertise that state on a
per-version entry so a consumer — an agent planner or a governance tool
— can filter deprecated or retired artifacts at discovery, plan around a
known end-of-life, and follow a producer-supplied migration path to a
successor before committing to an integration.
Because the extension is additive and unrecognized
extensionskeys areignored, it needs no
specVersionchange — a catalog carrying itremains a conformant
1.0document.Changes Included
adr/0023-lifecycle-metadata-extension.md(new) — records thedecision to implement Spec Proposal: No Lifecycle or Deprecation Model #65 as an official extension rather than a native
entry field, consistent with the closed-core philosophy of
ADR-0012; documents the
open-text
statusrationale, thereplacedBynaming rule, and theinterpret-then-fail-safe rule for unrecognized values.
specification/ai-catalog.md:metadata.(
status,releaseDate, and adeprecatedobject carryingreplacedBy,deprecationDate,endOfLifeDate,breakingChanges,migrationGuide), the per-version scoping rule, an example, and aConsumer behavior paragraph.
successors / retirement schedules and on unsigned producer assertions.
(
docs/examples/lifecycle-metadata.md), an authoring section inCreating a Catalog, a filtering section in Consuming Catalogs, plus
cross-links and a nav entry.
Reconciling the original proposal
The proposal in #65 predates several current conventions; the extension
uses today's forms:
urn:ai:…urn:air:{publisher}:{namespace}:{name}(ADR-0015)lifecyclefield on the entryextensionsentry (keeps the core schema closed)replacedBypointing at the deprecated artifact's own identifierreplacedBypointing at the distinct successor identifierdeprecatedv1 alongside anactivev2)Design notes
entry identifies; within a multi-version listing each versioned entry may
carry its own status.
statusis open text, not a closed enum. RECOMMENDED values arepreview,active,deprecated, andretired— each a state a consumercan actually reach. A not-yet-released "planned" state is deliberately
excluded: a catalog entry exists because the artifact is discoverable, and
an unreleased version has no consumable endpoint to list.
an entry solely because its
statusis unrecognized, but MUST NOTsilently discard the value either — a value such as
sunsetmay signal aretirement a consumer would then miss. A consumer SHOULD interpret it
against the recommended states (an agent consumer can do so semantically)
and, when it cannot, treat the artifact conservatively rather than assume
it is
active. This mirrors the spec's open-text treatment oftypeandidentifierwhile keeping unrecognized values safe.replacedByfollows the core identifier rule. It is an artifactidentifier, so the
urn:airstructure is HIGHLY RECOMMENDED and MUST beused for open or federated systems — the same rule as a Catalog Entry
identifier.successor reference are unsigned producer assertions unless carried in a
signed Trust Manifest; a consumer that needs a supported-until guarantee
corroborates them out of band, not via this extension.
Interoperability impact
No change to interoperability expectations for existing catalogs. The core
schema, CDDL for core types, conformance levels, and
specVersionare allunchanged; a consumer that does not implement the extension ignores it
without error, exactly as for any unrecognized
extensionskey.Non-goals
discovery metadata only.
per ADR-0012 / ADR-0023.
statusenum — rejected as less flexible and misaligned with thespec's open-text fields.
Validation
uv run --locked python tools/build_spec.py specification/ai-catalog.md dist/index.html --config specification/respec-config.json— passes.uv run --python 3.12 --locked --group docs mkdocs build --strict— passes, no broken links.