You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The update path knows one remote provider (GitHub Releases via ReleaseApiProvider) and one local mirror format. Multi-Forge requires a single resolve_release_source(), a ReleaseProvider contract, an externally anchored ReleaseManifest V3 with an exact version chain, and GitHub + Local providers —
without weakening any fail-closed behavior.
update, update check, status and doctor resolve their source through one
function with conflict validation before precedence; V3 manifests are verified
against externally supplied digest + size before anything is parsed; GitHub and
Local providers implement the same logical verification chain.
Acceptance criteria
Blocked until PR-0A merged AND ADR-MF-03 accepted. PR-0B need not block
coding but MUST be shipped in a V2-compatible bridge release before the
first V3 publication.
PR-4A — ReleaseProviderEndpointConfig; ~/.ai-native/release-providers.json
machine config; reserved provider names; resolve_release_source() with
source diagnostics; no project-local provider trust config.
PR-4A selector rules exactly as frozen: AINATIVE_UPDATE_PROVIDER=local + AINATIVE_UPDATE_LOCAL_DIR → LocalDirectoryProvider; AINATIVE_UPDATE_LOCAL_DIR without explicit provider=local → UPDATE_SOURCE_CONFLICT; AINATIVE_UPDATE_URL mixed with provider/local
selectors → UPDATE_SOURCE_CONFLICT; AINATIVE_UPDATE_URL alone →
anonymous release API; named provider → machine config/built-in; nothing
selected → machine default_provider or built-in GitHub.com. No
last-selector-wins. Identical behavior across update, update check, status, doctor.
Per-command observability: effective source, selection reason, authenticated
yes/no, auth origin if applicable — never secret values.
PR-4B — ReleaseQuery, ReleaseCandidate, EnumerationResult, ReleaseProvider.enumerate()/fetch_manifest()/fetch_artifact(); complete=false → RELEASE_ENUMERATION_INCOMPLETE; complete compatible
channel with zero candidates → RELEASE_NO_CANDIDATE.
PR-4B — SemVer policy: installable releases 1.2.3, 1.2.3-rc.1; reject 1.2.3+build1 with RELEASE_BUILD_METADATA_UNSUPPORTED; explicit release
precedence key; same canonical precedence with conflicting identities → RELEASE_DUPLICATE_VERSION.
PR-4D — GitHub.com provider: bounded enumeration, release asset metadata,
manifest digest/size anchor, private assets (PR-0A transport), API version
header, authenticated API request, anonymous CDN redirect. Declares support
for GitHub.com only — not GHES.
PR-4E — Local provider adapted to V3 without weakening integrity: releases.json provides manifest locator + size + sha256; the local
provider executes the same logical verification chain as network providers.
Multi-Forge implementation merged into dev (squash f0101fc via PR #172), full CI matrix green (52/52: Linux/Windows/macOS, py3.11/3.13). The Issue stays open until the final dev -> main promotion, per the maintainer rule that main is untouched until everything is tested and integrated.
The follow-up increment (mandatory secret-pattern floor, scenarios J/M/P, documentation parity) is merged into dev (squash a8e1fb6 via PR #174, CI 76/76 green). The Issue stays open until the final dev -> main promotion.
Problem
The update path knows one remote provider (GitHub Releases via
ReleaseApiProvider) and one local mirror format. Multi-Forge requires a singleresolve_release_source(), aReleaseProvidercontract, an externally anchoredReleaseManifestV3 with an exact version chain, and GitHub + Local providers —without weakening any fail-closed behavior.
Source: Multi-Forge v1.3.2-final §33–43 (PR-4, PR-4A–4E).
Expected outcome
update,update check,statusanddoctorresolve their source through onefunction with conflict validation before precedence; V3 manifests are verified
against externally supplied digest + size before anything is parsed; GitHub and
Local providers implement the same logical verification chain.
Acceptance criteria
coding but MUST be shipped in a V2-compatible bridge release before the
first V3 publication.
ReleaseProviderEndpointConfig;~/.ai-native/release-providers.jsonmachine config; reserved provider names;
resolve_release_source()withsource diagnostics; no project-local provider trust config.
AINATIVE_UPDATE_PROVIDER=local+AINATIVE_UPDATE_LOCAL_DIR→ LocalDirectoryProvider;AINATIVE_UPDATE_LOCAL_DIRwithout explicitprovider=local→UPDATE_SOURCE_CONFLICT;AINATIVE_UPDATE_URLmixed with provider/localselectors →
UPDATE_SOURCE_CONFLICT;AINATIVE_UPDATE_URLalone →anonymous release API; named provider → machine config/built-in; nothing
selected → machine
default_provideror built-in GitHub.com. Nolast-selector-wins. Identical behavior across
update,update check,status,doctor.yes/no, auth origin if applicable — never secret values.
ReleaseQuery,ReleaseCandidate,EnumerationResult,ReleaseProvider.enumerate()/fetch_manifest()/fetch_artifact();complete=false→RELEASE_ENUMERATION_INCOMPLETE; complete compatiblechannel with zero candidates →
RELEASE_NO_CANDIDATE.1.2.3,1.2.3-rc.1; reject1.2.3+build1withRELEASE_BUILD_METADATA_UNSUPPORTED; explicit releaseprecedence key; same canonical precedence with conflicting identities →
RELEASE_DUPLICATE_VERSION.ReleaseManifestV3: schema, protocol, version, channel,compatibility, artifacts, provenance; V1 compatibility mode
exact-runtime.+ size → download → verify → parse manifest → select lifecycle artifact →
download → verify size + SHA-256. Trust-bearing artifact declarations are
never parsed before the manifest is verified.
manifest.version == compatibility.runtime_version == artifact.version ==
artifact filename version == lifecycle-protocol.json.release_version;
failure →
UPDATE_VERSION_MISMATCH.manifest digest/size anchor, private assets (PR-0A transport), API version
header, authenticated API request, anonymous CDN redirect. Declares support
for GitHub.com only — not GHES.
releases.jsonprovides manifest locator + size + sha256; the localprovider executes the same logical verification chain as network providers.
AINATIVE_UPDATE_URLstays HTTPS,anonymous, GitHub-Release-API-compatible metadata; missing V3 integrity
metadata fails closed.
digest, ambiguity, selection, enumeration completeness) → REFUSE UPDATE,
never warning-and-continue.
Out of scope
Context
ainative/lifecycle/provider.py,updater.py,machine.py,docs/RELEASING.md.publication).
Dependencies