Skip to content

feat: publication files, drop counts and release workflow (spec 006) - #45

Merged
matbrgz merged 12 commits into
masterfrom
spec-006-publicacao
Oct 12, 2026
Merged

matbrgz merged 12 commits into
masterfrom
spec-006-publicacao

Conversation

@matbrgz

@matbrgz matbrgz commented Oct 12, 2026 •

Copy link
Copy Markdown
Collaborator

Spec 006 (publicação): o build passa a gerar uma release publicável, os descartes por fonte entram no manifesto e um workflow monta a release a partir do cache sem publicá-la. Spec, plano e tarefas em docs/specs/006-publicacao/; ADRs 0014 (processo de release) e 0015 (retirada do legado).

Status: Em implementação.

O que mudou

  • Canal de descarte (Spec 006: contagem de nomes descartados por fonte no manifesto #32). Novo RawDrop(name, count) no protocolo do adaptador. O pipeline conta linhas, registros e formas por fonte, avisa no logger namescommons.pipeline, e ingest grava os números nos metadados do observations.parquet (namescommons.dropped), que build lê. O nz-dia-births deixou de usar logging.
  • Manifesto. data_license: "CC-BY-4.0" e, por fonte, name, observations e dropped (null quando o Parquet é anterior). files continua só com as tabelas. SCHEMA_VERSION 1.3.0.
  • Atribuições (Spec 006: aviso da Statistics Canada na atribuição e no cartão do dataset #22, Spec 006: README, licença e .gitignore (pendências da 001) #5). ATTRIBUTION.txt gerado de sources.yaml: linha de atribuição do dataset, um bloco por fonte usada com o attribution sem edição, e a seção de avisos com o aviso de condições da Statistics Canada só quando ela está na release. Tabela de licenças com uma entrada por licença aceita; licença sem entrada faz o build falhar. DATA_LICENSE ganhou o preâmbulo com a linha de atribuição do dataset.
  • Cartão do dataset. DATASET_CARD.md (inglês): resumo, arquivos, campos, fontes (com supressão e descartes), cobertura por país, supressão, limitações conhecidas (fontes sem acento, caixa uniforme, nomes corrompidos descartados, group_id por release, retrato do Wikidata no QLever, female_share), licença com os avisos da Statistics Canada e citação.
  • Pacote. build/run gravam também DATA_LICENSE (opção --data-license), ATTRIBUTION.txt, DATASET_CARD.md, by_country.zip determinístico e SHA256SUMS no formato GNU, tudo no mesmo diretório temporário atômico. Layout compatível com a seção 5 do plano da spec 001 do tools-dataset (R5, R6, R9 de lá); entradas de benchmark continuam na Export deterministic benchmark inputs for catalog-algorithms #24.
  • Release. tools/release.sh (check, fixture-cache, fetch-cache, build, verify, upload) e .github/workflows/release.yml: na tag CalVer, baixa source-cache.tar.gz do rascunho, build offline, confere somas, envia ao rascunho sem sobrescrever e só então remove o cache do rascunho. O workflow_dispatch é sempre ensaio sobre as amostras; a CI roda o mesmo ensaio em todo PR. Nada publica release nem cria tag.
  • .gitignore (Spec 006: README, licença e .gitignore (pendências da 001) #5). Linha em branco dupla e .venv/ da seção do mypy removidos; Parquet permitido em tests/fixtures/.
  • Docs. README (seção Releases, verificação, citação, ensaio local), AGENTS.md (procedimento de release passo a passo, incluindo conferir a licença da Statistics Canada), notas na spec 001, ROADMAP (006 Em PR; 007 marcada Mesclada).

Critérios de aceite e verificação

Tabela completa em docs/specs/006-publicacao/tasks.md. Resumo: uv sync --locked e uv run pytest -q com 653 testes verdes, sem rede; os passos offline da CI passam localmente (tests/test_ci.py); tools/release.sh build duas vezes sobre as amostras dá diff -r vazio e sha256sum -c SHA256SUMS OK; envio testado com gh falso (CalVer, rascunho ausente, release publicada, sem sobrescrever, remoção do cache depois do envio, saída adulterada); shellcheck sem avisos. Nenhuma tag, rascunho ou release foi criado.

Legado: mantido congelado

Decisão do dono: legacy/ fica no repositório como arquivo histórico congelado, sem nenhuma remoção nem alteração. Não é ingerido, não entra em nenhum arquivo das releases e está fora do contrato de entradas do tools-dataset (R1.3 de lá). O ADR 0015 (docs/adr/0015-legado-congelado.md, Aceito) registra a decisão e as consequências; git diff origin/master -- legacy/ é vazio.

Correções da revisão independente

  • release.yml: GH_TOKEN/GH_REPO só nos passos que chamam o gh (cache do rascunho e envio); persist-credentials: false no checkout; todas as actions fixadas por SHA de commit com comentário da tag; enable-cache: false no setup-uv do job release.
  • tools/release.sh: a lista de assets do rascunho fica numa variável (sem pipe com grep -q), falha do gh derruba o passo, e depois do delete-asset a lista é conferida de novo; só "release not found" conta como rascunho ausente, outro erro mostra a mensagem real. Testes novos com o gh falso.
  • README: sha256sum -c --ignore-missing SHA256SUMS para download parcial. AGENTS.md: <saída>.

Decisões tomadas sozinho (e o custo se estiverem erradas)

  1. Release por rascunho com source-cache.tar.gz (ADR 0014). Custo: se o gh se comportar diferente com rascunhos do que o documentado, o primeiro envio real falha (sem publicar nada) e o script precisa de ajuste; o caminho real só foi testado com gh falso.
  2. O workflow apaga source-cache.tar.gz do rascunho depois do envio, para os brutos das fontes nunca serem publicados. Custo: o dono precisa guardar a cópia local do cache.
  3. Descartes nos metadados do Parquet em vez de arquivo lateral. Custo: invisíveis para quem lê só colunas; manifesto e cartão os expõem.
  4. by_country.zip (releases não aceitam diretórios) e ATTRIBUTION.txt em texto puro (nome do contrato do tools-dataset). Custo: trocar de formato depois muda os assets e exige release nova.
  5. Cartão e atribuições em inglês e gerados no build, não versionados. Custo: só visíveis numa release ou num build local.
  6. SCHEMA_VERSION 1.3.0 (menor): campos e arquivos novos, nenhum significado mudou.

Issues

Closes #22
Closes #32
Closes #42
Closes #5 (todos os itens cumpridos: README no PR #19; atribuições, .gitignore e a decisão sobre legacy/ aqui)

Criadas: #42 (decisão sobre o legado, fechada por este PR), #43 (nomes e atribuições de sources.yaml em português nos arquivos em inglês), #44 (versionar data/by_country/*.csv, spec 001 R4).

Acompanhamento da revisão: #46 (tag assinada e em master), #47 (zip e zlib), #48 (insumos de benchmark antes do SHA256SUMS), #49 (cabeçalho do ATTRIBUTION.txt, com #43), #50 (validar licença no início do build), #51 (fonte só de ligações como "unknown" no cartão), #52 (checklist da primeira release real).

🤖 Generated with Claude Code

matbrgz and others added 12 commits October 12, 2026 19:19
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Adapters report dropped records as RawDrop items in the parse stream. The
pipeline counts lines, records and forms per source, warns through its own
logger and ingest stores the counts in the observations.parquet metadata.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Each manifest source gains name, observations and dropped (null when the
observations file predates the drop metadata), and the manifest gains
data_license. SCHEMA_VERSION goes to 1.3.0.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
ATTRIBUTION.txt lists every source used in a release with its licence and
its attribution text verbatim, followed by the notices some licences
require (the Statistics Canada conditions notice). DATA_LICENSE gains the
dataset's own attribution line.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
DATASET_CARD.md describes the files, fields, sources, coverage,
suppression, known limitations, licence and citation of a release, from
the manifest, sources.yaml and the per-country rows.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
build and run now also write DATA_LICENSE (copied from --data-license),
ATTRIBUTION.txt, DATASET_CARD.md, a deterministic by_country.zip and a
GNU-format SHA256SUMS covering every top-level file, all inside the same
atomic temporary directory.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
tools/release.sh checks the CalVer name, builds offline, verifies
SHA256SUMS and uploads the assets to a draft release without overwriting,
then removes the raw source cache from the draft. The release workflow
runs it on CalVer tags; manual dispatch and CI run a dry run on the
fixture samples. Nothing publishes a release or creates a tag.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
README gains the release layout, verification, citation and the local dry
run; AGENTS.md gains the step-by-step release procedure; spec 001 gains
notes pointing to spec 006 and ADR 0015.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
GH_TOKEN and GH_REPO reach only the two steps that call gh, checkout no
longer persists credentials, every action is pinned by commit SHA and the
release job runs setup-uv without cache. release.sh lists the draft's
assets without a grep pipe, fails if the listing fails, confirms the
source cache is gone after deleting it, and only treats 'release not
found' as a missing draft.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
The owner decided to keep legacy/ as a frozen historical archive. ADR 0015
is rewritten as accepted with that decision, and spec 006, its plan and
tasks, spec 001 and the roadmap follow it. README mentions
sha256sum --ignore-missing and AGENTS.md uses <saída>.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant