Each source accumulates by reading its own previous release asset, but only the joined
registry and the FAA CSV were published. Transport Canada could therefore never find a
prior asset and would have rebuilt from a single day on every run, permanently.
- stage the joined CSV and every per-source asset into one flat directory before upload,
so the artifact has a single root and nothing is lost to the least-common-ancestor rule
- carry the per-source CSVs into the release by glob, so a new source needs no edit here
Generated-by: Claude Opus 5 <noreply@anthropic.com>
- add the joined registry, and note that the FAA CSV it supersedes still ships
- document basic-ac-db.json.gz and mictronics-db.zip, which have been published for months
without appearing in the README
- point at NOTICE for the redistribution terms that travel with the data
Generated-by: Claude Opus 5 <noreply@anthropic.com>
- narrow the fallback to FileNotFoundError and move the monotonic assert out of the try:
a rate limit, parse error or corrupt download previously rebuilt three years of registry
from a single day and republished it as the whole dataset
- authenticate release reads and walk back through releases, matching the Transport Canada
reader; the FAA path was unauthenticated at 60 requests an hour on shared runner IPs
- verify downloaded asset size
This is what the matrix's required: true flag on faa claims to protect, so the flag was
advertising a guarantee the script could not keep.
Generated-by: Claude Opus 5 <noreply@anthropic.com>
- accept source ids containing digits and underscores; the previous pattern dropped
openairframes_uk_caa_*.csv with no output, contradicting the documented promise that
adding a source needs no change here
- reject a file whose source column disagrees with its filename, which would otherwise
merge one registry into the union under another's label
- refuse duplicate source files, skip an empty optional source rather than aborting, and
log every skipped file and the column names shared across sources
- correct the MIN_EXPECTED_ROWS comment, which described a 35k floor for a 1000 value
Generated-by: Claude Opus 5 <noreply@anthropic.com>
- key the reusable workflow's concurrency on the source: one shared group made the matrix
legs cancel each other, defeating the parallelism
- resolve action versions at write time on the jobs this change adds (checkout v7,
setup-python v7, upload-artifact v7, download-artifact v8) and add the missing
workflow concurrency block and job-level permissions
- stage each leg's outputs into one directory so every artifact has the same root; two
search paths moved the root to the common ancestor for some legs only, and the FAA CSV
and zip then matched nothing downstream
- fail a leg that produced no CSV, and split the unknown-source guard out of the tolerated
step so a matrix typo goes red
- write continue-on-error as an explicit comparison rather than relying on ! coercion
- gate the join on success rather than always, and rename its artifact so the download
pattern cannot re-ingest it on a re-run
- delete the previous release only when it exists, so a 403 stops the run instead of
leaving two assets that the next run reads as an ambiguous base
Generated-by: Claude Opus 5 <noreply@anthropic.com>
- replace the hand-written build-faa job with a matrixed call per source, faa required and
tc tolerated, joined once every thread has finished
- publish openairframes_registry_*.csv and keep openairframes_faa_*.csv during transition
- validate the joined registry and NOTICE as required release files
- report missing optional assets as a workflow annotation rather than a plain echo
Generated-by: Claude Opus 5 <noreply@anthropic.com>
- add a reusable registry-source workflow so every source runs in parallel rather than as
a hand-written job; adding a registry becomes one matrix entry plus one script
- add build_registry.py to align the per-source CSVs on the union of columns and emit a
single table discriminated by the source column
- reindex each frame to the union before concatenating, so a source missing a column
yields an empty cell rather than a shifted row
Generated-by: Claude Opus 5 <noreply@anthropic.com>
- drop narrative rationale, restated rules and background a reader can grep for
- one rule per line; the file is read by a model about to act, not by a person catching up
- 151 lines to 85
Generated-by: Claude Opus 5 <noreply@anthropic.com>
- registrant_* rather than owner_*, status rather than registration_status, so both
registries describe the same concept with the same column name
- registrant_zip_code carries the Canadian postal code: a union table needs one column per
concept, not one per country's vocabulary
- set source="TC", matching the discriminator the FAA frame already carries
- raises the column names shared with the FAA frame from 9 to 21
Generated-by: Claude Opus 5 <noreply@anthropic.com>
- publish street, city, postal code and care-of, which the FAA asset already carries as
registrant_* for 99.7% of US registrants; dropping them here left one repository with
two different postures on the same class of data
- take the address from the single MAIL_RECIPIENT row rather than merging across parties,
since a co-owned mark lists several people in different cities
Generated-by: Claude Opus 5 <noreply@anthropic.com>
- stop asserting US public-domain status for the derived FAA CSV; section 105 covers the
government's own work, not this repository's derivative
- name no licence instrument for Transport Canada, which does not publish one on the
download page, rather than citing one that cannot be verified
- state that MIT covers code only, resolving a contradiction with AGENTS.md
- lead the source-eligibility rule with the bilateral-permission bar; Taiwan is OGDL
licensed and excluded for that reason, not for commercial terms
Generated-by: Claude Opus 5 <noreply@anthropic.com>
- fall back to a single-day rebuild only on FileNotFoundError; a rate limit, schema change
or truncated download previously took the same path and republished one day as the whole
dataset, which the next run then read back as its base
- move the monotonic download_date assert out of the try so corruption cannot select the
destructive branch
- walk back through releases like the ADS-B reader, so one missing optional asset does not
strand the accumulation
- authenticate release reads and verify downloaded asset size
- read the previous CSV with keep_default_na=False so literal NA values round-trip
- write the download atomically and reject non-zip responses
Generated-by: Claude Opus 5 <noreply@anthropic.com>
- reject Mode S fields that are not 24 binary digits; a short field zero-padded into a
plausible address belonging to a different aircraft
- check the "N rows selected." footer against the parsed row count and enforce a row floor,
so an upstream short export fails instead of publishing as a smaller register
- prefer ACTIVE_FLAG "A" parties but fall back to all: 1,932 Registered marks carry only "I"
rows, and those are the MAIL_RECIPIENT, so filtering on "A" alone drops real owners
- count distinct owner names rather than rows, fixing 154 marks labelled Co-owner in error
- match the spool footer by pattern instead of a brittle ragged-row count
Generated-by: Claude Opus 5 <noreply@anthropic.com>
- attribution is a licence condition and NOTICE must travel with release assets
- a public licence travels to this project; a bilateral permission does not
- non-commercial-only registries are incompatible with the MIT-licensed releases
Generated-by: Claude Opus 5 <noreply@anthropic.com>
- parse the headerless latin1 CCARCS export against its declared column layout
- derive transponder_code_hex from the 24-bit Mode S binary, populated for all 34,913 rows
- expand marks to C- and vintage CF- registrations and drop owner mailing addresses
- mirror the FAA build: same concat-with-latest-release dedup and output conventions
Generated-by: Claude Opus 5 <noreply@anthropic.com>
- carry the two Government of Canada notices the open licence requires verbatim
- record FAA public-domain provenance and unassessed third-party republished assets
- LICENSE covers code only; release data carries its own conditions
Generated-by: Claude Opus 5 <noreply@anthropic.com>
- record only what the repo cannot reveal on inspection: intent, traps, prohibitions
- cover injection rules, invocation modes, silent-corruption couplings and dead paths
- flag warts that need an owner decision rather than a silent fix
Generated-by: Claude Opus 5 <noreply@anthropic.com>
- part id is 0-indexed in both --help and the loader docstring, matching the matrix
- daily release cron comment said 6:00pm while the expression fires at 06:00 UTC
Generated-by: Claude Opus 5 <noreply@anthropic.com>
- module called an undefined master_txt_to_releasable_csv and could never run
- nothing in the repo imported or referenced it
Generated-by: Claude Opus 5 <noreply@anthropic.com>
- query the repo for its default branch instead of assuming main
- use that branch as both the fork point and the pull request base
Generated-by: Claude Opus 5 <noreply@anthropic.com>
- write through get_schema_path() instead of a literal v1 filename
- drop the unreferenced SCHEMA_PATH backwards-compatibility shim
- widen the community PR trigger to schemas/** so a version bump still fires it
Generated-by: Claude Opus 5 <noreply@anthropic.com>
- fail when no parquet parts exist and --concat_with_latest_csv is not set
- keep the fallback path that re-releases the latest CSV when adsb.lol is late
- correct a log line that reported "no parquet files" on the populated branch
Generated-by: Claude Opus 5 <noreply@anthropic.com>
- replace two independent copies with FINAL_COLUMN_ORDER
- polars concatenates by position, so a forked copy corrupted releases silently
Generated-by: Claude Opus 5 <noreply@anthropic.com>
- stop retrying a nonexistent repo 10 times at 5-minute intervals
- cut the dead-end Dec-31 next-year probe from ~45 minutes to under a second
- leave 403, 429, 5xx and network errors on the existing retry path
Generated-by: Claude Opus 5 <noreply@anthropic.com>
- prevent command injection from a crafted issue body closing the heredoc early
- drop the debug step that echoed untrusted input for no operational value
- read body and issue number from env in the community validation workflow
Generated-by: Claude Opus 5 <noreply@anthropic.com>