Reproducible 202609 chain, step 6: build vocab_labels from archived, pinned TTLs (--ttl-dir), explicit order, manifest - #355
Conversation
…ir), explicit row order, manifest
- --ttl-dir <archive> reads the 10 TTLs from the local archive laid out as
<repo>/<file>.ttl (written at pinned commits by the 202609 provenance
freeze); --ttl-archive ttl_archive.json verifies each file's sha256 and
copies the commit into the manifest. source_ttl still records the canonical
main URL. Without --ttl-dir the script fetches main as before (manifest says
'NOT pinned').
- Rows sorted by (uri_form, uri, lang, source_ttl) and alt_labels sorted, so
the artifact is a function of the TTL bytes alone (rdflib order was stable
in practice but undocumented).
- {output}.manifest.json: script sha256, git sha + dirty, rdflib/pandas/pyarrow
versions, per-TTL sha256 + commit, counts, output sha256.
Verified: two offline runs byte-identical (65bbcdb6...), equal to a live run
the same minute; rows identical to the unsorted pre-change output.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LtTxB4jfTZgaTR7CK4zKqy
…inistic selectors; publicID base IRI (Codex round 1) - --ttl-dir and --ttl-archive required together; the archive must describe exactly the expected TTL set (no missing/extra/duplicate records); a missing or altered archived file is fatal even with --allow-partial. - TTLs are recorded as inputs only after their rows were extracted; failed sources are listed; manifest carries pinned / archive_verified / complete. - g.parse(data=..., publicID=url) so relative IRIs resolve as when fetched. - definition, scheme, prefLabel choices use lexical tiebreaks; _dedupe tiebreaks on pref_label; surviving (uri, lang) duplicates are fatal. - Claims narrowed: rows are a function of TTL bytes + script; bytes also of the recorded pandas/pyarrow; the manifest itself is not byte-reproducible. Verified: two archived runs still 65bbcdb6... (no selector changed a choice in these 10 files). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LtTxB4jfTZgaTR7CK4zKqy
…in archive records; ttl_inputs_pinned (Codex round 2) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LtTxB4jfTZgaTR7CK4zKqy
…s; wording) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LtTxB4jfTZgaTR7CK4zKqy
|
🤖 rbotyee — Codex round 3 (final) verdict, verbatim: LGTM-with-nitsVerdict: LGTM-with-nits. No remaining P1/P2 findings.
On the central question:
Static/import and in-memory exact-buffer parsing checks passed. The full pytest run was unavailable because the review environment provides no writable temporary directory; I also could not independently rebuild the stated output hash without the TTL archive. |
|
🤖 rbotyee — staging check before merge: fork Pages run 33205136357 on this branch built green; |
🤖 rbotyee (Claude, operated by @rdhyee) — Raymond's intent: continue Part B (reproducible
isamples_202609build). What I did: archived the 10 vocabulary TTLs at the commits pinned on 8/27 (they are still byte-identical tomain), taughtbuild_vocab_labels.pyto build from that archive with verification, and ran it through three Codex rounds. No published file changes.Why
build_vocab_labels.pyfetched six-plus TTLs frommainof four GitHub repos — a moving target, sovocab_labels_*was not reproducible by construction (plan block C). It also had no explicit row order and wrote no provenance. (It happened to be run-to-run stable: two live runs today matched; rows equal to the livevocab_labels_202608on all shared columns.)What changed
--ttl-dir <archive> --ttl-archive ttl_archive.json(must be given together): every expected TTL is read once from<archive>/<repo>/<file>.ttl, its bytes SHA-256-checked against the archive record (which must carry a 40-hex commit), and that same buffer parsed withpublicID=<canonical URL>so base-IRI semantics match a live fetch. Missing/altered/extra/duplicate records are fatal even with--allow-partial.source_ttlstill records the canonicalmainURL.(uri_form, uri, lang, source_ttl),alt_labelssorted; surviving(uri, lang)duplicates are fatal.{output}.manifest.json: per-TTL sha256 + commit + row count, failures,ttl_inputs_pinned/archive_verified/complete, script-defined rows (manual overrides) reported separately, script SHA-256, git SHA + dirty flag, rdflib/pandas/pyarrow versions, output SHA-256.Evidence
Two archived runs →
65bbcdb6…both; equal to a live run the same minute; rows identical to the pre-change output. Downstream step 5 (build_frontend_derived.py) requires this file'sbroadercolumn — the livevocab_labels_202608lacks it — so the chain order is 6 → 5 (recorded in the plan). The archive (10 files, SHA256SUMS,ttl_archive.json) lives with the 202609 inputs; hashes are inprovenance/inputs_202609_frozen.json(coordination repo).Review
Codex ×3: R1 changes-required (P1 "pinned" without archive verification; P1 partial inputs misrepresented; P2 publicID; P2 nondeterministic selectors; P2 overclaim) → R2 changes-required (P1 hash≠parsed bytes; P2 commit not enforced; P2
pinnednaming; P2 wording) → R3 LGTM-with-nits (applied). Verdict posted below.🤖 Generated with Claude Code
https://claude.ai/code/session_01LtTxB4jfTZgaTR7CK4zKqy