Cópia estática
Copiado de docs/adp/ADP-007-package-identity-and-distribution.md em https://github.com/poppy-team/aipo-lang (MIT). Fixado na revisão ce47c4e070404fc41722ccd8e2b7b808b99062a8, blob af73a551f1345626556e3d692f3e7379f9d9168d. O repositório de origem permanece canônico; esta cópia é atualizada por um pull request de sincronização, não em tempo real.
Status: accepted Date: 2026-09-24 Related: Fechamento Arquitetural §13, §14; docs/crates/crate-contracts.md; docs/canon/Aipo — Waves, Vertical Slices, Gauntlet LoopsAuthority: subordinate ao canon; esta ADP fixa a primeira implementação sem criar um serviço de plataforma próprio.
Um packagecoordinate tem exatamente dois segmentos separados por ponto:
namespace.packageExemplo: acme.http. O coordinate é a identidade canônica usada no manifest, lockfile, SourceMap e diagnósticos. Os segmentos usam a gramática ASCII lowercase [a-z][a-z0-9_]*; esta decisão não aceita ainda submodules (acme.http.client).
A origem fica explícita na cadeia de resolução: acme.http não é confundido com o module embutido http ou com um package local de nome igual.
A superfície de importação usa o coordinate completo:
import acme.http
import acme.http as hO alias continua siendo local ao arquivo que o declara. O coordinate original permanece disponível para proveniência, lockfile e diagnóstico. Módulos embutidos permanecem simples (math, task, io, time).
O primeiro slice suporta apenas o módulo de entrada de cada package. A forma de submodules fica para uma decisão posterior, para não ambiguar a fronteira entre coordinate e caminho interno.
Aipo possui o protocolo de package; GitHub é apenas o backend inicial de distribuição. O modelo de source separa origem, revisão e artifact:
path para desenvolvimento local;owner/repository, commit SHA exato de 40 hex e subpath relativo;O manifesto aceita dependencies path e GitHub pinado. A forma canônica para GitHub é type = "github", com repository, revision, subpath e versão SemVer exata. O lockfile registra coordinate, versão exata, source, revisão, checksum, targets e capabilities relevantes. Branches, tags, URLs, credenciais e revisões mutáveis são rejeitados. Um GitHubFetcher e um store in-memory offline permitem testar a provenance sem rede; a API de cache verificado e package cache verify read-only estão disponíveis no build padrão, enquanto a feature http acrescenta GET público, timeout, limite de resposta, redirects bloqueados e cache local atômico. Autenticação é opt-in por --github-token-env <name> nas formas de fetch/lock; o valor vem de uma variável de ambiente explicitamente nomeada, é validado como bearer e nunca é persistido, logado ou incluído em diagnostics.
aipo package fetch-github e a forma explícita aipo package lock <dir> --fetch-github --cache <dir> são as únicas operações que ativam a busca de GitHub. fetch-github percorre recursivamente as dependencies GitHub pinadas e grava o lockfile completo no snapshot de saída. A forma de lock misto mantém as inputs locais no projeto, busca somente as edges GitHub pinadas e grava um lockfile único. Ambas aceitam opcionalmente --github-token-env <name> para usar uma credencial bearer fornecida pelo ambiente; sem essa flag, as requisições continuam públicas e sem Authorization. Dependencies locais continuam disponíveis no resolver local; uma dependency path declarada dentro de um artifact remoto é rejeitada porque não existe um filesystem raiz confiável para interpretá-la. run, check, build e disasm aceitam --package-cache para consumir o grafo misto sem rede; sem a flag, esses comandos são locais. aipo package cache verify <dir> audita todas as entradas existentes sem criar, reparar, remover ou buscar dados. aipo package cache prune <dir> --lock <lockfile> é dry-run por padrão; apenas --apply remove entradas verificadas que o lockfile não referencia, e qualquer erro de verificação impede qualquer remoção. package lock sem a forma explícita e package audit permanecem locais. OAuth, descoberta/persistência de tokens, downloads automáticos, lifecycle e registry publication continuam fora deste slice. Não há scripts arbitrários de instalação ou execução de lifecycle no V1.
Capabilities declaradas por packages são um limite superior. A política do projeto e a política do host podem reduzir esse conjunto; nunca ampliá-lo silenciosamente. A união transitiva é auditável e deve caber no limite declarado pela raiz.
O aipo-host continua sendo a fonte da gramática e das regras de narrowing. aipo-stdlib publica a superfície da API; o serviço efetivo é instalado e verificado no host, como já ocorre com clock e Poppy. Os primeiros serviços novos são env.read e o slice host-only fs.read_text/fs.roots: cada provider vive no HostContext do VM, a instalação não concede capabilities e a política de raízes/paths pertence ao provider.
import deixa de aceitar apenas um identificador e passa a carregar um caminho qualificado.ModuleGraph de runtime; este continua sendo o grafo de inicialização de módulos já resolvidos.http permite fetch GitHub explícito, com autenticação opcional e exclusivamente opt-in via nome de variável de ambiente; assinatura, cache distribuído e registries continuam atrás de fixtures e decisões de segurança próprias.aipo-package: manifest, coordinate, lock e resolver path determinístico — concluído.env.read como primeira prova per-VM — concluído.fs.read_text/fs.roots e o contrato async-first — concluído no slice host-only.fetch-github — concluído no slice P04-G05; autenticação permanece opt-in e fora do manifesto.--apply — concluído no slice P04-G10.