From 6afd33d1a6bd6b3915d6357a5d55efeff544c1e5 Mon Sep 17 00:00:00 2001 From: Martin Prammer Date: Sun, 27 Sep 2026 23:19:10 -0400 Subject: [PATCH] release 0.3.0: canonical Arrow spine, cross-implementation conformance, 435 datasets Bumps to 0.3.0. Every build now writes a canonical Arrow IPC file and exports each format from it through a registered writer. Seven writer lanes (pyarrow, arrow-rs, parquet-java through parquet-arrow-java, Hardwood, and Vortex through Python, Rust and JNI) are measured against each other by a conformance harness whose ledger ships in docs/v2/compliance.json. Every writer reads back what it writes, and a format a writer cannot produce is recorded with the measured failure instead of a hand-written reason. The catalog grows from 250 to 435 datasets, including generated TPC-H and TPC-DS tables, and gains versioned catalog bundles, native readers for Rust, C, C++ and Java, and the raincloud command. It is a breaking release: the pipeline moves from scripts.pipeline to raincloud.pipeline, default data locations move to the platform's user directories, schema_version becomes 2 (outputs/v2 and docs/v2), and reads no longer build by default. Ingest no longer drops upstream records or values: JSONBench rejoins the 16 records its dumps wrap, and uci-thyroid-disease, uci-diabetes and uci-online-retail-ii keep what they used to lose. CHANGELOG.md has the full list. Co-Authored-By: Claude Signed-off-by: Martin Prammer --- .agents/README.md | 8 +- .agents/settings.json | 44 +- .agents/skills/README.md | 36 +- .agents/skills/raincloud-add-dataset/SKILL.md | 26 +- .agents/skills/raincloud-add-handler/SKILL.md | 34 +- .../skills/raincloud-add-kaggle-tos/SKILL.md | 8 +- .agents/skills/raincloud-build/SKILL.md | 26 +- .agents/skills/raincloud-convert/SKILL.md | 26 +- .agents/skills/raincloud-debug-build/SKILL.md | 22 +- .agents/skills/raincloud-discover/SKILL.md | 18 +- .agents/skills/raincloud-docs/SKILL.md | 27 +- .agents/skills/raincloud-export/SKILL.md | 34 + .agents/skills/raincloud-extract/SKILL.md | 16 +- .agents/skills/raincloud-fetch/SKILL.md | 12 +- .agents/skills/raincloud-hydrate/SKILL.md | 56 +- .agents/skills/raincloud-large-build/SKILL.md | 22 +- .../skills/raincloud-list-datasets/SKILL.md | 33 +- .agents/skills/raincloud-load/SKILL.md | 128 +- .agents/skills/raincloud-profile/SKILL.md | 26 +- .../skills/raincloud-promote-variant/SKILL.md | 18 +- .agents/skills/raincloud-publish/SKILL.md | 61 +- .../skills/raincloud-remove-dataset/SKILL.md | 40 +- .agents/skills/raincloud-status/SKILL.md | 28 +- .../skills/raincloud-tighten-variant/SKILL.md | 32 - .../raincloud-validate-manifest/SKILL.md | 27 +- .github/workflows/ci.yml | 101 +- .gitignore | 21 +- .gitmodules | 3 + AGENTS.md | 453 +- CHANGELOG.md | 356 + CITATION.cff | 4 +- CONTRIBUTING.md | 68 +- DISCLAIMER.md | 22 +- HYDRATING.md | 26 +- README.md | 568 +- SKILLS.md | 375 +- clients/README.md | 223 + clients/c/CMakeLists.txt | 56 + clients/c/cmake/raincloudConfig.cmake.in | 12 + clients/c/include/raincloud.h | 78 + clients/c/include/raincloud.hpp | 40 + clients/c/include/raincloud_arrow.hpp | 20 + clients/c/include/raincloud_arrow_abi.h | 464 + clients/c/tests/CMakeLists.txt | 21 + clients/c/tests/read.c | 69 + clients/c/tests/read.cpp | 49 + clients/java/build.gradle.kts | 50 + clients/java/examples/Read.java | 31 + clients/java/settings.gradle.kts | 3 + .../src/main/java/dev/raincloud/Dataset.java | 100 + .../main/java/dev/raincloud/NativeApi.java | 33 + .../main/java/dev/raincloud/Raincloud.java | 18 + .../dev/raincloud/RaincloudException.java | 26 + .../test/java/dev/raincloud/ReaderTest.java | 143 + clients/rust/Cargo.lock | 3499 + clients/rust/Cargo.toml | 33 + clients/rust/build.rs | 18 + clients/rust/src/cli.rs | 166 + clients/rust/src/error.rs | 225 + clients/rust/src/ffi.rs | 158 + clients/rust/src/lib.rs | 166 + clients/rust/src/reader.rs | 270 + clients/rust/tests/protocol.rs | 263 + clients/rust/tests/reader.rs | 46 + docs/v1/datasets.md | 4 +- docs/v1/handlers.md | 2 +- docs/v1/profiles/bi-generico.json | 10 +- docs/v1/profiles/bi-motos.json | 10 +- docs/v1/snapshot.json | 18 +- docs/v2/compliance.json | 50503 +++++ docs/v2/datasets.md | 491 + docs/v2/handlers.md | 28 + docs/v2/snapshot.json | 145990 +++++++++++++++ examples/README.md | 31 +- examples/kepler_exoplanets.py | 34 +- examples/nyc_taxi_tip_rate.py | 44 +- examples/olympic_medals.py | 44 +- examples/use_loader.py | 81 +- examples/wine_quality_correlations.py | 34 +- profile.schema.json | 4 +- pyproject.toml | 79 +- raincloud/__init__.py | 501 +- raincloud/__main__.py | 5 + raincloud/_builds.py | 129 + raincloud/_bundle.py | 256 + raincloud/_cache.py | 248 +- raincloud/_catalog.py | 298 +- raincloud/_duckdb.py | 60 + raincloud/_extras.py | 89 + raincloud/_formats.py | 246 + raincloud/_generated.py | 65 + raincloud/_locking.py | 249 + raincloud/_readers.py | 27 + raincloud/_registry.py | 112 + raincloud/_resolve.py | 456 +- raincloud/_suggest.py | 41 + raincloud/_transport.py | 117 +- raincloud/catalogs.py | 565 + raincloud/cli.py | 551 + raincloud/config.py | 287 + raincloud/exceptions.py | 73 +- raincloud/pipeline/__init__.py | 17 + {scripts => raincloud}/pipeline/autotag.py | 49 +- raincloud/pipeline/batch_merge.py | 95 + raincloud/pipeline/batch_types.py | 132 + raincloud/pipeline/batches.py | 147 + {scripts => raincloud}/pipeline/browse.py | 349 +- raincloud/pipeline/build.py | 260 + raincloud/pipeline/canonical.py | 163 + raincloud/pipeline/compliance.py | 859 + raincloud/pipeline/convert.py | 253 + raincloud/pipeline/custom_fetch.py | 72 + {scripts => raincloud}/pipeline/discovery.py | 42 +- {scripts => raincloud}/pipeline/docs.py | 472 +- raincloud/pipeline/duckdb_variant.py | 139 + raincloud/pipeline/export/__init__.py | 392 + raincloud/pipeline/export/__main__.py | 157 + raincloud/pipeline/export/base.py | 225 + raincloud/pipeline/export/bounded.py | 226 + raincloud/pipeline/export/compare.py | 278 + raincloud/pipeline/export/exporters.py | 399 + raincloud/pipeline/export/readers.py | 456 + raincloud/pipeline/export/sidecar.py | 279 + raincloud/pipeline/extract.py | 354 + raincloud/pipeline/fetch.py | 612 + raincloud/pipeline/generate.py | 178 + raincloud/pipeline/generators/__init__.py | 59 + raincloud/pipeline/generators/duckdb.py | 45 + .../pipeline/generators/install_tpcgen.py | 61 + raincloud/pipeline/generators/tpcds.py | 100 + raincloud/pipeline/generators/tpch.py | 58 + raincloud/pipeline/handlers/__init__.py | 67 + .../pipeline/handlers/beijing_pm25_parse.py | 0 .../pipeline/handlers/cal_housing_parse.py | 29 +- .../pipeline/handlers/duckdb_table_parse.py | 83 + .../handlers/factbook_variant_parse.py | 72 + .../pipeline/handlers/ghcn_daily_parse.py | 73 +- .../pipeline/handlers/glove_split.py | 24 +- .../pipeline/handlers/har_parse.py | 19 +- .../pipeline/handlers/hf_concat_splits.py | 73 + .../pipeline/handlers/identity.py | 8 +- .../handlers/jsonbench_variant_parse.py | 212 + .../handlers/jsonl_as_string_parse.py | 36 +- .../pipeline/handlers/lichess_pgn_parse.py | 167 + .../pipeline/handlers/nyc_rolling_sales.py | 51 +- .../pipeline/handlers/openlibrary_parse.py | 112 + .../pipeline/handlers/osm_pbf_split.py | 57 +- .../pipeline/handlers/public_bi_merge.py | 59 +- .../pipeline/handlers/sas_xpt_parse.py | 0 .../pipeline/handlers/stack_exchange_split.py | 84 +- .../handlers/text_whitespace_parse.py | 59 +- .../pipeline/handlers/tighten_types.py | 43 +- .../pipeline/handlers/tlc_merge_months.py | 45 + raincloud/pipeline/handlers/uci_default.py | 67 + .../pipeline/handlers/uci_diabetes_parse.py | 157 + .../handlers/wikipedia_variant_parse.py | 68 + raincloud/pipeline/handlers/xlsx_parse.py | 143 + {scripts => raincloud}/pipeline/hydrate.py | 368 +- raincloud/pipeline/ledger.py | 709 + raincloud/pipeline/lifecycle.py | 182 + raincloud/pipeline/list_datasets.py | 777 + raincloud/pipeline/overnight_profile.py | 330 + raincloud/pipeline/parse.py | 165 + {scripts => raincloud}/pipeline/profile.py | 143 +- raincloud/pipeline/promote_profiles.py | 173 + raincloud/pipeline/publish.py | 413 + raincloud/pipeline/records.py | 342 + raincloud/pipeline/selection.py | 75 + raincloud/pipeline/spec.py | 804 + raincloud/pipeline/status.py | 372 + raincloud/pipeline/transform.py | 35 + {scripts => raincloud}/pipeline/validate.py | 34 +- raincloud/pipeline/validate_manifest.py | 478 + raincloud/pipeline/variant.py | 170 + scripts/pipeline/__init__.py | 15 - scripts/pipeline/_enrich_public_bi.py | 327 - scripts/pipeline/build.py | 98 - scripts/pipeline/convert.py | 264 - scripts/pipeline/custom_fetch.py | 99 - scripts/pipeline/extract.py | 184 - scripts/pipeline/fetch.py | 305 - scripts/pipeline/handlers/__init__.py | 62 - .../handlers/factbook_variant_parse.py | 69 - scripts/pipeline/handlers/hf_concat_splits.py | 113 - .../handlers/jsonbench_variant_parse.py | 115 - .../pipeline/handlers/lichess_pgn_parse.py | 163 - .../pipeline/handlers/openlibrary_parse.py | 79 - scripts/pipeline/handlers/tlc_merge_months.py | 47 - scripts/pipeline/handlers/uci_default.py | 40 - .../pipeline/handlers/uci_diabetes_parse.py | 99 - .../handlers/wikipedia_variant_parse.py | 116 - scripts/pipeline/handlers/xlsx_parse.py | 53 - scripts/pipeline/list_datasets.py | 518 - scripts/pipeline/overnight_profile.py | 220 - scripts/pipeline/parse.py | 89 - scripts/pipeline/promote_profiles.py | 105 - scripts/pipeline/publish.py | 192 - scripts/pipeline/spec.py | 307 - scripts/pipeline/status.py | 237 - scripts/pipeline/tighten_variant.py | 216 - scripts/pipeline/transform.py | 30 - scripts/pipeline/validate_manifest.py | 272 - scripts/pipeline/write.py | 32 - scripts/test_native_readers.py | 165 + sidecars/README.md | 270 + sidecars/java/.gitignore | 3 + .../java/conformance-common/build.gradle.kts | 48 + .../raincloud/sidecar/common/ArrowValues.java | 71 + .../raincloud/sidecar/common/BatchSource.java | 90 + .../sidecar/common/CanonicalReader.java | 39 + .../dev/raincloud/sidecar/common/Cli.java | 65 + .../sidecar/common/ComparatorGap.java | 15 + .../dev/raincloud/sidecar/common/Knobs.java | 80 + .../sidecar/common/LogicalCompare.java | 534 + .../sidecar/common/MaterializedTable.java | 216 + .../raincloud/sidecar/common/ReaderMain.java | 192 + .../dev/raincloud/sidecar/common/Report.java | 81 + .../sidecar/common/VariantFidelity.java | 90 + .../dev/raincloud/sidecar/common/Verdict.java | 31 + .../raincloud/sidecar/common/WriterMain.java | 198 + .../raincloud/sidecar/common/KnobsTest.java | 43 + .../sidecar/common/LogicalCompareTest.java | 663 + .../sidecar/common/MaterializedTableTest.java | 242 + .../sidecar/common/ReaderMainTest.java | 151 + .../sidecar/common/WriterMainTest.java | 192 + sidecars/java/gradle.properties | 30 + .../java/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 48462 bytes .../gradle/wrapper/gradle-wrapper.properties | 10 + sidecars/java/gradlew | 248 + sidecars/java/gradlew.bat | 82 + sidecars/java/parquet-arrow-java | 1 + .../java/parquet-hardwood/build.gradle.kts | 120 + .../sidecar/hardwood/ConformanceReader.java | 32 + .../sidecar/hardwood/ConformanceWriter.java | 54 + .../sidecar/hardwood/HardwoodReader.java | 661 + .../sidecar/hardwood/HardwoodWriter.java | 1072 + .../UnsupportedHardwoodTypeException.java | 16 + .../sidecar/hardwood/Canonicals.java | 66 + .../hardwood/ConformanceMainsTest.java | 212 + .../sidecar/hardwood/HardwoodIoTest.java | 463 + sidecars/java/parquet-java/build.gradle.kts | 85 + .../parquetjava/ConformanceReader.java | 26 + .../parquetjava/ConformanceWriter.java | 56 + .../sidecar/parquetjava/ParquetArrowIo.java | 150 + .../parquetjava/ConformanceWriterTest.java | 225 + .../parquetjava/ParquetArrowIoTest.java | 165 + sidecars/java/settings.gradle.kts | 26 + .../java/vortex-jni-reader/build.gradle.kts | 79 + .../sidecar/vortexjni/ConformanceReader.java | 118 + .../sidecar/vortexjni/ConformanceWriter.java | 191 + .../vortexjni/ConformanceWriterTest.java | 176 + sidecars/knob_cases.json | 50 + sidecars/rust/.gitignore | 1 + sidecars/rust/Cargo.lock | 3644 + sidecars/rust/Cargo.toml | 69 + sidecars/rust/src/bin/parquet_read.rs | 38 + sidecars/rust/src/bin/parquet_write.rs | 67 + sidecars/rust/src/bin/vortex_read.rs | 39 + sidecars/rust/src/bin/vortex_write.rs | 52 + sidecars/rust/src/lib.rs | 1841 + sources.json | 12228 +- sources.schema.json | 735 +- sources.schema.md | 214 +- templates/README.md | 14 +- templates/minimal_spec.json | 15 +- templates/streaming_handler.py.tmpl | 104 +- tests/_helpers.py | 57 + tests/conftest.py | 31 + tests/installed_base_probe.py | 78 + tests/reader_fixture.py | 55 + tests/test_artifact_lifecycle.py | 250 + tests/test_batch_ingestion.py | 316 + tests/test_browse.py | 159 +- tests/test_build_profile_identity.py | 198 + tests/test_canonical.py | 182 + tests/test_catalog_lifecycle.py | 527 + tests/test_catalog_provenance.py | 98 + tests/test_catalog_tools.py | 1070 + tests/test_client_boundaries.py | 142 + tests/test_compare_views.py | 49 + tests/test_compliance.py | 725 + tests/test_config.py | 217 + tests/test_convert.py | 153 +- tests/test_data_root.py | 10 +- tests/test_dataset_readers.py | 87 + tests/test_discovery.py | 54 +- tests/test_docs.py | 310 +- tests/test_docs_contracts.py | 507 + tests/test_duckdb_connect.py | 37 + tests/test_duckdb_table_batches.py | 92 + tests/test_duckdb_variant.py | 235 + tests/test_examples.py | 11 +- tests/test_export_base.py | 125 + tests/test_export_conformance.py | 221 + tests/test_export_policy_views.py | 97 + tests/test_export_readback.py | 293 + tests/test_export_retry_skip.py | 215 + tests/test_export_unavailable.py | 427 + tests/test_exporters.py | 332 + tests/test_extract_identity.py | 139 + tests/test_faithful_handler_types.py | 148 + tests/test_fetch.py | 52 +- tests/test_fetch_identity.py | 185 + tests/test_generated.py | 204 + tests/test_hydrate.py | 145 +- tests/test_ingest_contracts.py | 776 + tests/test_ingest_keeps_every_record.py | 451 + tests/test_ingest_safety.py | 293 + tests/test_java_reader_schema_compare.py | 135 + tests/test_jvm_sidecar_lanes.py | 190 + tests/test_ledger.py | 930 + tests/test_list_datasets.py | 198 +- tests/test_loader_arrow.py | 240 + tests/test_loader_cache.py | 72 +- tests/test_loader_catalog.py | 65 +- tests/test_loader_contracts.py | 963 + tests/test_loader_load.py | 34 +- tests/test_loader_materialize.py | 37 +- tests/test_loader_package.py | 138 + tests/test_loader_resolve.py | 229 +- tests/test_loader_v2.py | 264 + tests/test_maintenance_recovery.py | 197 + tests/test_manifest.py | 265 +- tests/test_manifest_policy.py | 407 + tests/test_native_clients.py | 313 + tests/test_native_protocol.py | 312 + tests/test_observation_identity.py | 161 + tests/test_operation_boundaries.py | 116 + tests/test_overnight_profile.py | 85 + tests/test_parquet_java_list_naming.py | 92 + tests/test_parquet_py_row_group_cuts.py | 61 + tests/test_parquet_variant_sidecars.py | 119 + tests/test_pipeline_contracts.py | 854 + tests/test_pipeline_e2e.py | 584 +- tests/test_pipeline_path_hermeticity.py | 2 +- tests/test_pipeline_real.py | 44 +- tests/test_profile.py | 57 +- tests/test_promote_profiles.py | 47 +- tests/test_publication_recovery.py | 206 + tests/test_publish.py | 278 +- tests/test_reader_fidelity.py | 77 + tests/test_reader_publication.py | 180 + tests/test_rust_client_recipe_parity.py | 86 + tests/test_rust_sidecars.py | 110 + tests/test_schema_conformance.py | 91 + tests/test_shard_batches.py | 298 + tests/test_sidecar.py | 269 + tests/test_snapshot_checksums.py | 8 +- tests/test_system_config.py | 111 + tests/test_tpcds_generated.py | 94 + tests/test_variant.py | 126 + tests/test_variant_storage_nullability.py | 156 + tests/test_vortex_wide_nested_rows.py | 60 + tests/test_wheel.py | 248 +- tests/test_wikipedia_parquet.py | 74 + 355 files changed, 266101 insertions(+), 9928 deletions(-) create mode 100644 .agents/skills/raincloud-export/SKILL.md delete mode 100644 .agents/skills/raincloud-tighten-variant/SKILL.md create mode 100644 .gitmodules create mode 100644 clients/README.md create mode 100644 clients/c/CMakeLists.txt create mode 100644 clients/c/cmake/raincloudConfig.cmake.in create mode 100644 clients/c/include/raincloud.h create mode 100644 clients/c/include/raincloud.hpp create mode 100644 clients/c/include/raincloud_arrow.hpp create mode 100644 clients/c/include/raincloud_arrow_abi.h create mode 100644 clients/c/tests/CMakeLists.txt create mode 100644 clients/c/tests/read.c create mode 100644 clients/c/tests/read.cpp create mode 100644 clients/java/build.gradle.kts create mode 100644 clients/java/examples/Read.java create mode 100644 clients/java/settings.gradle.kts create mode 100644 clients/java/src/main/java/dev/raincloud/Dataset.java create mode 100644 clients/java/src/main/java/dev/raincloud/NativeApi.java create mode 100644 clients/java/src/main/java/dev/raincloud/Raincloud.java create mode 100644 clients/java/src/main/java/dev/raincloud/RaincloudException.java create mode 100644 clients/java/src/test/java/dev/raincloud/ReaderTest.java create mode 100644 clients/rust/Cargo.lock create mode 100644 clients/rust/Cargo.toml create mode 100644 clients/rust/build.rs create mode 100644 clients/rust/src/cli.rs create mode 100644 clients/rust/src/error.rs create mode 100644 clients/rust/src/ffi.rs create mode 100644 clients/rust/src/lib.rs create mode 100644 clients/rust/src/reader.rs create mode 100644 clients/rust/tests/protocol.rs create mode 100644 clients/rust/tests/reader.rs create mode 100644 docs/v2/compliance.json create mode 100644 docs/v2/datasets.md create mode 100644 docs/v2/handlers.md create mode 100644 docs/v2/snapshot.json create mode 100644 raincloud/__main__.py create mode 100644 raincloud/_builds.py create mode 100644 raincloud/_bundle.py create mode 100644 raincloud/_duckdb.py create mode 100644 raincloud/_extras.py create mode 100644 raincloud/_formats.py create mode 100644 raincloud/_generated.py create mode 100644 raincloud/_locking.py create mode 100644 raincloud/_readers.py create mode 100644 raincloud/_registry.py create mode 100644 raincloud/_suggest.py create mode 100644 raincloud/catalogs.py create mode 100644 raincloud/cli.py create mode 100644 raincloud/config.py create mode 100644 raincloud/pipeline/__init__.py rename {scripts => raincloud}/pipeline/autotag.py (85%) create mode 100644 raincloud/pipeline/batch_merge.py create mode 100644 raincloud/pipeline/batch_types.py create mode 100644 raincloud/pipeline/batches.py rename {scripts => raincloud}/pipeline/browse.py (83%) create mode 100644 raincloud/pipeline/build.py create mode 100644 raincloud/pipeline/canonical.py create mode 100644 raincloud/pipeline/compliance.py create mode 100644 raincloud/pipeline/convert.py create mode 100644 raincloud/pipeline/custom_fetch.py rename {scripts => raincloud}/pipeline/discovery.py (81%) rename {scripts => raincloud}/pipeline/docs.py (52%) create mode 100644 raincloud/pipeline/duckdb_variant.py create mode 100644 raincloud/pipeline/export/__init__.py create mode 100644 raincloud/pipeline/export/__main__.py create mode 100644 raincloud/pipeline/export/base.py create mode 100644 raincloud/pipeline/export/bounded.py create mode 100644 raincloud/pipeline/export/compare.py create mode 100644 raincloud/pipeline/export/exporters.py create mode 100644 raincloud/pipeline/export/readers.py create mode 100644 raincloud/pipeline/export/sidecar.py create mode 100644 raincloud/pipeline/extract.py create mode 100644 raincloud/pipeline/fetch.py create mode 100644 raincloud/pipeline/generate.py create mode 100644 raincloud/pipeline/generators/__init__.py create mode 100644 raincloud/pipeline/generators/duckdb.py create mode 100644 raincloud/pipeline/generators/install_tpcgen.py create mode 100644 raincloud/pipeline/generators/tpcds.py create mode 100644 raincloud/pipeline/generators/tpch.py create mode 100644 raincloud/pipeline/handlers/__init__.py rename {scripts => raincloud}/pipeline/handlers/beijing_pm25_parse.py (100%) rename {scripts => raincloud}/pipeline/handlers/cal_housing_parse.py (60%) create mode 100644 raincloud/pipeline/handlers/duckdb_table_parse.py create mode 100644 raincloud/pipeline/handlers/factbook_variant_parse.py rename {scripts => raincloud}/pipeline/handlers/ghcn_daily_parse.py (68%) rename {scripts => raincloud}/pipeline/handlers/glove_split.py (69%) rename {scripts => raincloud}/pipeline/handlers/har_parse.py (85%) create mode 100644 raincloud/pipeline/handlers/hf_concat_splits.py rename {scripts => raincloud}/pipeline/handlers/identity.py (61%) create mode 100644 raincloud/pipeline/handlers/jsonbench_variant_parse.py rename {scripts => raincloud}/pipeline/handlers/jsonl_as_string_parse.py (66%) create mode 100644 raincloud/pipeline/handlers/lichess_pgn_parse.py rename {scripts => raincloud}/pipeline/handlers/nyc_rolling_sales.py (54%) create mode 100644 raincloud/pipeline/handlers/openlibrary_parse.py rename {scripts => raincloud}/pipeline/handlers/osm_pbf_split.py (82%) rename {scripts => raincloud}/pipeline/handlers/public_bi_merge.py (82%) rename {scripts => raincloud}/pipeline/handlers/sas_xpt_parse.py (100%) rename {scripts => raincloud}/pipeline/handlers/stack_exchange_split.py (63%) rename {scripts => raincloud}/pipeline/handlers/text_whitespace_parse.py (50%) rename {scripts => raincloud}/pipeline/handlers/tighten_types.py (68%) create mode 100644 raincloud/pipeline/handlers/tlc_merge_months.py create mode 100644 raincloud/pipeline/handlers/uci_default.py create mode 100644 raincloud/pipeline/handlers/uci_diabetes_parse.py create mode 100644 raincloud/pipeline/handlers/wikipedia_variant_parse.py create mode 100644 raincloud/pipeline/handlers/xlsx_parse.py rename {scripts => raincloud}/pipeline/hydrate.py (59%) create mode 100644 raincloud/pipeline/ledger.py create mode 100644 raincloud/pipeline/lifecycle.py create mode 100644 raincloud/pipeline/list_datasets.py create mode 100644 raincloud/pipeline/overnight_profile.py create mode 100644 raincloud/pipeline/parse.py rename {scripts => raincloud}/pipeline/profile.py (79%) create mode 100644 raincloud/pipeline/promote_profiles.py create mode 100644 raincloud/pipeline/publish.py create mode 100644 raincloud/pipeline/records.py create mode 100644 raincloud/pipeline/selection.py create mode 100644 raincloud/pipeline/spec.py create mode 100644 raincloud/pipeline/status.py create mode 100644 raincloud/pipeline/transform.py rename {scripts => raincloud}/pipeline/validate.py (69%) create mode 100644 raincloud/pipeline/validate_manifest.py create mode 100644 raincloud/pipeline/variant.py delete mode 100644 scripts/pipeline/__init__.py delete mode 100644 scripts/pipeline/_enrich_public_bi.py delete mode 100644 scripts/pipeline/build.py delete mode 100644 scripts/pipeline/convert.py delete mode 100644 scripts/pipeline/custom_fetch.py delete mode 100644 scripts/pipeline/extract.py delete mode 100644 scripts/pipeline/fetch.py delete mode 100644 scripts/pipeline/handlers/__init__.py delete mode 100644 scripts/pipeline/handlers/factbook_variant_parse.py delete mode 100644 scripts/pipeline/handlers/hf_concat_splits.py delete mode 100644 scripts/pipeline/handlers/jsonbench_variant_parse.py delete mode 100644 scripts/pipeline/handlers/lichess_pgn_parse.py delete mode 100644 scripts/pipeline/handlers/openlibrary_parse.py delete mode 100644 scripts/pipeline/handlers/tlc_merge_months.py delete mode 100644 scripts/pipeline/handlers/uci_default.py delete mode 100644 scripts/pipeline/handlers/uci_diabetes_parse.py delete mode 100644 scripts/pipeline/handlers/wikipedia_variant_parse.py delete mode 100644 scripts/pipeline/handlers/xlsx_parse.py delete mode 100644 scripts/pipeline/list_datasets.py delete mode 100644 scripts/pipeline/overnight_profile.py delete mode 100644 scripts/pipeline/parse.py delete mode 100644 scripts/pipeline/promote_profiles.py delete mode 100644 scripts/pipeline/publish.py delete mode 100644 scripts/pipeline/spec.py delete mode 100644 scripts/pipeline/status.py delete mode 100644 scripts/pipeline/tighten_variant.py delete mode 100644 scripts/pipeline/transform.py delete mode 100644 scripts/pipeline/validate_manifest.py delete mode 100644 scripts/pipeline/write.py create mode 100644 scripts/test_native_readers.py create mode 100644 sidecars/README.md create mode 100644 sidecars/java/.gitignore create mode 100644 sidecars/java/conformance-common/build.gradle.kts create mode 100644 sidecars/java/conformance-common/src/main/java/dev/raincloud/sidecar/common/ArrowValues.java create mode 100644 sidecars/java/conformance-common/src/main/java/dev/raincloud/sidecar/common/BatchSource.java create mode 100644 sidecars/java/conformance-common/src/main/java/dev/raincloud/sidecar/common/CanonicalReader.java create mode 100644 sidecars/java/conformance-common/src/main/java/dev/raincloud/sidecar/common/Cli.java create mode 100644 sidecars/java/conformance-common/src/main/java/dev/raincloud/sidecar/common/ComparatorGap.java create mode 100644 sidecars/java/conformance-common/src/main/java/dev/raincloud/sidecar/common/Knobs.java create mode 100644 sidecars/java/conformance-common/src/main/java/dev/raincloud/sidecar/common/LogicalCompare.java create mode 100644 sidecars/java/conformance-common/src/main/java/dev/raincloud/sidecar/common/MaterializedTable.java create mode 100644 sidecars/java/conformance-common/src/main/java/dev/raincloud/sidecar/common/ReaderMain.java create mode 100644 sidecars/java/conformance-common/src/main/java/dev/raincloud/sidecar/common/Report.java create mode 100644 sidecars/java/conformance-common/src/main/java/dev/raincloud/sidecar/common/VariantFidelity.java create mode 100644 sidecars/java/conformance-common/src/main/java/dev/raincloud/sidecar/common/Verdict.java create mode 100644 sidecars/java/conformance-common/src/main/java/dev/raincloud/sidecar/common/WriterMain.java create mode 100644 sidecars/java/conformance-common/src/test/java/dev/raincloud/sidecar/common/KnobsTest.java create mode 100644 sidecars/java/conformance-common/src/test/java/dev/raincloud/sidecar/common/LogicalCompareTest.java create mode 100644 sidecars/java/conformance-common/src/test/java/dev/raincloud/sidecar/common/MaterializedTableTest.java create mode 100644 sidecars/java/conformance-common/src/test/java/dev/raincloud/sidecar/common/ReaderMainTest.java create mode 100644 sidecars/java/conformance-common/src/test/java/dev/raincloud/sidecar/common/WriterMainTest.java create mode 100644 sidecars/java/gradle.properties create mode 100644 sidecars/java/gradle/wrapper/gradle-wrapper.jar create mode 100644 sidecars/java/gradle/wrapper/gradle-wrapper.properties create mode 100755 sidecars/java/gradlew create mode 100644 sidecars/java/gradlew.bat create mode 160000 sidecars/java/parquet-arrow-java create mode 100644 sidecars/java/parquet-hardwood/build.gradle.kts create mode 100644 sidecars/java/parquet-hardwood/src/main/java/dev/raincloud/sidecar/hardwood/ConformanceReader.java create mode 100644 sidecars/java/parquet-hardwood/src/main/java/dev/raincloud/sidecar/hardwood/ConformanceWriter.java create mode 100644 sidecars/java/parquet-hardwood/src/main/java/dev/raincloud/sidecar/hardwood/HardwoodReader.java create mode 100644 sidecars/java/parquet-hardwood/src/main/java/dev/raincloud/sidecar/hardwood/HardwoodWriter.java create mode 100644 sidecars/java/parquet-hardwood/src/main/java/dev/raincloud/sidecar/hardwood/UnsupportedHardwoodTypeException.java create mode 100644 sidecars/java/parquet-hardwood/src/test/java/dev/raincloud/sidecar/hardwood/Canonicals.java create mode 100644 sidecars/java/parquet-hardwood/src/test/java/dev/raincloud/sidecar/hardwood/ConformanceMainsTest.java create mode 100644 sidecars/java/parquet-hardwood/src/test/java/dev/raincloud/sidecar/hardwood/HardwoodIoTest.java create mode 100644 sidecars/java/parquet-java/build.gradle.kts create mode 100644 sidecars/java/parquet-java/src/main/java/dev/raincloud/sidecar/parquetjava/ConformanceReader.java create mode 100644 sidecars/java/parquet-java/src/main/java/dev/raincloud/sidecar/parquetjava/ConformanceWriter.java create mode 100644 sidecars/java/parquet-java/src/main/java/dev/raincloud/sidecar/parquetjava/ParquetArrowIo.java create mode 100644 sidecars/java/parquet-java/src/test/java/dev/raincloud/sidecar/parquetjava/ConformanceWriterTest.java create mode 100644 sidecars/java/parquet-java/src/test/java/dev/raincloud/sidecar/parquetjava/ParquetArrowIoTest.java create mode 100644 sidecars/java/settings.gradle.kts create mode 100644 sidecars/java/vortex-jni-reader/build.gradle.kts create mode 100644 sidecars/java/vortex-jni-reader/src/main/java/dev/raincloud/sidecar/vortexjni/ConformanceReader.java create mode 100644 sidecars/java/vortex-jni-reader/src/main/java/dev/raincloud/sidecar/vortexjni/ConformanceWriter.java create mode 100644 sidecars/java/vortex-jni-reader/src/test/java/dev/raincloud/sidecar/vortexjni/ConformanceWriterTest.java create mode 100644 sidecars/knob_cases.json create mode 100644 sidecars/rust/.gitignore create mode 100644 sidecars/rust/Cargo.lock create mode 100644 sidecars/rust/Cargo.toml create mode 100644 sidecars/rust/src/bin/parquet_read.rs create mode 100644 sidecars/rust/src/bin/parquet_write.rs create mode 100644 sidecars/rust/src/bin/vortex_read.rs create mode 100644 sidecars/rust/src/bin/vortex_write.rs create mode 100644 sidecars/rust/src/lib.rs create mode 100644 tests/_helpers.py create mode 100644 tests/installed_base_probe.py create mode 100644 tests/reader_fixture.py create mode 100644 tests/test_artifact_lifecycle.py create mode 100644 tests/test_batch_ingestion.py create mode 100644 tests/test_build_profile_identity.py create mode 100644 tests/test_canonical.py create mode 100644 tests/test_catalog_lifecycle.py create mode 100644 tests/test_catalog_provenance.py create mode 100644 tests/test_catalog_tools.py create mode 100644 tests/test_client_boundaries.py create mode 100644 tests/test_compare_views.py create mode 100644 tests/test_compliance.py create mode 100644 tests/test_config.py create mode 100644 tests/test_dataset_readers.py create mode 100644 tests/test_docs_contracts.py create mode 100644 tests/test_duckdb_connect.py create mode 100644 tests/test_duckdb_table_batches.py create mode 100644 tests/test_duckdb_variant.py create mode 100644 tests/test_export_base.py create mode 100644 tests/test_export_conformance.py create mode 100644 tests/test_export_policy_views.py create mode 100644 tests/test_export_readback.py create mode 100644 tests/test_export_retry_skip.py create mode 100644 tests/test_export_unavailable.py create mode 100644 tests/test_exporters.py create mode 100644 tests/test_extract_identity.py create mode 100644 tests/test_faithful_handler_types.py create mode 100644 tests/test_fetch_identity.py create mode 100644 tests/test_generated.py create mode 100644 tests/test_ingest_contracts.py create mode 100644 tests/test_ingest_keeps_every_record.py create mode 100644 tests/test_ingest_safety.py create mode 100644 tests/test_java_reader_schema_compare.py create mode 100644 tests/test_jvm_sidecar_lanes.py create mode 100644 tests/test_ledger.py create mode 100644 tests/test_loader_arrow.py create mode 100644 tests/test_loader_contracts.py create mode 100644 tests/test_loader_v2.py create mode 100644 tests/test_maintenance_recovery.py create mode 100644 tests/test_manifest_policy.py create mode 100644 tests/test_native_clients.py create mode 100644 tests/test_native_protocol.py create mode 100644 tests/test_observation_identity.py create mode 100644 tests/test_operation_boundaries.py create mode 100644 tests/test_overnight_profile.py create mode 100644 tests/test_parquet_java_list_naming.py create mode 100644 tests/test_parquet_py_row_group_cuts.py create mode 100644 tests/test_parquet_variant_sidecars.py create mode 100644 tests/test_pipeline_contracts.py create mode 100644 tests/test_publication_recovery.py create mode 100644 tests/test_reader_fidelity.py create mode 100644 tests/test_reader_publication.py create mode 100644 tests/test_rust_client_recipe_parity.py create mode 100644 tests/test_rust_sidecars.py create mode 100644 tests/test_schema_conformance.py create mode 100644 tests/test_shard_batches.py create mode 100644 tests/test_sidecar.py create mode 100644 tests/test_system_config.py create mode 100644 tests/test_tpcds_generated.py create mode 100644 tests/test_variant.py create mode 100644 tests/test_variant_storage_nullability.py create mode 100644 tests/test_vortex_wide_nested_rows.py create mode 100644 tests/test_wikipedia_parquet.py diff --git a/.agents/README.md b/.agents/README.md index e383558..eade899 100644 --- a/.agents/README.md +++ b/.agents/README.md @@ -6,17 +6,17 @@ Everything an AI coding agent needs to operate inside this repo. The `.claude | Path | Role | |---|---| -| [`settings.json`](settings.json) | **Tracked** allow-list of safe, read-only Bash / git / WebFetch / pipeline commands. A fresh-clone agent gets these pre-approved so it doesn't burn turns on permission prompts. Side-effecting stages (build / fetch / extract / convert / tighten_variant) are intentionally *not* pre-approved here. | +| [`settings.json`](settings.json) | **Tracked** allow-list of safe, read-only Bash / git / WebFetch / pipeline commands. A fresh-clone agent gets these pre-approved so it doesn't burn turns on permission prompts. Side-effecting stages (build / fetch / extract / convert) are intentionally *not* pre-approved here. | | `settings.local.json` | **Gitignored** per-machine override — additional permissions specific to the local agent's session. Don't commit. | -| [`skills/`](skills/) | 21 invokable skills following the [Agent Skills](https://agentskills.io) standard — wrappers around pipeline entrypoints (`/raincloud-build`, `/raincloud-fetch`, `/raincloud-status`, `/raincloud-validate-manifest`, `/raincloud-list-datasets`, `/raincloud-load`, `/raincloud-publish`, …) and procedural playbooks (`/raincloud-add-dataset`, `/raincloud-add-handler`, `/raincloud-debug-build`, …). See [`skills/README.md`](skills/README.md). | +| [`skills/`](skills/) | 20 invokable skills following the [Agent Skills](https://agentskills.io) standard — wrappers around pipeline entrypoints (`/raincloud-build`, `/raincloud-fetch`, `/raincloud-status`, `/raincloud-validate-manifest`, `/raincloud-list-datasets`, `/raincloud-load`, `/raincloud-publish`, …) and procedural playbooks (`/raincloud-add-dataset`, `/raincloud-add-handler`, `/raincloud-debug-build`, …). See [`skills/README.md`](skills/README.md). | | [`context/`](context/) | Symlinks back to the repo-root canonical docs (`AGENTS.md`, `SKILLS.md`, `README.md`, `sources.schema.md`) so each `SKILL.md` can pull authoritative guidance via a stable relative path without copying. | | `scheduled_tasks.lock` | Gitignored — agent-runtime state. | ## Where to start (fresh-clone agent) 1. Read [`../AGENTS.md`](../AGENTS.md) (auto-loaded via `../CLAUDE.md → AGENTS.md` symlink) for the invariants. -2. Run `python -m scripts.pipeline.status --fast --missing-only` to verify the env. -3. Run `python -m scripts.pipeline.validate_manifest` to confirm the manifest is well-formed. +2. Run `python -m raincloud.pipeline.status --fast --missing-only` to verify the env. +3. Run `python -m raincloud.pipeline.validate_manifest` to confirm the manifest is well-formed. 4. Browse [`skills/README.md`](skills/README.md) for the catalog of invokable commands. ## Adding or editing a skill diff --git a/.agents/settings.json b/.agents/settings.json index abba671..772f821 100644 --- a/.agents/settings.json +++ b/.agents/settings.json @@ -1,31 +1,33 @@ { - "$comment": "Tracked agent settings — safe, read-only defaults shared across fresh clones. settings.local.json sits next to this file (gitignored) and overrides per-machine. Side-effecting pipeline stages (build, fetch, extract, convert, tighten_variant) are intentionally NOT pre-approved here — those skills carry disable-model-invocation: true and confirmation lives in AGENTS.md.", + "$comment": "Tracked agent settings shared across fresh clones: read-only queries over the repo and catalog, plus `uv sync --inexact` for environment setup (the one entry here that changes anything, and only the virtualenv; a sync without --inexact silently drops the other extras, so it is not pre-approved). Deliberately NOT here: arbitrary code execution (`python -c`), commands that regenerate derived files (`raincloud.pipeline.docs` rewrites the docs/ scratch copies in a checkout, or observations under the data directory, and holds the store lock; the /raincloud-docs skill pre-approves it while that skill is active), git commands that can delete or rewire (`git branch -D`, `git remote add/set-url/remove`), and the side-effecting pipeline stages (build, fetch, extract, export, convert, hydrate, publish) — those skills carry disable-model-invocation: true and confirmation lives in AGENTS.md. settings.local.json sits next to this file (gitignored) and overrides per-machine; that is where a maintainer adds anything above.", "permissions": { "allow": [ - "Bash(python -m scripts.pipeline.status *)", - "Bash(python -m scripts.pipeline.status)", - "Bash(python -m scripts.pipeline.validate_manifest *)", - "Bash(python -m scripts.pipeline.validate_manifest)", - "Bash(python -m scripts.pipeline.list_datasets *)", - "Bash(python -m scripts.pipeline.list_datasets)", - "Bash(python -m scripts.pipeline.docs *)", - "Bash(python -m scripts.pipeline.docs)", - "Bash(python -c *)", - "Bash(python3 -c *)", - "Bash(.venv/bin/python -c *)", - "Bash(.venv/bin/python -m scripts.pipeline.status *)", - "Bash(.venv/bin/python -m scripts.pipeline.validate_manifest *)", - "Bash(.venv/bin/python -m scripts.pipeline.docs *)", - "Bash(uv sync*)", - "Bash(uv run python -m scripts.pipeline.status *)", - "Bash(uv run python -m scripts.pipeline.validate_manifest *)", - "Bash(uv run python -m scripts.pipeline.docs *)", + "Bash(python -m raincloud.pipeline.status *)", + "Bash(python -m raincloud.pipeline.status)", + "Bash(python -m raincloud.pipeline.validate_manifest *)", + "Bash(python -m raincloud.pipeline.validate_manifest)", + "Bash(python -m raincloud.pipeline.list_datasets *)", + "Bash(python -m raincloud.pipeline.list_datasets)", + "Bash(.venv/bin/python -m raincloud.pipeline.status *)", + "Bash(.venv/bin/python -m raincloud.pipeline.validate_manifest *)", + "Bash(raincloud list*)", + "Bash(raincloud describe *)", + "Bash(raincloud config show)", + "Bash(raincloud capabilities)", + "Bash(uv sync *--inexact*)", + "Bash(uv run python -m raincloud.pipeline.status *)", + "Bash(uv run python -m raincloud.pipeline.validate_manifest *)", "Bash(git status*)", "Bash(git diff*)", "Bash(git log*)", "Bash(git show*)", - "Bash(git branch*)", - "Bash(git remote*)", + "Bash(git branch)", + "Bash(git branch -a)", + "Bash(git branch -vv)", + "Bash(git branch --show-current)", + "Bash(git branch --list*)", + "Bash(git remote -v)", + "Bash(git remote show*)", "Bash(git ls-files*)", "Bash(git rev-parse*)", "Bash(git blame*)", diff --git a/.agents/skills/README.md b/.agents/skills/README.md index d254491..cafaa40 100644 --- a/.agents/skills/README.md +++ b/.agents/skills/README.md @@ -6,24 +6,24 @@ Project-local skills for AI coding agents (Claude Code, plus other tools that fo ## Script wrappers -Wrappers around `python -m scripts.pipeline.`. Side-effecting ones set `disable-model-invocation: true` so Claude won't auto-trigger destructive work; read-only ones are model-invocable. +Wrappers around `python -m raincloud.pipeline.`. Side-effecting ones set `disable-model-invocation: true` so Claude won't auto-trigger destructive work; read-only ones are model-invocable. | Skill | Wraps | Purpose | |---|---|---| -| `/raincloud-build` | `scripts.pipeline.build` | Full pipeline (fetch → … → convert) for one or more slugs. | -| `/raincloud-fetch` | `scripts.pipeline.fetch` | Download raw bytes only. | -| `/raincloud-extract` | `scripts.pipeline.extract` | Unpack archives into `_workdir/`. | -| `/raincloud-convert` | `scripts.pipeline.convert` | Stage 7 — emit sibling `.vortex` per spec opt-in. | -| `/raincloud-hydrate` | `scripts.pipeline.hydrate` | Stage 8 (optional, opt-in) — dereference a slug's URL column into a sibling parquet under `parquet-hydrated/`. Side-effecting (outbound HTTP); safety-filter-gated; `disable-model-invocation: true`. | -| `/raincloud-docs` | `scripts.pipeline.docs` | Regenerate derived docs. *(model-invocable — regen is mostly idempotent.)* | -| `/raincloud-tighten-variant` | `scripts.pipeline.tighten_variant` | In-place JSON → VARIANT promotion. | -| `/raincloud-status` | `scripts.pipeline.status` | Per-slug filesystem state (raw / workdir / parquet / vortex / variant-pending). *(read-only, model-invocable.)* | -| `/raincloud-validate-manifest` | `scripts.pipeline.validate_manifest` | Static checks for `sources.json` — JSON Schema + handler-registry / slug-uniqueness / fetch-auth cross-checks. *(read-only, model-invocable.)* | -| `/raincloud-list-datasets` | `scripts.pipeline.list_datasets` | Filter/list slugs by handler / license / fetch-type / reader / vortex / tag / showcase / size / regex. *(read-only, model-invocable.)* | -| `/raincloud-discover` | `scripts.pipeline.list_datasets` | Find "interesting" datasets via the discoverability flags — tag / showcase / size / trait / view. *(read-only, model-invocable.)* | -| `/raincloud-profile` | `scripts.pipeline.profile` | Compute per-column statistics → `outputs/v1//profile.json` (opt-in; feeds the TUI detail pane + `list_datasets --inspect`). *(writes `profile.json`; model-invocable.)* | -| `/raincloud-load` | `raincloud.load` (loader API) | Load a prepared dataset (cache → mirror → local build) as a lazy `Dataset`; inspect metadata or materialize. *(`disable-model-invocation: true`.)* | -| `/raincloud-publish` | `scripts.pipeline.publish` | Sync built `outputs/v1/...` artefacts to a mirror, gated on the snapshot sha256. *(side-effecting — `disable-model-invocation: true`.)* | +| `/raincloud-build` | `raincloud.pipeline.build` | Full pipeline (fetch → … → write_canonical → validate → run_exporters) for one or more slugs. | +| `/raincloud-fetch` | `raincloud.pipeline.fetch` | Download raw bytes only. | +| `/raincloud-extract` | `raincloud.pipeline.extract` | Unpack archives into the recipe's scratch directory. | +| `/raincloud-export` | `raincloud.pipeline.export` | Re-derive Parquet/Vortex from the canonical Arrow already on disk, without refetching; the refresh path for one format. | +| `/raincloud-convert` | `raincloud.pipeline.convert` | Re-encode Vortex with the Python writer (v1 catalogs: from Parquet). For v2, prefer `/raincloud-export --format vortex`. | +| `/raincloud-hydrate` | `raincloud.pipeline.hydrate` | Build a `-hydrated` dataset (URL columns fetched from the open web) with the safe defaults, or write a scratch sample with non-default options (`--limit`/`--block`/`--urlhaus`/`--max-bytes`/`--timeout`/bypass), never published or served. Side-effecting (outbound HTTP); safety-filter-gated; `disable-model-invocation: true`. | +| `/raincloud-docs` | `raincloud.pipeline.docs` | Regenerate derived docs. *(model-invocable — regen is mostly idempotent.)* | +| `/raincloud-status` | `raincloud.pipeline.status` | Per-slug filesystem state (raw / work / arrow / parquet / vortex). *(read-only, model-invocable.)* | +| `/raincloud-validate-manifest` | `raincloud.pipeline.validate_manifest` | Static checks for `sources.json` — JSON Schema + handler-registry / slug-uniqueness / fetch-auth cross-checks. *(read-only, model-invocable.)* | +| `/raincloud-list-datasets` | `raincloud.pipeline.list_datasets` | Filter/list slugs by handler / license / fetch-type / reader / vortex / tag / showcase / size / regex. *(read-only, model-invocable.)* | +| `/raincloud-discover` | `raincloud.pipeline.list_datasets` | Find "interesting" datasets via the discoverability flags — tag / showcase / size / trait / view. *(read-only, model-invocable.)* | +| `/raincloud-profile` | `raincloud.pipeline.profile` | Compute per-column statistics → `outputs/v{n}//profile.json` (opt-in; feeds the TUI detail pane + `list_datasets --inspect`). *(writes `profile.json`; model-invocable.)* | +| `/raincloud-load` | `raincloud.load` (loader API) | Load a prepared dataset (cache → mirror; never builds implicitly) as a lazy `Dataset`; inspect metadata or materialize. *(`disable-model-invocation: true`.)* | +| `/raincloud-publish` | `raincloud.pipeline.publish` | Place built artefacts in this machine's store and release the catalog (`--store`), or upload them to a mirror (`--mirror`), gated on the snapshot sha256. *(side-effecting — `disable-model-invocation: true`.)* | ## Procedural playbooks (model-invocable) @@ -32,9 +32,9 @@ These guide multi-step procedures from [`SKILLS.md`](../context/SKILLS.md). Defa | Skill | When to use | |---|---| | `/raincloud-add-dataset` | Adding a new dataset to `sources.json` and producing its first build. | -| `/raincloud-add-handler` | Writing a new transform handler under `scripts/pipeline/handlers/`. | +| `/raincloud-add-handler` | Writing a new transform handler under `raincloud/pipeline/handlers/`. | | `/raincloud-add-kaggle-tos` | Adding a Kaggle dataset gated behind a one-time ToS click-through. | -| `/raincloud-promote-variant` | Picks the right path (in-place vs new-build) for JSON → VARIANT. | +| `/raincloud-promote-variant` | JSON → VARIANT via the transform recipe and a rebuild. | | `/raincloud-debug-build` | Diagnostic checklist for a failing build — isolate which stage broke. | | `/raincloud-large-build` | Run a memory- or runtime-heavy build safely (caps, nohup, logging). *(side-effecting — `disable-model-invocation: true`.)* | | `/raincloud-remove-dataset` | Remove a dataset from the manifest and clean up its outputs. *(destructive — `disable-model-invocation: true`.)* | @@ -66,4 +66,4 @@ Reference: . Frontmatter fields used her - `description` — front-load the key use case (truncated at 1,536 chars in the listing). - `argument-hint` — autocomplete hint for `/ `. - `disable-model-invocation` — `true` for side-effecting skills so Claude won't auto-trigger them. -- `allowed-tools` — pre-approve specific tool patterns when the skill is active (e.g. `Bash(python -m scripts.pipeline.build *)`). +- `allowed-tools` — pre-approve specific tool patterns when the skill is active (e.g. `Bash(python -m raincloud.pipeline.build *)`). diff --git a/.agents/skills/raincloud-add-dataset/SKILL.md b/.agents/skills/raincloud-add-dataset/SKILL.md index 0d14b79..f439ab8 100644 --- a/.agents/skills/raincloud-add-dataset/SKILL.md +++ b/.agents/skills/raincloud-add-dataset/SKILL.md @@ -10,33 +10,17 @@ Steps: 1. **Identify the upstream.** Confirm with the user: - A stable public URL (prefer the publisher's canonical endpoint over a mirror). - - The license — must permit redistribution-of-derivatives. Check SPDX ID and `source_url`. + - The license, recorded accurately: SPDX ID, `source_url`, `redistribution_permitted`, and `scrape_advisory` for broad-web crawls. A license that forbids redistribution does not keep a dataset out of the catalog; the redistribution gates apply only to `publish --mirror`. - Approximate row count (used for `expect.rows`; can be `null` on first build). -2. **Append a `DatasetSpec` to `sources.json`** using the Python load-edit-dump pattern from [AGENTS.md](../../context/AGENTS.md#safe-ways-to-edit-sourcesjson) — never `sed`. Start from [`templates/minimal_spec.json`](../../../templates/minimal_spec.json) (every field present with placeholder values) rather than typing one from scratch. Minimal direct-HTTP shape: - - ```jsonc - { - "slug": "my-dataset", - "short_name": "My Dataset", - "full_name": "My Dataset (publisher attribution)", - "description": "One-line summary.", - "license": { "spdx": "CC0-1.0", "source_url": "...", "redistribution_permitted": true, "attribution_required": false }, - "fetch": { "type": "http", "urls": ["https://..."], "auth": null }, - "extract": { "type": "passthrough" }, - "parse": { "reader": "csv", "options": { "delimiter": "," } }, - "transform": { "handler": "tighten_types", "params": {} }, - "write": { "output": "my-dataset.parquet", "compression": "zstd", "row_group_size_rows": 1048576, "statistics": true }, - "expect": { "rows": 123456 } - } - ``` +2. **Append a `DatasetSpec` to `sources.json`** using the Python load-edit-dump pattern from [AGENTS.md](../../context/AGENTS.md#editing-sourcesjson) — never `sed`. Copy [`templates/minimal_spec.json`](../../../templates/minimal_spec.json), which has every required field and validates as-is, and edit its placeholders rather than typing a spec from scratch. Keep its `write.*` values: they match the rest of the catalog, and `write.row_group_size_rows` is a row cap on top of the byte-sized row groups, and it wins over `RAINCLOUD_ROW_GROUP_MAX_ROWS` in every Parquet writer (the sidecars receive it through that variable), so a smaller value makes every Parquet export's groups smaller. [sources.schema.md](../../context/sources.schema.md) documents each field. 3. **Validate the manifest.** Invoke `/raincloud-validate-manifest` — sub-second check that the new entry has the right shape, the handler resolves, the slug is unique, and `fetch.type`/`fetch.auth` agree. Catches typos before paying for a fetch. -4. **Run the first build.** Invoke `/raincloud-build --loose` (the `--loose` is essential when the row count is a guess). If `expect.rows` was wrong, update the manifest with the actual count once the build succeeds. +4. **Run the first build.** Invoke `/raincloud-build ` (validation drift is a warning by default; add `--strict` for a hard gate). If `expect.rows` was wrong, update the manifest with the actual count once the build succeeds. -5. **Regenerate docs.** Invoke `/raincloud-docs` (or just `/raincloud-docs datasets columns_parquet coverage_parquet`). +5. **Regenerate docs.** Invoke `/raincloud-docs` (or just `python -m raincloud.pipeline.docs`). -6. **Optionally opt into Vortex.** If the dataset's types are vortex-compatible, add `"convert": { "vortex": true }` to the spec and run `/raincloud-convert `. +6. **Choose exports.** Without an `export` block a dataset exports Parquet and Vortex. `export.formats` is the only declaration of which formats it wants: `["parquet"]` leaves Vortex out, `[]` keeps only the canonical Arrow file. Keep a format listed even if its writer fails on the data: the build records the failure as the format's measured unavailability and carries on. `export.priority` prefers a writer, either for every format (`["rs", "py"]`, which must then name a writer for each exported format) or per format (`{"parquet": ["rs", "py"]}`); each format is one file whichever writer makes it. `convert.vortex` is v1-only and rejected in v2. Use `/raincloud-export --format vortex` to refresh one format without refetching. If the upstream needs unpacking, set `extract.type` accordingly and pick a parser — see existing specs in `sources.json` for shapes. If the source has nested JSON or row-level processing, you'll likely need a custom handler — see `/raincloud-add-handler`. If it's a Kaggle dataset behind ToS acceptance, see `/raincloud-add-kaggle-tos`. diff --git a/.agents/skills/raincloud-add-handler/SKILL.md b/.agents/skills/raincloud-add-handler/SKILL.md index 713b721..69f39e1 100644 --- a/.agents/skills/raincloud-add-handler/SKILL.md +++ b/.agents/skills/raincloud-add-handler/SKILL.md @@ -1,6 +1,6 @@ --- name: raincloud-add-handler -description: Walk through writing a new transform handler under scripts/pipeline/handlers/. Use when the default tighten_types/identity paths can't produce the right shape — row-level JSON parsing, streaming to avoid OOM, multi-output splitting, or VARIANT-from-the-start. +description: Walk through writing a new transform handler under raincloud/pipeline/handlers/. Use when the default tighten_types/identity paths can't produce the right shape — row-level JSON parsing, streaming to avoid OOM, multi-output splitting, or VARIANT-from-the-start. argument-hint: [] --- @@ -10,34 +10,38 @@ When this is the right pattern: the default `tighten_types` / `identity` paths c Steps: -1. **Create the handler** at `scripts/pipeline/handlers/.py`. Signature: +1. **Create the handler** at `raincloud/pipeline/handlers/.py`. Signature: ```python - def (spec: dict, parsed: list[tuple[Path, pa.Table | None]], **params - ) -> list[tuple[str, pa.Table]]: + def (spec: dict, parsed: list[tuple[Path, pa.Table | BatchStream | None]], **params + ) -> list[tuple[str, pa.Table | BatchStream]]: ... ``` - - `parsed` contains one `(path, table)` tuple per parsed file; `table` is `None` when `parse.reader = "custom"`. - - Return `[(output_slug, table), ...]` — one tuple per output parquet. Multi-output handlers emit several slugs from one source (see `glove_split`, `osm_pbf_split`, `stack_exchange_split`). - - **Streaming handlers** (write direct to parquet, bypass the write stage) return `[]`. Copy [`templates/streaming_handler.py.tmpl`](../../../templates/streaming_handler.py.tmpl) as the starting point — it has the `outputs_root()` / `duckdb_connect()` / cleanup wiring already shaped — and study `factbook_variant_parse`, `wikipedia_variant_parse`, `lichess_pgn_parse` for upstream-shape variations. + - `parsed` contains one `(path, table)` tuple per parsed file; `table` is a `BatchStream` for a reader the handler declares with `batches.batch_input`, and `None` when `parse.reader = "custom"`. + - Return `[(output_slug, table), ...]` — one tuple per canonical output, a `Table` or a fixed-schema `BatchStream`. Multi-output handlers emit several slugs from one source (see `glove_split`, `osm_pbf_split`, `stack_exchange_split`). + - **Streaming handlers** write canonical Arrow IPC incrementally with `canonical.open_canonical_writer`, then return `[]`. The builder validates the canonical and derives exports from it. Copy [`templates/streaming_handler.py.tmpl`](../../../templates/streaming_handler.py.tmpl); it demonstrates configured scratch paths, `duckdb_connect`, Arrow batches and cleanup. Study `lichess_pgn_parse`, `jsonbench_variant_parse`, and `wikipedia_variant_parse` for other upstream shapes. Run it only through the builder: `build.run_one` scopes `workdir_root()` to the recipe, registers the canonical the writer produces so it is published atomically, holds the operation lock and writes the build record. -2. **Register** in `scripts/pipeline/handlers/__init__.py`: +2. **Declare** it in `raincloud/_registry.py`: ```python - from . import - _REGISTRY = { + # raincloud/_registry.py + HANDLERS: dict[str, str] = { ... - "": , + "": ":", # ":" under handlers/ } ``` + That is the only place to add it. The registry imports the module on demand + and the catalog capability list is derived from the same declaration, so + there is no second file to keep in step. + 3. **Wire it into the manifest** — set `"transform": { "handler": "", "params": { ... } }` on the relevant spec. -4. **Run the test suite** — `pytest` checks that every handler in `_REGISTRY` imports and that there are no orphans (registered but unreferenced) or unregistered handler names in the manifest. Sub-second; catches typos before paying for a fetch. +4. **Validate** — `python -m raincloud.pipeline.validate_manifest` checks that every handler name in the manifest is declared in `HANDLERS` and warns on orphans (declared but unreferenced); `pytest tests/test_manifest.py` checks that every `HANDLERS` entry imports (`test_handlers_all_import`; the `_REGISTRY` in `handlers/__init__.py` is derived from `HANDLERS`). Seconds; catches typos before paying for a fetch. -5. **Build the dataset** — invoke `/raincloud-build --loose` to validate end-to-end. +5. **Build the dataset** — invoke `/raincloud-build ` to validate end-to-end. -Style: handlers stay short (most under 150 lines). Reuse `duckdb_connect`, `outputs_root`, `spec_field` from `scripts.pipeline.spec` rather than reimplementing. Don't shoehorn a new shape into `tighten_types` or `identity` — write a dedicated handler. +Style: handlers stay short (most under 150 lines). Reuse `open_canonical_writer` from `raincloud.pipeline.canonical`, `duckdb_connect` from `raincloud`, and `workdir_root`, `spec_field` from `raincloud.pipeline.spec`. Don't shoehorn a new shape into `tighten_types` or `identity` — write a dedicated handler. -For VARIANT-from-the-start handlers, use DuckDB's `CAST(to_json(col) AS VARIANT)` inside `COPY ... TO PARQUET`. `duckdb_connect(db_path)` applies `storage_compatibility_version=v1.5.0` automatically. See `factbook_variant_parse` (1-column) and `wikipedia_variant_parse` (multi-column with typed siblings). +For VARIANT-from-the-start handlers, parse the JSON before casting — `CAST(CAST(col AS JSON) AS VARIANT)` for a JSON text column, `CAST(to_json(col) AS VARIANT)` for a DuckDB struct — in the ingestion query, then `duckdb_variant.to_canonical_arrow` (small tables) or `stream_canonical_arrow` (batches) to preserve the shredded representation and field marker. `to_canonical_arrow` projects each VARIANT column through `variant_to_parquet_variant(...)` for you; for `stream_canonical_arrow`, project each one in the SQL yourself (see `wikipedia_variant_parse`). `duckdb_connect(db_path)` applies `storage_compatibility_version=v1.5.0` automatically. See `factbook_variant_parse` and `wikipedia_variant_parse`. diff --git a/.agents/skills/raincloud-add-kaggle-tos/SKILL.md b/.agents/skills/raincloud-add-kaggle-tos/SKILL.md index 747e301..c45b03d 100644 --- a/.agents/skills/raincloud-add-kaggle-tos/SKILL.md +++ b/.agents/skills/raincloud-add-kaggle-tos/SKILL.md @@ -23,15 +23,15 @@ Steps: "expect": { "rows": null, "notes": "Row count populated after the first successful build." } ``` - Use the [Python load-edit-dump pattern](../../context/AGENTS.md#safe-ways-to-edit-sourcesjson) — never `sed`. + Use the [Python load-edit-dump pattern](../../context/AGENTS.md#editing-sourcesjson) — never `sed`. -2. **Confirm Kaggle creds are set up:** `~/.kaggle/kaggle.json` with `chmod 600`, and the project synced via `uv sync --extra kaggle --inexact`. +2. **Confirm Kaggle creds are set up:** a Kaggle API token in `KAGGLE_API_TOKEN` or `~/.kaggle/access_token` (mode 600; the legacy `~/.kaggle/kaggle.json` still works), and the project synced via `uv sync --extra kaggle --inexact`. -3. **Try the first build via `/raincloud-build --loose`.** Pre-flight will print `kaggle (ToS-gated): ...`. Expect a 403 on the first try. The error message will point at the exact Kaggle URL the user must visit. +3. **Try the first build via `/raincloud-build `.** Pre-flight will print `kaggle (ToS-gated): ...`. Expect a 403 on the first try. The error message will point at the exact Kaggle URL the user must visit. 4. **Tell the user to click Download once** in a browser signed into Kaggle. The 403 handler is generic — it triggers whether or not `requires_interactive_accept` is set, so forgetting the flag still yields a useful error; the flag only improves the up-front announcement. -5. **Re-run `/raincloud-build --loose`.** It should succeed. +5. **Re-run `/raincloud-build `.** It should succeed. 6. **Update `expect.rows`** in the manifest with the actual count and **drop `expect.notes`** (now that the row count is known). diff --git a/.agents/skills/raincloud-build/SKILL.md b/.agents/skills/raincloud-build/SKILL.md index 2b24d45..9d5faeb 100644 --- a/.agents/skills/raincloud-build/SKILL.md +++ b/.agents/skills/raincloud-build/SKILL.md @@ -1,36 +1,40 @@ --- name: raincloud-build -description: Run the full Raincloud pipeline (fetch → extract → parse → transform → write → validate → convert) for one or more dataset slugs. Use when the user asks to build a dataset, rebuild a slug, or process a batch. -argument-hint: ... | --all [--loose] [--clean-workdir] +description: Run the full Raincloud pipeline (fetch → extract → parse → transform → canonical Arrow → validate → exports) for one or more dataset slugs. Use when the user asks to build a dataset, rebuild a slug, or process a batch. +argument-hint: ... | --all [--strict] [--clean-workdir] [--retry-errors] disable-model-invocation: true -allowed-tools: Bash(python -m scripts.pipeline.build *) +allowed-tools: Bash(python -m raincloud.pipeline.build *) --- Run the Raincloud build orchestrator with the user's args: ```bash -python -m scripts.pipeline.build $ARGUMENTS +python -m raincloud.pipeline.build $ARGUMENTS ``` Selection (at least one required): - `...` — positional dataset slugs (any number) -- `--all` — every dataset in `sources.json` +- `--all` — every dataset in `sources.json` except hydrated ones (name those explicitly) Modifiers: -- `--loose` — downgrade `expect.rows` mismatches from errors to warnings. Use on the first build of a new slug before you know the exact row count. -- `--clean-workdir` — wipe `_workdir//` after each successful build. Essential for large batch runs (Public BI decompressed CSVs can hit ~100 GB). +- `--strict` — make validation drift an error. By default, row-count mismatches are warnings; use that default for first builds with estimated counts. +- `--clean-workdir` — clear the selected `.recipes///` scratch directory after each successful build. Essential for large batch runs (Public BI decompressed CSVs can hit ~100 GB). +- `--retry-errors` — attempt a format even when its writer, with this toolchain, already failed to write it at this recipe (see below). Without it that format is skipped. Before running: -- **Confirm with the user** before triggering anything non-trivial. JSONBench 100M ≈ 6 h, Wikipedia Structured Contents → 34 GB parquet, OSM Germany ~45 min per kind. Small (<100 MB) parquets are fine without asking. (See [AGENTS.md "Rebuilding is expensive"](../../context/AGENTS.md).) +- **Confirm with the user** before triggering anything non-trivial. JSONBench 100M ≈ 6 h, Wikipedia Structured Contents → ~70 GB parquet, OSM Germany ~45 min per kind. Small (<100 MB) parquets are fine without asking. (See [AGENTS.md "Confirm before rebuilding"](../../context/AGENTS.md#confirm-before-rebuilding).) - For large builds, set `RAINCLOUD_DUCKDB_MEMORY_LIMIT` and `RAINCLOUD_DUCKDB_TEMP_DIRECTORY` — see `/raincloud-large-build` for the full pattern. -- For Kaggle/HF datasets, ensure `uv sync --extra kaggle --inexact` (or `--extra huggingface --inexact`) was run. The `--inexact` flag is important: without it, syncing one extra removes the others. +- A dataset whose format or source needs an extra names it when missing: `osm`, `sas`, `excel`, `archives`, `generated` (TPC-H/TPC-DS), `kaggle`, `huggingface`. Install with `uv sync --extra --inexact`. The `--inexact` flag is important: without it, syncing one extra removes the others. +- An unknown slug exits 2 with a did-you-mean before anything runs. A build missing a format's writer (e.g. no `raincloud[vortex]`) fails in about a second, naming the extra, before it fetches anything. +- A writer that runs but cannot produce its format for the dataset (raises, dies, reports a failed round-trip, or exceeds `RAINCLOUD_EXPORT_TIMEOUT`, default 6 h) does not fail the build: it prints `[unavailable] /`, records the measurement in the build record, and the build exits 0 with the formats that worked. Report those lines to the user; `raincloud describe ` quotes the recorded reason. +- A failure already recorded is not repeated. When the measurement that applies (this install's build record at the recipe, else the catalog's) names the same writer cell, the same toolchain versions and the same canonical, the build prints `[skip] /: () failed at this recipe on : ; pass --retry-errors to try again`, keeps the measurement, lists it in the summary, and still exits 0. A changed toolchain (an upgraded `vortex-data`, a new sidecar binary) or a rebuilt canonical is attempted on its own, with a `[retry]` line saying what changed. Report skips to the user; only pass `--retry-errors` when they ask to try again with nothing changed (it can cost the full export time limit). After a successful build, suggest running `/raincloud-docs` to regenerate derived docs. Context: [SKILLS.md](../../context/SKILLS.md), [AGENTS.md](../../context/AGENTS.md). -## Note (0.1.4) +## Per-column profiles Per-column profiles are a separate opt-in stage: -`python -m scripts.pipeline.profile ` after a build. Not part of the +`python -m raincloud.pipeline.profile ` after a build. Not part of the default build pipeline. See `raincloud-profile` skill. diff --git a/.agents/skills/raincloud-convert/SKILL.md b/.agents/skills/raincloud-convert/SKILL.md index 281208a..04c1a3b 100644 --- a/.agents/skills/raincloud-convert/SKILL.md +++ b/.agents/skills/raincloud-convert/SKILL.md @@ -1,15 +1,15 @@ --- name: raincloud-convert -description: Run only stage 7 — emit a sibling .vortex next to each opted-in parquet. Use when the user asks to (re)convert parquet files to Vortex format without rebuilding from raw bytes. -argument-hint: ... | --all +description: Re-encode prepared data to Vortex with the Python writer (v1 catalogs convert from Parquet). For a v2 catalog prefer /raincloud-export --format vortex, the refresh path that follows the dataset's export policy. +argument-hint: ... | --all [--retry-errors] disable-model-invocation: true -allowed-tools: Bash(python -m scripts.pipeline.convert *) +allowed-tools: Bash(python -m raincloud.pipeline.convert *) --- -Run the convert-only entrypoint: +For a `schema_version` 2 catalog, refresh a Vortex file with `/raincloud-export --format vortex` instead. It picks the writer from `export.priority` exactly as a build does, and records the file in the build record. This skill runs the older convert-only entrypoint: ```bash -python -m scripts.pipeline.convert $ARGUMENTS +python -m raincloud.pipeline.convert $ARGUMENTS ``` Selection (at least one required): @@ -17,15 +17,9 @@ Selection (at least one required): - `--all` — every dataset in the manifest Behavior: -- Only acts on specs that have `convert.vortex: true` in `sources.json` — others are reported as "no opt-in" and skipped. -- Idempotent: skips when `.vortex` is newer than `.parquet`. -- Writes the base vortex at `outputs/v{n}//vortex/.vortex`. -- **Hydrated companion:** when a slug has both `convert.vortex: true` AND a hydrated parquet at `outputs/v{n}//parquet-hydrated/.parquet` (produced by `/raincloud-hydrate`), this stage *also* writes `outputs/v{n}//vortex-hydrated/.vortex` in the same run. Same opt-in flag governs both pairs. +- It uses the Python Vortex writer (`vortex@py`) only. In v2 it is, in effect, `python -m raincloud.pipeline.export --format vortex@py` with a reuse check, and runs only where `vortex@py` is the declared Vortex writer (`export.formats` / `export.priority`); a dataset whose priority puts another Vortex writer first is skipped, so use `/raincloud-export` for it. In v1 it converts prepared Parquet when `convert.vortex=true`. +- V2 reads canonical Arrow. It reuses an existing Vortex file only when the build record says `vortex@py` wrote it from the current recipe after the canonical; it refuses a canonical this install built from an earlier recipe, and one that is neither this install's build nor the catalog's file (rebuild either with `raincloud build `); and it records what it writes in the build record. A slug named outright that is not converted (not opted in, or not built) makes the command exit 1. A failure `vortex@py` already recorded at this recipe with this toolchain, from this canonical, is not repeated: the slug is reported `[fail]` after a `[skip]` line (exit 1), unless `--retry-errors` is passed. V1 reuses a Vortex file newer than its Parquet. Writes hold the store lock and replace the file by rename. +- An unknown slug exits 2 with a did-you-mean before any work; `--all` skips hydrated datasets. +- Vortex support comes from `[vortex]` or `[build]`. Unsupported types may fail; consult current conformance results rather than historical version-specific gaps. -Known type-support gaps (vortex 0.69 — see [SKILLS.md](../../context/SKILLS.md#emitting-a-vortex-file-alongside-the-parquet) and [docs/v1/vortex_skip.md](../../docs/v1/vortex_skip.md)): -- `FixedSizeBinary(N)` not yet supported (blocks `wikipedia-structured-contents`'s UUIDs; this is also why hydrate's `_hydrate_provenance.sha256` is `binary` not `fixed_size_binary[32]`). -- VARIANT columns surface as their shredded struct on round-trip — size blow-up on heavily-nested payloads. -- Per-file overhead dominates on very small parquets — size ratio can exceed 1.0 under a few MB. -- `Decimal128` works via the current `pf.read() → vxio.write(table)` path. - -After a convert run, suggest `/raincloud-docs coverage_vortex columns_vortex` to refresh the vortex-side derived docs. +After conversion, regenerate derived docs with `python -m raincloud.pipeline.docs`. diff --git a/.agents/skills/raincloud-debug-build/SKILL.md b/.agents/skills/raincloud-debug-build/SKILL.md index 1066c4e..fb4a3a2 100644 --- a/.agents/skills/raincloud-debug-build/SKILL.md +++ b/.agents/skills/raincloud-debug-build/SKILL.md @@ -4,14 +4,14 @@ description: Diagnostic checklist for a failing build — isolate which stage br argument-hint: --- -Triage a failing `/raincloud-build $ARGUMENTS`. Reference: [SKILLS.md "Debugging a failing build"](../../context/SKILLS.md#debugging-a-failing-build). +Triage a failing `/raincloud-build `. Reference: [SKILLS.md "Debugging a failing build"](../../context/SKILLS.md#debugging-a-failing-build). Walk these in order — stop as soon as the cause is found: -1. **Is it a row-count mismatch in validate?** Re-run with `--loose` to convert the error to a warning: +1. **Is it a row-count mismatch in validate?** If running with `--strict`, omit it to use the default warning behavior: ```bash - python -m scripts.pipeline.build $ARGUMENTS --loose + python -m raincloud.pipeline.build ``` If the build now succeeds, update `expect.rows` in `sources.json` to the actual count. @@ -19,28 +19,28 @@ Walk these in order — stop as soon as the cause is found: 2. **Isolate the stage** — invoke each independently to see exactly where it breaks: ```bash - python -m scripts.pipeline.fetch $ARGUMENTS - python -m scripts.pipeline.extract $ARGUMENTS + python -m raincloud.pipeline.fetch + python -m raincloud.pipeline.extract ``` - (`parse`, `transform`, `write`, `validate`, `convert` are not standalone CLIs — once `extract` runs cleanly, fall through to `/raincloud-build`.) + Pass these stage commands slugs only (or `--all`); build flags such as `--strict` are not theirs. Once extract runs cleanly, use `/raincloud-build` for parse/transform/canonical validation. `python -m raincloud.pipeline.export ` separately re-derives Parquet/Vortex from the canonical Arrow already on disk. -3. **Check the raw cache** at `outputs/raw_downloads//`. Fetch is idempotent and skips when `expected_bytes` / `expected_sha256` already match. If you suspect a stale or corrupt download, `rm -rf outputs/raw_downloads//` and re-fetch. +3. **Check the selected raw cache.** `raincloud config show` identifies configured roots. `raincloud.pipeline.spec.raw_slug_dir(slug)` resolves the selected catalog/fetch generation. Fetch skips matching cached payloads. If invalidating a cache, remove only that generation's upstream payloads; preserve sibling `.recipes/` generations and Raincloud metadata. -4. **Check `_workdir//`** — extract stage output. If a handler complains "no .xxx files", look here first to see what was actually unpacked. +4. **Check the configured scratch directory** — build scratch is under `.recipes///`. If a handler complains "no .xxx files", look here first to see what was actually unpacked. 5. **DuckDB OOM / swap thrash** — cap memory and redirect spill: ```bash RAINCLOUD_DUCKDB_MEMORY_LIMIT=8GB \ RAINCLOUD_DUCKDB_TEMP_DIRECTORY=/mnt/scratch/duckdb-tmp \ - python -m scripts.pipeline.build $ARGUMENTS --loose + python -m raincloud.pipeline.build ``` - Default DuckDB memory_limit (~80% of system RAM) can swap-thrash on heavily-nested VARIANT shredding. See [README.md "DuckDB resource limits"](../../context/README.md#duckdb-resource-limits). + Default DuckDB memory_limit (~80% of system RAM) can swap-thrash on heavily-nested VARIANT shredding. See [AGENTS.md "Data locations"](../../context/AGENTS.md#data-locations). 6. **Kaggle 403** — see `/raincloud-add-kaggle-tos`. The fetch error message points at the URL to click through. -7. **Vortex panic on convert** — known type-support gaps in vortex 0.69 (FixedSizeBinary(16), VARIANT round-trip blow-up). See `/raincloud-convert` and [SKILLS.md](../../context/SKILLS.md#emitting-a-vortex-file-alongside-the-parquet). +7. **Vortex failure on export** — the build does not fail: it records the failure as Vortex's "unavailable" measurement and prints `[unavailable] /vortex`. `raincloud describe ` quotes the recorded error and toolchain; compare with current conformance results for the installed writer, since type support depends on that version. A writer that loops is stopped by `RAINCLOUD_EXPORT_TIMEOUT`. After an upgrade, re-run just that step with `/raincloud-export --format vortex`; a success replaces the measurement. See [SKILLS.md](../../context/SKILLS.md#emitting-a-vortex-file-alongside-the-parquet). When in doubt, prefer Read → Grep over guessing. The pipeline has hidden contracts (streaming handlers returning `[]`, raw_downloads being unversioned, VARIANT requiring v1.5.0) that aren't obvious from any single file — see [AGENTS.md](../../context/AGENTS.md#when-youre-unsure). diff --git a/.agents/skills/raincloud-discover/SKILL.md b/.agents/skills/raincloud-discover/SKILL.md index b5f1684..f647900 100644 --- a/.agents/skills/raincloud-discover/SKILL.md +++ b/.agents/skills/raincloud-discover/SKILL.md @@ -5,25 +5,25 @@ description: Use when the user wants to find "interesting" datasets — exposes # raincloud-discover -Wraps `python -m scripts.pipeline.list_datasets` with the discoverability flags. The TUI (`python -m scripts.pipeline.browse`) is the interactive sibling. +Wraps `python -m raincloud.pipeline.list_datasets` with the discoverability flags. The TUI (`python -m raincloud.pipeline.browse`) is the interactive sibling. ## Closed vocab - **Showcase tiers** (2): `encoding`, `stress`. Run `--showcase-help` for live counts. -- **Domain tags** (12): `geospatial`, `nlp-text`, `web-analytics`, `e-commerce`, `finance`, `social`, `scientific`, `healthcare`, `sports`, `transportation`, `government`, `benchmark`. Run `--tags-help` for live counts. +- **Content-shape tags** (13): `urls`, `prose`, `enums`, `identifiers`, `code-strings`, `timestamps`, `embeddings`, `counts`, `monetary`, `measurements`, `coordinates`, `binary-payload`, `nested-json`. Run `--tags-help` for live counts. - **Size buckets** (5): `xs / s / m / l / xl` (file-size on disk). - **Trait flags** (6): `has_nested`, `has_timestamp`, `has_variant`, `string_heavy`, `wide_row`, `high_cardinality_present`. Prefix with `!` to negate. ## Patterns ```bash -python -m scripts.pipeline.list_datasets --view encoding --long -python -m scripts.pipeline.list_datasets --tag geospatial --tag scientific -python -m scripts.pipeline.list_datasets --trait has_nested --size m -python -m scripts.pipeline.list_datasets --trait '!has_nested' --vortex -python -m scripts.pipeline.list_datasets --inspect clickbench-hits -python -m scripts.pipeline.list_datasets --tags-help -python -m scripts.pipeline.list_datasets --showcase-help +python -m raincloud.pipeline.list_datasets --view encoding --long +python -m raincloud.pipeline.list_datasets --tag coordinates --tag measurements +python -m raincloud.pipeline.list_datasets --trait has_nested --size m +python -m raincloud.pipeline.list_datasets --trait '!has_nested' --vortex +python -m raincloud.pipeline.list_datasets --inspect clickbench-hits +python -m raincloud.pipeline.list_datasets --tags-help +python -m raincloud.pipeline.list_datasets --showcase-help ``` Filters AND across axes, OR within an axis. `--view` replaces other facet flags (preset is the entire facet spec). diff --git a/.agents/skills/raincloud-docs/SKILL.md b/.agents/skills/raincloud-docs/SKILL.md index 572990b..5894ab1 100644 --- a/.agents/skills/raincloud-docs/SKILL.md +++ b/.agents/skills/raincloud-docs/SKILL.md @@ -1,14 +1,14 @@ --- name: raincloud-docs -description: Regenerate the derived docs (datasets.md, handlers.md, snapshot.json). Use after a build, a manifest edit, or a handler add/remove/rename. snapshot.json is load-bearing — it's the fallback both for the TUI's columns / types modals AND for `datasets.md` regen on slugs not built locally, so partial-build maintainers don't dash-out the table. Other catalog views (columns, coverage, vortex-skip, hydrate candidates) are queryable via `/raincloud-list-datasets` and the TUI. +description: Regenerate the derived docs (datasets.md, handlers.md, snapshot.json). Use after a build, a manifest edit, or a handler add/remove/rename. snapshot.json is load-bearing — it's the fallback both for the TUI's columns / types modals AND for `datasets.md` regen on slugs not built locally, so partial-build maintainers don't dash-out the table. Other catalog views (columns, coverage, vortex-skip, hydrated datasets) are queryable via `/raincloud-list-datasets` and the TUI. argument-hint: [datasets | handlers | snapshot]... -allowed-tools: Bash(python -m scripts.pipeline.docs *) +allowed-tools: Bash(python -m raincloud.pipeline.docs), Bash(python -m raincloud.pipeline.docs *) --- Run the docs regenerator: ```bash -python -m scripts.pipeline.docs $ARGUMENTS +python -m raincloud.pipeline.docs $ARGUMENTS ``` Targets: @@ -17,15 +17,18 @@ Targets: - `handlers` — just `docs/handlers.md` (one row per registered transform handler). - `snapshot` — just `docs/snapshot.json` (per-slug schema + file sizes; read by the TUI for unbuilt-locally slugs AND by `datasets.md` regen as the row-count / size fallback). Run alongside `datasets` if you ever invoke `datasets` on its own — otherwise the markdown table will drift from the manifest. -Output lands in **`docs/*.md` / `docs/*.json`** (gitignored scratch). Promote to the tracked canonical path with a manual copy: +With the checkout catalog, output lands in **`docs/*.md` / `docs/*.json`** (gitignored scratch). The current tracked snapshot is v2; promote deliberately after inspecting the generated files: ```bash -python -m scripts.pipeline.docs && cp docs/datasets.md docs/handlers.md docs/snapshot.json docs/v1/ +python -m raincloud.pipeline.docs +cp docs/datasets.md docs/handlers.md docs/snapshot.json docs/v2/ ``` +`docs/v1/` is frozen. For installed, pinned or custom catalogs, generated observations live at `/.raincloud/observations//`; regeneration never writes into the installation or immutable bundle. Keep these observations separate from the checkout snapshot. + When to run: - After a build (row counts, file sizes, and `snapshot.json` schema for that slug change). -- After manifest edits that affect `short_name` / `license` / `description` / `expect.rows` / `convert.vortex`. +- After manifest edits that affect `short_name` / `license` / `description` / `expect.rows` / `export.formats`. - After adding, removing, or renaming a handler (`handlers.md` regenerates from the registry + manifest usage). - After any schema-affecting change to a slug's transform handler — re-run `snapshot` so the TUI's fallback view picks up the new shape. @@ -33,11 +36,11 @@ Other catalog views (no longer auto-generated as markdown): | What you want | How to get it | |---|---| -| Columns of one slug | `python -m scripts.pipeline.list_datasets --columns` | -| Cross-catalog column index | `python -m scripts.pipeline.list_datasets --columns [--column-grep PATTERN]` | -| Type coverage summary | `python -m scripts.pipeline.list_datasets --coverage` | -| Vortex-opted-out slugs + reasons | `python -m scripts.pipeline.list_datasets --no-vortex --json` | -| Hydration candidates | `python -m scripts.pipeline.list_datasets --hydrate --long` | -| Interactive browse | `python -m scripts.pipeline.browse` | +| Columns of one slug | `raincloud describe ` (from the catalog; no build needed) | +| Column index across locally built files | `python -m raincloud.pipeline.list_datasets --columns [--column-grep PATTERN]` | +| Type coverage of locally built files | `python -m raincloud.pipeline.list_datasets --coverage` | +| Slugs without Vortex + the measured reason (or policy note) | `python -m raincloud.pipeline.list_datasets --no-vortex --json` | +| Hydrated datasets | `python -m raincloud.pipeline.list_datasets --hydrate --long` | +| Interactive browse | `python -m raincloud.pipeline.browse` | Hydration policy / philosophy is hand-maintained in `HYDRATING.md`. diff --git a/.agents/skills/raincloud-export/SKILL.md b/.agents/skills/raincloud-export/SKILL.md new file mode 100644 index 0000000..9695250 --- /dev/null +++ b/.agents/skills/raincloud-export/SKILL.md @@ -0,0 +1,34 @@ +--- +name: raincloud-export +description: Re-derive a dataset's Parquet and/or Vortex files from the canonical Arrow file already on disk, without refetching or re-transforming. Use when a change touches only the export stage (row-group sizing, a codec, a Vortex upgrade) or to refresh one format. +argument-hint: ... | --all [--format parquet|vortex|parquet@rs|...] [--dry-run] [--retry-errors] +disable-model-invocation: true +allowed-tools: Bash(python -m raincloud.pipeline.export *) +--- + +Run the export-only entrypoint: + +```bash +python -m raincloud.pipeline.export $ARGUMENTS +``` + +Selection (one required): +- `...` — positional dataset slugs. +- `--all` — every dataset. Hours of work on a full store; confirm first. + +Modifiers: +- `--format FORMAT` (repeatable) — export only this format, replacing the spec's `export.formats` for this run: `parquet` or `vortex`. The writer is chosen by `export.priority` as in a build. It overrides a dataset whose policy leaves the format out, so check `python -m raincloud.pipeline.list_datasets --no-vortex --json` before forcing Vortex. +- `--format parquet@rs` (or another `@`) — use that writer for this run. The file is still `parquet/.parquet`, but its bytes and sha256 change, so it no longer matches the catalog until a maintainer regenerates it. Confirm before doing this to datasets others read. +- `--dry-run` — list what would be exported and exit. +- `--retry-errors` — attempt a format even when its writer, with this toolchain, already failed to write it at this recipe (see below). + +Behavior: +- Reads `outputs/v{n}//arrow/.arrow.zstd` and never rewrites it. A slug with no canonical is reported (`[no canonical]`) and skipped, never built; use `/raincloud-build` for it. So is a canonical this install built from an earlier recipe (fetch, parse or transform changed since), and one that is neither this install's build nor the catalog's file, whose exports could not be recorded: rebuild either (the slug is reported `[failed]`). A change that touches only the export stage needs no rebuild. +- An unknown slug exits 2 with a did-you-mean before any work; `--all` skips hydrated datasets. +- Records each file it writes in the build record (`/builds.json`), as a build does, so the loader serves the new file. +- Every export is bounded by `RAINCLOUD_EXPORT_TIMEOUT` (default 6 h; `0` disables it). When the planned writer raises, dies, reports a failed round-trip or runs out of time, the previous file comes back and the failure is recorded as the format's "unavailable" measurement (`[unavailable] /`), unless the previous file is this install's export of the same canonical, which stays. Without `--format` the run goes on and exits 0; with `--format` the request failed and it exits 1. A writer named outright (`--format vortex@rs`) that fails exits 1 and records nothing. A later successful export replaces the measurement. +- A failure already recorded is not repeated. When the measurement that applies (this install's build record at the recipe, else the catalog's) names the writer that would run -- planned, or named with `--format` -- with the same toolchain versions and the same canonical, the export prints `[skip] /: () failed at this recipe on : ; pass --retry-errors to try again` and records nothing. Without `--format` the slug still counts as exported and the summary lists the skip (exit 0); with `--format` the requested file was not produced (exit 1). A changed toolchain or another writer is attempted, with a `[retry]` line saying what changed. `--retry-errors` attempts it anyway: success replaces the measurement, a planned writer's failure records it again. + +After exporting, regenerate derived docs with `/raincloud-docs` if the catalog should record the new files. + +Context: [AGENTS.md "How a build works"](../../context/AGENTS.md#how-a-build-works). diff --git a/.agents/skills/raincloud-extract/SKILL.md b/.agents/skills/raincloud-extract/SKILL.md index b679401..01fd23c 100644 --- a/.agents/skills/raincloud-extract/SKILL.md +++ b/.agents/skills/raincloud-extract/SKILL.md @@ -1,22 +1,24 @@ --- name: raincloud-extract -description: Run only the extract stage (unpack archives into _workdir/) for the given slugs. Use when the user wants to inspect what the unpack stage produces, or debug a handler complaint about missing files. -argument-hint: ... +description: Run only the extract stage (unpack archives into the recipe's scratch directory) for the given slugs. Use when the user wants to inspect what the unpack stage produces, or debug a handler complaint about missing files. +argument-hint: ... | --all disable-model-invocation: true -allowed-tools: Bash(python -m scripts.pipeline.extract *) +allowed-tools: Bash(python -m raincloud.pipeline.extract *) --- Run the extract-only entrypoint: ```bash -python -m scripts.pipeline.extract $ARGUMENTS +python -m raincloud.pipeline.extract $ARGUMENTS ``` +Selection: positional slugs, or `--all`. An unknown slug exits 2 with a did-you-mean. + Behavior: - Implicitly invokes `fetch` first to make sure raw bytes exist. -- Unpacks archives (zip, gzip, 7z, .lzw, etc.) under `_workdir//` — gitignored scratch. -- Useful when a downstream stage complains "no .xxx files" and you want to inspect what was unpacked. Look in `_workdir//` after this runs. +- Pins one catalog and configuration for the operation, then unpacks archives under `/.recipes///`, the same namespace used by full builds. Changed recipes get separate intermediates; repeating the same recipe reuses its extraction cache. +- Useful when a downstream stage complains "no .xxx files" and you want to inspect what was unpacked. Inspect the path printed by extraction after this runs. -Wipe `_workdir//` to force re-extraction. `--clean-workdir` on `/raincloud-build` does this automatically after each successful build. +Clear only the selected scratch directory to force re-extraction. `--clean-workdir` on `/raincloud-build` clears that build's recipe generation after success. Use `/raincloud-build` instead for the full pipeline. diff --git a/.agents/skills/raincloud-fetch/SKILL.md b/.agents/skills/raincloud-fetch/SKILL.md index a36d3d3..cb914b3 100644 --- a/.agents/skills/raincloud-fetch/SKILL.md +++ b/.agents/skills/raincloud-fetch/SKILL.md @@ -1,22 +1,22 @@ --- name: raincloud-fetch description: Run only the fetch stage (download raw bytes) for the given slugs. Use when the user wants to prime the cache, debug fetch logic, or download upstream bytes without running the full pipeline. -argument-hint: ... +argument-hint: ... | --all [--verify] disable-model-invocation: true -allowed-tools: Bash(python -m scripts.pipeline.fetch *) +allowed-tools: Bash(python -m raincloud.pipeline.fetch *) --- Run the fetch-only entrypoint: ```bash -python -m scripts.pipeline.fetch $ARGUMENTS +python -m raincloud.pipeline.fetch $ARGUMENTS ``` Behavior: -- Writes to `outputs/raw_downloads//` (unversioned cache — same upstream bytes serve any `schema_version`). -- Idempotent: skips when local file matches `expected_bytes` / `expected_sha256` from the spec. Delete `outputs/raw_downloads//` to force re-fetch. +- Uses the configured unversioned raw cache. `raincloud.pipeline.spec.raw_slug_dir(slug)` selects the catalog/fetch generation under `//`; the same upstream recipe can serve multiple output schema versions. +- Idempotent: skips when the local file matches `expected_bytes` / `expected_sha256` from the spec, or the size recorded when it was fetched; `--verify` re-hashes cached files instead of trusting that size. Invalidate only upstream payloads in the selected generation to force a refetch; preserve Raincloud metadata and sibling `.recipes/` generations. - Sibling slugs sharing a URL (GloVe sizes, OSM Germany kinds) are deduped via hardlink. -- With no arg, fetches every dataset in the manifest — almost certainly not what the user wants. Confirm before invoking that way. +- Name the slugs. `--all` fetches every dataset in the manifest except hydrated ones, the whole catalog's upstream bytes, which is almost certainly not what the user wants, so confirm before invoking that way. An unknown slug exits 2 with a did-you-mean. For Kaggle entries with `requires_interactive_accept: true`, a 403 surfaces as an error pointing at the URL the user must click through in a browser (signed into Kaggle) before retrying. See [SKILLS.md "Adding a Kaggle dataset gated behind ToS acceptance"](../../context/SKILLS.md#adding-a-kaggle-dataset-gated-behind-tos-acceptance) and `/raincloud-add-kaggle-tos`. diff --git a/.agents/skills/raincloud-hydrate/SKILL.md b/.agents/skills/raincloud-hydrate/SKILL.md index ee6b4b2..756055d 100644 --- a/.agents/skills/raincloud-hydrate/SKILL.md +++ b/.agents/skills/raincloud-hydrate/SKILL.md @@ -1,62 +1,62 @@ --- name: raincloud-hydrate -description: Run the optional hydrate stage to dereference a slug's URL column into a sibling parquet under outputs/v{n}//parquet-hydrated/. Use ONLY for slugs that opted in via the manifest's `hydrate` block (see /raincloud-list-datasets --hydrate). Strong safety filter is on by default; bypass requires two flags. Makes outbound HTTP requests to arbitrary URLs from the open web. -argument-hint: [...] [--all] [--limit N] [--block FILE] [--urlhaus] [--concurrency N] [--timeout SEC] [--max-bytes N] +description: Build a hydrated dataset (-hydrated) — the parent's rows with URL columns fetched from the open web — with the safe defaults, or write a scratch sample with non-default options (--limit/--block/--urlhaus/--max-bytes/--timeout/bypass) that is never published or served. Use ONLY for datasets the manifest declares as hydrated (see /raincloud-list-datasets --hydrate). Strong safety filter is on by default; bypass requires two flags. Makes outbound HTTP requests to arbitrary URLs from the open web. +argument-hint: [-hydrated | ...] [--all] [--limit N] [--block FILE] [--urlhaus] [--concurrency N] [--timeout SEC] [--max-bytes N] disable-model-invocation: true -allowed-tools: Bash(python -m scripts.pipeline.hydrate *) +allowed-tools: Bash(python -m raincloud.pipeline.hydrate *) --- -Run the URL hydration stage: +Build hydrated datasets (`raincloud build -hydrated` does the same with the safe defaults): ```bash -python -m scripts.pipeline.hydrate $ARGUMENTS +python -m raincloud.pipeline.hydrate $ARGUMENTS ``` ## Selection -- `...` — specific slugs (must each have `hydrate` set in the manifest). -- `--all` — every slug with `hydrate` set. +- `-hydrated...` — specific hydrated datasets. A bare `` is accepted too and selects its `-hydrated` entry, when the parent is not itself hydrated and that entry exists. Any other dataset that is not hydrated is refused (exit 2, `not a hydrated dataset`); an unknown name exits 2 with a did-you-mean. +- `--all` — every hydrated dataset. -Currently marked candidates: `laion-400m`, `goodbooks-10k`, `hacker-news`. Use `python -m scripts.pipeline.list_datasets --hydrate --long` to see the live list. +Currently declared: `laion-400m-hydrated`, `goodbooks-10k-hydrated`, `hacker-news-hydrated`. Use `python -m raincloud.pipeline.list_datasets --hydrate --long` to see the live list. + +Options that change what is fetched make the run a **sample**: `--limit`, `--block`, `--urlhaus`, a non-default `--max-bytes` or `--timeout`, or the bypass. [`HYDRATING.md`](../../../HYDRATING.md) states the rule in full: a sample's table goes to `//sample/.arrow.zstd` and is never published, recorded or served. Only a run with the safe defaults (`raincloud build -hydrated`, or `hydrate` without those options) produces the dataset. Spell the flags out in full; abbreviations are refused. ## Safety filter -Always on by default. Layered, all opt-out: +On by default. Layers 1 and 2 are applied unless the two-flag bypass below is active; 3 and 4 are opt-in, and a run that uses them is a sample: -1. **Scheme allowlist** (always on, even with `--unsafe-allow-all-domains`-without-bypass). `http` / `https` only. Refuses `file://`, `data:`, `javascript:`, `.onion`, etc. -2. **Per-slug `hydrate.blocked_hosts_extra`** — the manifest author's pre-banned hosts for the slug. Always applied. +1. **Scheme allowlist** — `http` / `https` only. Refuses `file://`, `data:`, `javascript:`, `.onion`, etc. +2. **Per-dataset `derive.hydrate.blocked_hosts_extra`** — the manifest author's pre-banned hosts. 3. **Per-run `--block FILE`** — additional hostnames you supply (one per line; `/etc/hosts`-style `IP host` lines accepted; `#`-comments stripped). Repeatable. 4. **`--urlhaus`** — fetch [abuse.ch URLhaus](https://urlhaus.abuse.ch/) hostfile at run start, cache 24h. -Raincloud ships the **mechanism**, not the **policy** — no static "unsafe" list is bundled. Suggested upstream filter sources to plug into `--block`: [StevenBlack/hosts](https://github.com/StevenBlack/hosts), your corporate DNS list, IWF feeds (members only). Or run hydration behind a DNS-filtered network (CleanBrowsing, Quad9, Cloudflare 1.1.1.2). +Raincloud ships the **mechanism**, not the **policy** — no static "unsafe" list is bundled. Because `--block` and `--urlhaus` make a sample, they only preview a filtered run. Hosts that must be kept out of the published dataset go in the manifest's `derive.hydrate.blocked_hosts_extra`, or run hydration behind a DNS-filtered network (CleanBrowsing, Quad9, Cloudflare 1.1.1.2). Sources worth previewing with `--block`: [StevenBlack/hosts](https://github.com/StevenBlack/hosts), your corporate DNS list, IWF feeds (members only). ## Bypass Requires both flags — single-flag accident is impossible: ```bash -python -m scripts.pipeline.hydrate --unsafe-allow-all-domains --i-accept-the-risk +python -m raincloud.pipeline.hydrate -hydrated --unsafe-allow-all-domains --i-accept-the-risk ``` -The bypass is intended for narrow research use against URL columns you have separately verified. **Do not** suggest it as a default. A multi-line warning prints regardless of acceptance. +The bypass disables **every** layer, the scheme allowlist and `blocked_hosts_extra` included, and makes the run a sample. Its fetched rows record `filter_decision = "allowed"`, like any fetch. It is intended for narrow research use against URL columns you have separately verified. **Do not** suggest it as a default. A multi-line warning prints regardless of acceptance. ## Tuning -- `--concurrency N` — parallel HTTP workers (default 8). Raise carefully on bulk crawls; many origins rate-limit aggressively. -- `--timeout SEC` — per-request timeout (default 30). -- `--max-bytes N` — per-row payload cap (default 10 MB). Truncated rows record `error="truncated"` in provenance. -- `--limit N` — only hydrate the first N rows. Recommended for first-time runs against a slug to characterize the failure modes before going wide. +- `--concurrency N` — parallel HTTP workers (default 8). Raise carefully on bulk crawls; many origins rate-limit aggressively. It changes only how fast the same requests are made, so it never makes a sample. +- `--timeout SEC` — per-request timeout (default 30). A non-default value makes the run a sample, since it changes which fetches fail. +- `--max-bytes N` — per-row payload cap (default 10 MB). Truncated rows record `error="truncated"` in provenance. A non-default value makes the run a sample. +- `--limit N` — only hydrate the first N rows; always a sample. Recommended for first-time runs to characterize the failure modes before going wide. ## Output -Sibling parquet at `outputs/v{n}//parquet-hydrated/.parquet`. Adds two columns to whatever was in the base: - -- `` — dereferenced bytes (`output_type: binary`) or string (`output_type: string`); null when the URL was filtered out or fetch failed. -- `_hydrate_provenance: struct` — every row carries an honest record of why bytes are or aren't there. (`sha256` is always 32 bytes by construction but stored as `binary` rather than `fixed_size_binary[32]` because vortex 0.69 doesn't accept FSB types yet.) +For a run with the safe defaults, an ordinary dataset — canonical Arrow plus the default Parquet/Vortex exports under `outputs/v{n}/-hydrated/` — with the parent's columns plus, for each hydrated column: -When the slug has `convert.vortex: true`, the stage **auto-runs** vortex conversion on the hydrated parquet, writing `outputs/v{n}//vortex-hydrated/.vortex`. Same opt-in flag as the base parquet — no separate manifest field. Failures during convert are logged but don't roll back the hydrated parquet. +- `` — fetched bytes (`type: binary`) or text (`type: string`); null when the URL was filtered out or the fetch failed. +- `__provenance: struct` — an honest record of why bytes are or aren't there. `filter_decision` is `allowed`, `blocked_scheme`, `blocked_by_host` (the dataset's `blocked_hosts_extra`, `--block` and `--urlhaus` hosts alike) or `fetch_error`. -The hydrated parquet is a **separate, deliberately sketchy artefact tier**: no file-size guarantees, no reproducibility guarantees (URLs die, content drifts), no completeness guarantees. Treat it as research convenience, not a redistributable corpus. +The parent must be prepared first. Loading the result emits `HydratedDatasetWarning`: no file-size, reproducibility or completeness guarantees. Treat it as research convenience, not a redistributable corpus. ## When to suggest this @@ -65,10 +65,10 @@ The hydrated parquet is a **separate, deliberately sketchy artefact tier**: no f ## When NOT to suggest this -- The slug has no `hydrate` block (will raise / be skipped). -- The user is just trying to read the base parquet (nothing to hydrate). +- The dataset isn't declared hydrated (it is refused, exit 2). +- The user just wants the parent dataset (nothing to hydrate). - The user is on a build machine without network egress to arbitrary internet hosts. -After this runs, also suggest `/raincloud-docs hydrated` to refresh the centralized list (purely cosmetic — the doc generates from the manifest, not from runs). +After a build, regenerate observations with `/raincloud-docs`. List hydrated datasets with `/raincloud-list-datasets --hydrate --long`. -See [`HYDRATING.md`](../../../HYDRATING.md) for the policy / philosophy and per-slug advisories. +See [`HYDRATING.md`](../../../HYDRATING.md) for the policy / philosophy. diff --git a/.agents/skills/raincloud-large-build/SKILL.md b/.agents/skills/raincloud-large-build/SKILL.md index 5ac4623..63266fb 100644 --- a/.agents/skills/raincloud-large-build/SKILL.md +++ b/.agents/skills/raincloud-large-build/SKILL.md @@ -1,27 +1,30 @@ --- name: raincloud-large-build description: Run a memory- or runtime-heavy build safely with memory caps, scratch redirection, nohup, and progress logging. Use for multi-hour or multi-GB builds (JSONBench 100M, Wikipedia Structured Contents, OSM Germany, Public BI batches). -argument-hint: ... [--all] [--loose] [--clean-workdir] +argument-hint: ... [--all] [--strict] [--clean-workdir] [--retry-errors] disable-model-invocation: true --- Run a memory- or runtime-heavy build with the safety knobs enabled. Reference: [SKILLS.md "Running a large build safely"](../../context/SKILLS.md#running-a-large-build-safely). -**Confirm with the user before triggering.** Observed timings: JSONBench 100M ≈ 6 h, Wikipedia Structured Contents → 34 GB parquet (multi-hour), OSM Germany ≈ 45 min per kind. Rebuilding wipes and redoes the existing `outputs/v1//.parquet`+`.vortex` pair on disk. +**Confirm with the user before triggering.** Observed timings: JSONBench 100M ≈ 6 h, Wikipedia Structured Contents → ~70 GB parquet (multi-hour), OSM Germany ≈ 45 min per kind. Rebuilding wipes and redoes the existing version-scoped canonical Arrow and configured export artifacts on disk. -Pattern (adjust the slug, memory cap, and tempdir to the user's machine): +Pattern (adjust the slug, memory cap, tempdir and log directory to the user's machine). The log goes to a durable directory, never `/tmp`: on many machines `/tmp` is tmpfs, and a reboot during a multi-hour run would delete the only record of a failure. `raincloud config show` reports the data directory; a `logs/` directory beside it is a good default. Not beside the scratch root: outside a checkout that is the user cache, which is disposable. ```bash +LOG_DIR=/path/to/durable/logs +mkdir -p "$LOG_DIR" RAINCLOUD_DUCKDB_MEMORY_LIMIT=32GB \ RAINCLOUD_DUCKDB_TEMP_DIRECTORY=/mnt/scratch/duckdb-tmp \ PYTHONUNBUFFERED=1 \ - nohup python -m scripts.pipeline.build $ARGUMENTS \ - > /tmp/raincloud-build.log 2>&1 & + nohup python -m raincloud.pipeline.build $ARGUMENTS \ + > "$LOG_DIR/build-$(date +%s).log" 2>&1 & ``` Flag rationale: -- `--loose` — first build of a new slug, before `expect.rows` is known. Downgrades row-count mismatches from errors to warnings. -- `--clean-workdir` — wipe `_workdir//` after each successful build. Essential for large batch runs (Public BI decompressed CSVs can hit ~100 GB). +- `--strict` — make validation drift an error. Without it, row-count mismatches are warnings, suitable for first builds with estimated counts. +- `--clean-workdir` — clear the selected `.recipes///` scratch directory after each successful build. Essential for large batch runs (Public BI decompressed CSVs can hit ~100 GB). +- `--retry-errors` — attempt a format whose writer, with this toolchain, already failed at this recipe; skipped (`[skip]`) otherwise. Only when the user asks: a writer that hung last time costs `RAINCLOUD_EXPORT_TIMEOUT` again. - `RAINCLOUD_DUCKDB_MEMORY_LIMIT` — caps DuckDB's working set; default (~80% of system RAM) can swap-thrash on heavily-nested VARIANT shredding. 96 GB is the tested ceiling for Open Food Facts. - `RAINCLOUD_DUCKDB_TEMP_DIRECTORY` — point at a large volume; the system tempdir often runs out on big builds. - `PYTHONUNBUFFERED=1` — log file flushes line-by-line so progress is inspectable mid-run. @@ -30,8 +33,9 @@ Flag rationale: Monitor: ```bash -tail -f /tmp/raincloud-build.log -du -sh _workdir// # scratch growth +LOG_DIR=/path/to/durable/logs # the same directory; a new shell does not inherit it +tail -f "$LOG_DIR"/build-*.log +du -sh /.recipes/// # selected build scratch df -h . # disk headroom ``` diff --git a/.agents/skills/raincloud-list-datasets/SKILL.md b/.agents/skills/raincloud-list-datasets/SKILL.md index c09acab..6ea8a26 100644 --- a/.agents/skills/raincloud-list-datasets/SKILL.md +++ b/.agents/skills/raincloud-list-datasets/SKILL.md @@ -1,17 +1,17 @@ --- name: raincloud-list-datasets -description: Filter and list datasets from sources.json without grepping a 545 KB JSON file. Use when the user asks "which slugs use handler X", "show me all UCI datasets", "what's gated behind Kaggle ToS", or any other catalog-shape question that's faster than reading docs/v1/datasets.md end to end. +description: Filter and list datasets from sources.json without grepping the manifest JSON. Use when the user asks "which slugs use handler X", "show me all UCI datasets", "what's gated behind Kaggle ToS", or any other catalog-shape question that's faster than reading docs/v2/datasets.md end to end. argument-hint: [--handler ] [--license ] [--fetch-type ] [--reader ] [--vortex|--no-vortex] [--kaggle-tos] [--grep ] [--long|--json|--count] -allowed-tools: Bash(python -m scripts.pipeline.list_datasets *) +allowed-tools: Bash(python -m raincloud.pipeline.list_datasets *) --- Run the catalog-query CLI: ```bash -python -m scripts.pipeline.list_datasets $ARGUMENTS +python -m raincloud.pipeline.list_datasets $ARGUMENTS ``` -Read-only — never touches `outputs/` or `_workdir/`. Sub-second on the full manifest. +Read-only — never writes anything. Fast on the full manifest. `--columns` / `--coverage` read locally built files; everything else answers from the catalog. Filters (compose with AND): @@ -19,38 +19,39 @@ Filters (compose with AND): |---|---| | `--handler ` | `transform.handler` exact match (e.g. `tighten_types`, `glove_split`, `uci_default`) | | `--license ` | `license.spdx` exact match (e.g. `CC0-1.0`, `Apache-2.0`) | -| `--fetch-type ` | `fetch.type` ∈ `http`, `kaggle`, `huggingface`, `custom` | +| `--fetch-type ` | `fetch.type` ∈ `generated`, `http`, `huggingface`, `custom`, `kaggle`, or `derived` for a dataset built from a parent (a hydrated dataset) | | `--reader ` | `parse.reader` ∈ `csv`, `parquet`, `jsonl`, `xml`, `pbf`, `custom` | -| `--vortex` / `--no-vortex` | `convert.vortex` is true / false (mutually exclusive) | -| `--kaggle-tos` | only Kaggle specs gated behind a one-time click-through | +| `--vortex` / `--no-vortex` | The catalog has Vortex for the dataset / it has none: a build measured the writer unable to produce it (`--json`: `vortex_unavailable`), or `export.formats` leaves it out (mutually exclusive) | +| `--kaggle-tos` | only specs gated behind a one-time click-through (`fetch.requires_interactive_accept`, Kaggle or Hugging Face) | +| `--local` | only datasets with a file prepared on this machine's disk | | `--grep ` | regex over slug + short_name + full_name + description (case-insensitive) | -Output modes (default = one slug per line): +Output modes (default = one bare slug per line; on a terminal, hydrated datasets are marked `[hydrated]`): -- `--long` — wide table with slug, handler, fetch type, reader, license, row count, vortex flag. +- `--long` — wide table with slug, handler, fetch type, reader, license, row count, vortex, scrape and hydrated flags, `recorded` (what the tracked catalog records) and `local` (formats prepared on this install's disk). - `--json` — one JSON object per matching dataset (pipe into `jq` for further filtering). - `--count` — just the count of matches. Common shapes: ```bash -# every Kaggle dataset gated behind ToS acceptance -python -m scripts.pipeline.list_datasets --fetch-type kaggle --kaggle-tos +# every dataset gated behind a one-time ToS click-through +python -m raincloud.pipeline.list_datasets --kaggle-tos # every spec using the streaming wikipedia handler -python -m scripts.pipeline.list_datasets --handler wikipedia_variant_parse --long +python -m raincloud.pipeline.list_datasets --handler wikipedia_variant_parse --long # count of CSV-reader specs that opt into Vortex -python -m scripts.pipeline.list_datasets --reader csv --vortex --count +python -m raincloud.pipeline.list_datasets --reader csv --vortex --count # slugs whose description mentions geometry or geo -python -m scripts.pipeline.list_datasets --grep '\bgeo' --long +python -m raincloud.pipeline.list_datasets --grep '\bgeo' --long ``` Pair with `/raincloud-status ` to check filesystem state of any returned slug, and `/raincloud-validate-manifest` after editing the manifest based on findings. -Context: [SKILLS.md](../../context/SKILLS.md), [sources.schema.md](../../context/sources.schema.md), [`docs/v1/datasets.md`](../../../docs/v1/datasets.md) for full-row metadata. +Context: [SKILLS.md](../../context/SKILLS.md), [sources.schema.md](../../context/sources.schema.md), [`docs/v2/datasets.md`](../../../docs/v2/datasets.md) for full-row metadata. -## New discovery axes (0.1.4) +## Discovery axes `--showcase`, `--tag`, `--size`, `--trait`, `--view`, `--inspect`, `--tags-help`, `--showcase-help`. See the `raincloud-discover` skill for the full vocabulary and patterns. diff --git a/.agents/skills/raincloud-load/SKILL.md b/.agents/skills/raincloud-load/SKILL.md index 61bec29..54491c0 100644 --- a/.agents/skills/raincloud-load/SKILL.md +++ b/.agents/skills/raincloud-load/SKILL.md @@ -1,73 +1,93 @@ --- name: raincloud-load -description: Load a Raincloud dataset via the lightweight Python loader API (`raincloud.load(slug)`). Use when the user wants to read a prepared parquet/vortex artifact, inspect a slug's metadata, or pull a dataset for downstream analysis from cache → mirror → local build. -argument-hint: [--format vortex|parquet] [--materialize to_arrow|scan|to_pandas] +description: Read prepared Raincloud artifacts, inspect catalog metadata, or load batches from local storage or a configured mirror. +argument-hint: [--format auto|arrow|parquet|vortex] disable-model-invocation: true -allowed-tools: Bash(python -c *), Bash(python -m raincloud *), Bash(python examples/use_loader.py *) +allowed-tools: Bash(python -m raincloud describe *), Bash(python -m raincloud list *), Bash(python -m raincloud load *), Bash(python -m raincloud config show), Bash(python -m raincloud capabilities), Bash(python examples/use_loader.py *) --- -The Raincloud loader is a separate, lightweight Python package (`raincloud`) for reading **already-prepared** artifacts. Resolution order is `local cache → mirror → local build`; nothing is fetched until you call an accessor. +Use the lightweight Python loader for prepared data. Resolution is local data/cache +then mirror. Reads never build unless explicitly requested with `build=True` or +`raincloud load --build`. Never add `--build` (or `build=True`) yourself: a +build can run for hours, so it needs the user's go-ahead as described in AGENTS.md, +even though this skill's allowed commands would match it. -## Most common shape +For the dataset the user named (`$ARGUMENTS`), start with the commands: ```bash -python -c " -import raincloud -ds = raincloud.load('$ARGUMENTS') # default format='vortex' with parquet fallback -print('rows :', ds.num_rows) -print('cols :', ds.column_names[:5]) -print('source :', ds.info.get('source_url')) -print('path :', ds.path()) # triggers cache/mirror/build resolution -" +python -m raincloud describe $ARGUMENTS # catalog metadata: rows, columns, formats, license +python -m raincloud load $ARGUMENTS # resolve the file and print its path ``` -## Materialization - -| Accessor | Returns | Notes | -|---|---|---| -| `ds.path()` | `pathlib.Path` to the on-disk artifact | First call resolves; subsequent calls are cache hits. | -| `ds.to_arrow()` | `pyarrow.Table` | Materializes the whole table; expensive on multi-GB slugs. | -| `ds.to_vortex()` | `vortex.VortexFile` (lazy) | Vortex-native handle. | -| `ds.scan()` | `duckdb.DuckDBPyRelation` | Requires `raincloud[duckdb]`. Always reads the parquet sibling — if the slug was loaded as vortex, you'll see a `[raincloud]` stderr note before the parquet is resolved. | -| `ds.to_pandas()` | `pandas.DataFrame` | Requires `raincloud[pandas]`. | -| `ds.schema` | `pyarrow.Schema` | Footer-only read for parquet; opens the file for vortex. | - -## Config via env vars - -| Env var | Effect | -|---|---| -| `RAINCLOUD_CACHE` | Local artifact cache dir (default `~/.cache/raincloud`). | -| `RAINCLOUD_MIRROR` | Mirror URL (`s3://…`, `https://…`, `file://…`). Tried before the local build. | -| `RAINCLOUD_OFFLINE=1` | Block mirror + build; raise `OfflineMiss` on cache miss. | -| `RAINCLOUD_SNAPSHOT` | Override `docs/v1/snapshot.json` (catalog). | -| `RAINCLOUD_MANIFEST` | Override `sources.json`. | - -## Drift semantics - -When a slug has a `sha256` pinned in the snapshot and the mirror or local build produces bytes that disagree, the loader prints a `[raincloud] WARN: from sha256 drifted ...` to stderr and adopts the new bytes anyway. Upstream content drifts; that's not a panic case. Catch + escalate via `raincloud.ChecksumMismatch` only if you want a hard gate (e.g. `_cache.adopt(..., strict=True)` — used by `python -m scripts.pipeline.publish`). +From Python: -## Errors (all subclass `raincloud.RaincloudError`) - -`UnknownSlug`, `FormatUnavailable`, `ArtifactNotFound`, `OfflineMiss`, `BuildToolingMissing`, `MissingDependency`, `ChecksumMismatch`. - -## Worked example +```python +import raincloud -```bash -python examples/use_loader.py --slug $ARGUMENTS # metadata only -python examples/use_loader.py --slug $ARGUMENTS --materialize # full path +ds = raincloud.load("SLUG") # lazy; auto selects an available reader +print(ds.num_rows, ds.column_names, ds.catalog_revision, ds.artifacts) +with ds.batches(batch_size=65536) as batches: + for batch in batches: + print(batch.num_rows) # each is a PyArrow RecordBatch ``` -[`examples/use_loader.py`](../../../examples/use_loader.py) walks the full API end-to-end against the packaged catalog with no network. +Metadata does not fetch artifact bytes. `.path()`, `.schema`, and `.batches()` +resolve the artifact as needed. `.to_arrow()` materializes the whole table. +`.to_pandas()` requires `[pandas]`. `.dataset()` is a lazy pyarrow Dataset of the +selected format for any engine (DuckDB, Polars, pyarrow). `.to_vortex()` requires +`[vortex]` and a Vortex artifact. `.path()`, `.batches()`, `.to_arrow()` and +`.dataset()` retain the selected artifact; `.to_vortex()` resolves the dataset's +Vortex file. Each format is one file; `describe` shows which writer made it. + +Use `raincloud capabilities` for installed reader modules and `raincloud config +show` for effective paths. Optional TOML settings and environment overrides share +one resolution policy across the CLI, Python API, and native clients: -## Install tiers +| Override | Meaning | +|---|---| +| `RAINCLOUD_OUTPUTS` | Durable artifact root; may be an existing outputs directory on another disk | +| `RAINCLOUD_CACHE` | Optional extra download cache; defaults to the durable root | +| `RAINCLOUD_MIRROR` | Private artifact source: local/file, HTTP(S), or optional fsspec transport | +| `RAINCLOUD_OFFLINE=1` | Read only local data/cache; missing files raise `OfflineMiss` | +| `RAINCLOUD_CATALOG_DIR` | Installed immutable catalog revisions | +| `RAINCLOUD_MANIFEST` / `RAINCLOUD_SNAPSHOT` | Explicit matched local catalog files | + +`raincloud catalog update`, `pin`, and `rollback` are explicit operations; ordinary +reads never refresh the catalog. Prefer a matched bundle over unrelated loose +manifest/snapshot files. The catalog is the authority: mirror bytes that do not +match its sha256 are refused. A local file of another size is served only when +this install's build record (`/builds.json`) names it at that size under +the dataset's current recipe; the loader says so when the record came from an +earlier recipe. + +Install from the Git repository (pin a reviewed revision with `@`) or a +local wheel: ```bash -pip install raincloud # lightweight loader -pip install 'raincloud[duckdb]' # adds .scan() -pip install 'raincloud[pandas]' # adds .to_pandas() -pip install 'raincloud[s3]' # s3:// mirror transport -pip install 'raincloud[http]' # https:// mirror transport -pip install 'raincloud[build]' # adds local-build fallback (heavyweight) +pip install "raincloud @ git+https://github.com/spiraldb/raincloud" +# Optional extras on that same source: [vortex], [pandas], [s3], [http]. +# [build] includes the builder and Vortex; it does not enable automatic builds. ``` -Context: [AGENTS.md "The loader package"](../../../AGENTS.md), [`examples/use_loader.py`](../../../examples/use_loader.py). +The base install reads IPC and Parquet. Vortex 0.86.1 publishes Linux, macOS, and +Windows wheels; local Vortex execution and the native clients' source builds are +verified on Linux x86-64 only. + +Reads raise subclasses of `raincloud.RaincloudError` (all in `raincloud.exceptions`): +`UnknownSlug` (with `suggestions`), `UnknownColumn`, `FormatUnavailable` (its +`measurement` is set when a build measured the format's writer unable to produce it at +this recipe; the message quotes it, and `auto` skips that format; a requested build skips +a failure recorded for the same writer and toolchain, and raises it again, unless +`retry_errors=True` / `--retry-errors`, which implies a build), +`ArtifactNotFound` (not prepared locally or in the mirror), `OfflineMiss`, +`MirrorUnavailable` (the mirror could not be read at all), `ChecksumMismatch`, +`CorruptArtifact` (the file is present but cannot be decoded; re-fetch or rebuild), +`UnsupportedType` (the reader cannot represent a type; ask for another format), +`MissingDependency`, `CatalogError` / `MissingRevision`, and with a build requested +`BuildToolingMissing` / `BuildFailed`. Preserve these distinctions when reporting a +failure. + +See [AGENTS.md](../../../AGENTS.md), [configuration and catalogs](../../../README.md), +and [native clients](../../../clients/README.md). The +[loader example](../../../examples/use_loader.py) defaults to metadata only; +`--materialize` resolves files and may contact the configured mirror. diff --git a/.agents/skills/raincloud-profile/SKILL.md b/.agents/skills/raincloud-profile/SKILL.md index fa0b570..37efe74 100644 --- a/.agents/skills/raincloud-profile/SKILL.md +++ b/.agents/skills/raincloud-profile/SKILL.md @@ -1,11 +1,11 @@ --- name: raincloud-profile -description: Use when the user asks to compute or refresh per-column statistics for a raincloud dataset — produces `outputs/v1//profile.json` for the TUI's detail pane and `list_datasets --inspect`. +description: Use when the user asks to compute or refresh per-column statistics for a raincloud dataset — produces `outputs/v{n}//profile.json` for the TUI's detail pane and `list_datasets --inspect`. --- # raincloud-profile -Wraps `python -m scripts.pipeline.profile`. Opt-in stage; off the default +Wraps `python -m raincloud.pipeline.profile`. Opt-in stage; off the default build path. Idempotent against parquet sha256. ## When to invoke @@ -17,9 +17,9 @@ build path. Idempotent against parquet sha256. ## Patterns ```bash -python -m scripts.pipeline.profile # one -python -m scripts.pipeline.profile --all # every built parquet -python -m scripts.pipeline.profile --sample-rows 1000000 # cap for huge slugs +python -m raincloud.pipeline.profile # one +python -m raincloud.pipeline.profile --all # every built parquet +python -m raincloud.pipeline.profile --sample-rows 1000000 # cap for huge slugs ``` Per-dtype stats: @@ -30,17 +30,11 @@ Per-dtype stats: - **List/Map**: length min/max/mean - **Struct / variant**: skipped (emits null at column-map level) -Profiles live at `outputs/v1//profile.json` and are read by: -- The TUI's right-pane Columns section (`python -m scripts.pipeline.browse`) +Profiles live at `outputs/v{n}//profile.json` and are read by: +- The TUI's right-pane Columns section (`python -m raincloud.pipeline.browse`) - The CLI's `--inspect ` rendering - `docs.py` for backfilling `shape_traits.high_cardinality_present` into `snapshot.json` -The tracked mirror at `docs/v1/profiles/.json` is the fallback path that -fresh clones ship — both `list_datasets --inspect` and the TUI's Columns pane -read it when no built `outputs/v1//profile.json` exists locally. The -`profile` stage auto-runs `python -m scripts.pipeline.promote_profiles` at the -end of a successful run (copies built profile.json into the tracked mirror, -byte-identical mirror skipped), so the tracked snapshot stays in sync without -a manual step. Pass `--no-promote` to suppress that auto-step while iterating; -invoke `promote_profiles` explicitly (or with `--check`) to re-sync or audit -the mirror after manual edits. +For the checkout catalog, promotion mirrors profiles into `docs/v{n}/profiles/`; the current version is v2. Installed, pinned and custom catalogs use `/.raincloud/observations//profiles/` instead. Profiles from unrelated catalogs must not be used as fallbacks. A checkout falls back to the frozen `docs/v1/profiles/` for a slug with no v2 profile. That fallback is removed once `docs/v2/profiles/` covers the catalog: `tests/test_docs_contracts.py::test_v1_profile_fallback_is_still_needed` fails then, naming the code to delete. The overnight runner pins its catalog for the entire run, so its parent and subprocesses use revision-local observations even when launched from a checkout. + +The profile command promotes after a successful run. Pass `--no-promote` to suppress that step; use `python -m raincloud.pipeline.promote_profiles --check` to audit the selected profile destination. diff --git a/.agents/skills/raincloud-promote-variant/SKILL.md b/.agents/skills/raincloud-promote-variant/SKILL.md index 884d006..5557071 100644 --- a/.agents/skills/raincloud-promote-variant/SKILL.md +++ b/.agents/skills/raincloud-promote-variant/SKILL.md @@ -1,21 +1,19 @@ --- name: raincloud-promote-variant -description: Pick the right path (in-place tightening vs new-build streaming handler) for promoting a JSON column to VARIANT. Use when the user wants to upgrade a JSON-annotated string column to VARIANT and isn't sure whether to rewrite an existing parquet or change the build path. +description: Promote a JSON column to VARIANT by changing the transform recipe and rebuilding. Use when the user wants to upgrade a JSON-annotated string column to VARIANT. argument-hint: [...] --- -Pick the right VARIANT-promotion path. Reference: [SKILLS.md "Promoting a JSON column to VARIANT"](../../context/SKILLS.md#promoting-a-json-column-to-variant). +Promote a JSON column to VARIANT. Reference: [SKILLS.md "Promoting a JSON column to VARIANT"](../../context/SKILLS.md#promoting-a-json-column-to-variant). -**If the parquet already exists** (in-place tightening): use `/raincloud-tighten-variant`. -- Idempotent — parquets already lacking JSON-annotated columns are skipped. -- For heavily-nested payloads (e.g. Open Food Facts), set `RAINCLOUD_DUCKDB_MEMORY_LIMIT=96GB` (tested ceiling). -- Add `--chunked` if a single-shot cast spills/OOMs. - -**If you're writing a new dataset and want VARIANT from the start**: use `/raincloud-add-handler` to create a streaming handler that uses DuckDB's `CAST(to_json(col) AS VARIANT)` inside the `COPY ... TO PARQUET` statement. +Update the transform recipe and rebuild. Use `/raincloud-add-handler`: build VARIANT in DuckDB, bridge through `duckdb_variant.to_canonical_arrow` or `stream_canonical_arrow`, then write canonical Arrow. Exporters derive sibling formats from that spine; there is no in-place pass over existing files. +- Cast parsed JSON, `CAST(CAST(col AS JSON) AS VARIANT)`; a bare text-to-VARIANT cast stores the JSON as one string. +- `to_canonical_arrow` projects each VARIANT column through `variant_to_parquet_variant(...)` itself; with `stream_canonical_arrow`, the SQL must do that projection (see `jsonbench_variant_parse`). +- Both bridges stamp through `variant.attach_variant[_schema]`, which declares the storage struct's `metadata` (and an unshredded `value`) non-nullable, as the Parquet VARIANT spec requires, and fails on a present VARIANT missing either. Never set the `VARIANT_EXT` marker by hand. - Simplest 1-column example: `factbook_variant_parse`. - Multi-column with typed siblings: `wikipedia_variant_parse`. -- VARIANT requires a persistent DuckDB DB opened at `storage_compatibility_version=v1.5.0` — `duckdb_connect(db_path)` applies this automatically. **Never** call `duckdb.connect(...)` directly. +- VARIANT requires a persistent DuckDB DB opened at `storage_compatibility_version=v1.5.0` — `raincloud.duckdb_connect(db_path)` applies this automatically. **Never** call `duckdb.connect(...)` directly. -After promoting, regenerate docs via `/raincloud-docs columns_parquet coverage_parquet`. +After promoting, regenerate docs via `python -m raincloud.pipeline.docs`. Caveat for vortex sibling files: VARIANT columns surface as their shredded struct on the round-trip (the VARIANT logical annotation isn't preserved) — this can blow up the `.vortex` size relative to the parquet on heavily-nested datasets. diff --git a/.agents/skills/raincloud-publish/SKILL.md b/.agents/skills/raincloud-publish/SKILL.md index 0f3afd5..2e7f132 100644 --- a/.agents/skills/raincloud-publish/SKILL.md +++ b/.agents/skills/raincloud-publish/SKILL.md @@ -1,56 +1,57 @@ --- name: raincloud-publish -description: Push locally-built Raincloud artifacts to a mirror (`scripts.pipeline.publish`). Use when the maintainer wants to upload one or more slugs' parquet/vortex bytes to a configured mirror after a successful build, gated on the snapshot's recorded sha256. -argument-hint: ... | --all --mirror [--dry-run] +description: Release locally built Raincloud artifacts (`raincloud.pipeline.publish`) — into this machine's shared store with a catalog release (`--store DIR --catalogs DIR`), or to an off-machine mirror (`--mirror URL`). Use when the maintainer wants built parquet/vortex bytes served to other users, gated on the snapshot's recorded sha256. +argument-hint: ... | --all (--store DIR [--catalogs DIR] | --mirror ) [--dry-run] [--allow-scrape-advisory] [--allow-no-redistribution] disable-model-invocation: true -allowed-tools: Bash(python -m scripts.pipeline.publish *) +allowed-tools: Bash(python -m raincloud.pipeline.publish *) --- -Sync locally-built artifacts to a mirror so downstream `raincloud.load()` users can fetch them. The CLI verifies each artifact's sha256 against `docs/v1/snapshot.json` before upload — mismatches block the push (publish is the one place an integrity gate is correct: corrupted bytes should never reach a shared mirror). - -## Most common shape +Place or upload locally built artifacts so other users' `raincloud.load()` finds them. The CLI verifies each artifact's sha256 against the selected catalog's snapshot first; a mismatch blocks it (bytes the catalog does not record must never reach a shared store or mirror). An artifact whose snapshot entry records no sha256 is published ungated. ```bash -python -m scripts.pipeline.publish $ARGUMENTS +python -m raincloud.pipeline.publish $ARGUMENTS ``` Selection (one required): -- `...` — positional dataset slugs (any number). -- `--all` — every slug whose parquet OR vortex artifact exists locally under `outputs/v{n}//`. +- `...` — positional dataset slugs (any number). An unknown slug exits 2 with a did-you-mean before any work; a named slug with nothing built here is refused (exit 1). +- `--all` — every slug in the manifest; slugs with nothing built locally are skipped. -Required: -- `--mirror ` — destination root. Examples: - - `s3://my-bucket/raincloud` (needs `pip install raincloud[s3]`) - - `https://artifacts.example.com/raincloud` (needs `raincloud[http]`) - - `file:///mnt/shared/raincloud-mirror` (built-in) -- `RAINCLOUD_MIRROR=` env var works as an alternative to the flag. +Target (exactly one required): +- `--store DIR` — this machine's shared content store, e.g. the `data_dir` an operator configured for all users. Each verified artifact is hard-linked (copied across filesystems) and renamed into place. The license gates do not apply: the store serves this machine's users, which is not redistribution. + - `--catalogs DIR` (with `--store` only) — also release the catalog: write the selected catalog into the pack directory `DIR` and point `DIR/latest.json` at it. Readers whose `catalog` setting names `DIR` follow the release with no config edit. Before placing anything it refuses a catalog that names an artifact the store would not hold at the recorded size. +- `--mirror URL` — an off-machine mirror, a writable fsspec URL: `s3://my-bucket/raincloud` (needs `pip install raincloud[s3]`) or `file:///mnt/shared/raincloud-mirror`. An `https://` mirror can serve readers but is not writable, so `publish` refuses it (exit 2) before planning anything. `RAINCLOUD_MIRROR` configures readers only; publish always needs the flag. Modifiers: -- `--dry-run` — print the upload plan (paths + keys) without writing. Always preview large publishes this way first. +- `--dry-run` — print the plan (paths + keys, and the catalog revision a release would point at) without writing. Always preview large publishes this way first. +- `--allow-scrape-advisory`, `--allow-no-redistribution` — `--mirror` only. A slug whose license carries a `scrape_advisory`, or sets `redistribution_permitted: false`, is refused unless you pass the matching flag. Each flag clears only its own gate. ## Before publishing -1. **Build the slug locally first** (`/raincloud-build ` or `python -m scripts.pipeline.build `). Publish does not build; it only pushes what's already in `outputs/v{n}//`. -2. **Regenerate the snapshot** (`/raincloud-docs` or `python -m scripts.pipeline.docs`). The publish gate compares local bytes against `parquet_sha256` / `vortex_sha256` in `docs/v1/snapshot.json` — a stale snapshot causes false `PublishMismatch` failures. -3. **Verify the mirror URL** with a dry-run first. +1. **Build the slug locally first** (`/raincloud-build `). Publish does not build; it only places what is already under `outputs/v{n}//`. +2. **Make the snapshot record the bytes.** In a checkout, after a local build or export: the plain `python -m raincloud.pipeline.docs`, which takes each file's sha256 and writer from this install's build record (`/builds.json`). Keep `docs snapshot --rehash` for files the build record does not describe (built elsewhere, or by an older raincloud): it bypasses the record, so a rehashed Vortex file loses its recorded writer. Then promote all three, `cp docs/snapshot.json docs/datasets.md docs/handlers.md docs/v2/`, review `git diff docs/v2/`, and commit. A custom bundle is immutable: package and select a new matched bundle if its pinned checksums need changing. +3. **Preview** with `--dry-run`. -## What gets uploaded +## What gets placed -For each slug × format pair (`parquet`, `vortex`) where a local artifact exists: -- Key: `v1///.` -- Body: the raw artifact bytes -- Gate: `sha256(local) == snapshot[_sha256]` (raises `PublishMismatch` on disagree; an unpinned slug — `sha256` is `null` — uploads without verification, so prefer to regen the snapshot first). +For each present canonical Arrow, Parquet or Vortex file (one per format, whichever writer made it): +- Key: `v{n}///`, under the store or mirror root. +- Gate: the snapshot checksum, when it records one, must match, checked under the store lock. A file already in the store as the same file (a hard link from an earlier publish, or a build whose `data_dir` is the store) is not re-hashed. A mirror upload goes to a temporary key and is promoted only after the uploaded stream matches the validated local digest. +- Store files keep the builder's owner and mode (a hard link or `copy2`), so build under a umask or group that lets the store's other users read them. ## Failure modes -| Error | Meaning | Fix | +| Output | Meaning | Fix | |---|---|---| -| `PublishMismatch: ...` | Local bytes diverge from the snapshot's recorded sha. | Re-run `/raincloud-docs` to refresh the snapshot, OR confirm the local artifact is correct and commit the new snapshot. | -| `FileNotFoundError: outputs/v1//...` | Slug isn't built locally. | Run `/raincloud-build ` first. | -| `ImportError: Install s3fs ...` | `s3://` mirror without `[s3]` extra. | `pip install 'raincloud[s3]'`. | +| `refusing to publish: …sha256… != …` (`PublishMismatch`) | Local bytes differ from the snapshot's recorded sha. | Regenerate and promote the snapshot as above, or create/select a new matched bundle. | +| `refusing : license …` | A license gate blocked a `--mirror` upload. | Leave it unpublished, or pass the named `--allow-*` flag if redistribution really is permitted. | +| `refusing to release the catalog: it names N artifact(s) …` | `--catalogs` would release a catalog naming files the store lacks. | Publish those slugs to the store first. | +| `refusing to publish: nothing built for under ` (exit 1) | A slug named on the command line has no built file here. | Run `/raincloud-build ` first. | +| `published 0 artifact(s)` / `placed 0 artifact(s)` (exit 0) | `--all` found nothing built locally; unbuilt slugs are skipped under `--all`. | Build what should be published, and check the count after every `--all` publish. | +| `unknown dataset ''. Did you mean …?` (exit 2) | The slug is not in the selected catalog. | Use the suggested name, or `raincloud list`. | +| `ImportError: Install s3fs …` | `s3://` mirror without the `[s3]` extra. | `pip install 'raincloud[s3]'`. | ## After publishing -Downstream users can now `raincloud.load()` and the loader will pull from the configured mirror (cache → mirror → build). +Readers of the store (via the released catalog) or of the mirror (`RAINCLOUD_MIRROR`) can now `raincloud.load()` it. Local/cache is checked first, then the mirror; building still requires explicit opt-in. -Context: [AGENTS.md "The loader package"](../../../AGENTS.md), [`scripts/pipeline/publish.py`](../../../scripts/pipeline/publish.py). +Context: [SKILLS.md "Releasing to this machine's store"](../../context/SKILLS.md#releasing-to-this-machines-store), [AGENTS.md "Public loader API"](../../context/AGENTS.md#public-loader-api), [`raincloud/pipeline/publish.py`](../../../raincloud/pipeline/publish.py). diff --git a/.agents/skills/raincloud-remove-dataset/SKILL.md b/.agents/skills/raincloud-remove-dataset/SKILL.md index 1a09701..301935e 100644 --- a/.agents/skills/raincloud-remove-dataset/SKILL.md +++ b/.agents/skills/raincloud-remove-dataset/SKILL.md @@ -11,32 +11,42 @@ Walk through removing dataset `$ARGUMENTS`. Reference: [SKILLS.md "Removing a da Steps: -1. **Remove the `DatasetSpec` entry from `sources.json`** using the [Python load-edit-dump pattern](../../context/AGENTS.md#safe-ways-to-edit-sourcesjson) — never `sed`. Look up by `slug` and remove from `m["datasets"]`. +1. **Check for dependents.** Run `python -m raincloud.pipeline.list_datasets --hydrate --long`. A `-hydrated` entry whose `derive.from` names this dataset must be removed with it, or re-parented; otherwise `validate_manifest` fails on its dangling `derive.from`. -2. **Delete the output parquet** (and sibling `.vortex` if present): +2. **Resolve the paths before changing the manifest.** Run this from the checkout, with the slug filled in. `operation_lock(resources=True)` takes the store, raw and scratch locks, so a build or export cannot move anything while the paths are resolved; the locks are released when the block ends: - ```bash - rm -rf outputs/v1// + ```python + from raincloud.pipeline.lifecycle import operation_lock + from raincloud.pipeline.spec import outputs_root, raw_slug_dir, recipe_workdir_root + + slug = "SLUG" + with operation_lock(resources=True) as ctx: + manifest = ctx.manifest + spec = next(s for s in manifest["datasets"] if s["slug"] == slug) + print(outputs_root() / slug) # built files, current schema_version + print(raw_slug_dir(slug)) # raw payloads, shared across versions + print(recipe_workdir_root(spec, manifest) / slug) # this recipe's scratch ``` -3. **Optionally delete the raw cache:** + Show the user the three paths and what each holds. - ```bash - rm -rf outputs/raw_downloads// - ``` +3. **Delete only what the user approved, while no build or export is running** (the lookup's locks are no longer held). The output directory; the recipe scratch; the raw payloads only if asked. Keep: + - every older `outputs/v{n}//` — a frozen version, which nothing regenerates; + - any `.recipes/` generation other than the ones printed, which belong to other catalogs or recipes (when the raw path printed is `/` itself, delete its payload files and leave its `.recipes/` subdirectory); + - symlink targets: remove a symlink itself, never recurse through it. - Only do this if you're confident the dataset won't be re-added. The raw cache is unversioned and could feed a future schema_version bump. +4. **Remove the `DatasetSpec` entry from `sources.json`** using the [Python load-edit-dump pattern](../../context/AGENTS.md#editing-sourcesjson). Immutable installed bundles require a newly packaged catalog; never edit a cached revision in place. - **Watch for sibling slugs sharing the same upstream URL** (GloVe sizes, OSM Germany kinds) — those are deduped via hardlink. Removing `outputs/raw_downloads//` is fine because each slug gets its own subdir, but verify there isn't a multi-output handler producing the parquet from a shared raw dir before deleting either. +5. **If a handler became unused** (only this slug referenced it), delete the handler file from `raincloud/pipeline/handlers/` and its entry from `HANDLERS` in `raincloud/_registry.py`. That entry is the only registration, and the catalog capability list derives from it. No stub or deprecation shim — fully delete. -4. **Regenerate docs:** +6. **Regenerate and promote the docs**, or invoke `/raincloud-docs`. The regeneration writes gitignored scratch; the tracked `docs/v2/` keeps the removed slug until it is promoted: ```bash - python -m scripts.pipeline.docs + python -m raincloud.pipeline.docs + cp docs/snapshot.json docs/datasets.md docs/handlers.md docs/v2/ + git diff docs/v2/ ``` - (Or invoke `/raincloud-docs`.) - -5. **If a handler became unused** (only this slug referenced it), remove the handler file from `scripts/pipeline/handlers/` and unregister it from `__init__.py`. No stub or deprecation shim — fully delete. +Entries for the slug in this install's build record (`/builds.json`) are left alone: the loader consults them only for a dataset the catalog names, and only for a file present at the recorded size, so they are inert once the files are gone. Removed means removed. diff --git a/.agents/skills/raincloud-status/SKILL.md b/.agents/skills/raincloud-status/SKILL.md index 1426aa4..c28fd29 100644 --- a/.agents/skills/raincloud-status/SKILL.md +++ b/.agents/skills/raincloud-status/SKILL.md @@ -1,41 +1,41 @@ --- name: raincloud-status -description: Report per-dataset state (raw / workdir / parquet / vortex / variant-pending) across the manifest. Use when the user asks what's downloaded, what's built, what's missing, what needs re-tightening, or to triage which slugs still need work. +description: Report per-dataset filesystem state (raw / work / arrow / parquet / vortex) across the manifest. Use when the user asks what's downloaded, what's built, what's missing, or to triage which slugs still need work. argument-hint: [...] [--fast] [--missing-only] [--json] -allowed-tools: Bash(python -m scripts.pipeline.status *) +allowed-tools: Bash(python -m raincloud.pipeline.status *) --- Run the status reporter: ```bash -python -m scripts.pipeline.status $ARGUMENTS +python -m raincloud.pipeline.status $ARGUMENTS ``` -Walks the manifest and reports per-slug filesystem state in five columns: +Walks the manifest and reports per-slug filesystem state: | Column | What it shows | |---|---| -| `raw` | `outputs/raw_downloads//` present. `≠` if `fetch.expected_bytes` is declared and the on-disk total disagrees (only checked for single-URL specs — that's the same condition `fetch.py` uses). | -| `work` | `_workdir//` non-empty (extract scratch — wiped by `--clean-workdir`). | -| `parquet` | `outputs/v{n}//.parquet` present. Shows row count; `≠` prefix if it disagrees with `expect.rows`. | -| `vortex` | Sibling `.vortex` for slugs with `convert.vortex: true`. `n/a` for non-opted-in specs, `stale` if the parquet is newer. | -| `variant` | Count of residual JSON-annotated columns (= `/raincloud-tighten-variant` pending). `?` when `--fast` skipped the parquet footer scan. | +| `raw` | Selected raw generation contains payload files; recipe metadata alone does not count. `≠` if `fetch.expected_bytes` is declared and the on-disk total disagrees (only checked for single-URL specs — that's the same condition `fetch.py` uses). | +| `work` | Selected `.recipes///` scratch (or legacy unscoped scratch) is non-empty (extract scratch — wiped by `--clean-workdir`). | +| `arrow` | (`schema_version` 2) the canonical `/v{n}//arrow/.arrow.zstd` is present. | +| `parquet` | `/v{n}//parquet/.parquet` present when the export policy includes Parquet. Shows row count; `≠` prefix if it disagrees with `expect.rows`; `unavail` as for `vortex`. | +| `vortex` | `/v{n}//vortex/.vortex` present when the export policy includes Vortex (one file, whichever writer made it). In v2 the policy is `export.formats`, or the default formats when it is absent; in v1, `convert.vortex`. `n/a` when Vortex is not exported; `stale` if its source (canonical Arrow in v2, Parquet in v1) is newer than the file; `unavail` when a build measured the writer unable to produce it at the current recipe (this install's build record, else the catalog's), which counts as complete. | Selection (default: every slug in the manifest): - `...` — positional slugs - `--all` — explicit "every dataset" (the default, kept for parity with `/raincloud-build`) Modifiers: -- `--fast` — skip the parquet footer scan. Drops the row count and JSON-column check; keeps everything else. Useful on slow storage or for a quick pass over the full catalog. +- `--fast` — skip the parquet footer scan, which drops the row count. Useful on slow storage or for a quick pass over the full catalog. - `--missing-only` — narrow output to slugs with at least one incomplete stage. Combines well with `--fast` for a quick "what still needs work" view. - `--json` — emit a JSON array instead of the table. Use when piping into another tool. -The summary line at the bottom shows totals, e.g.: +The summary line at the bottom shows totals (the last part only when a format was measured unavailable), e.g.: ``` -N slugs · raw M/N · parquet M/N · rows-match M/N · vortex M/N · tighten-variant pending K +N slugs · raw M/N · arrow M/N · parquet M/N · rows-match M/N · vortex M/N · K measured unavailable ``` -This is read-only — it never touches `outputs/` or `_workdir/`. Safe to invoke whenever you want a snapshot. Suggest `/raincloud-build` for missing parquets, `/raincloud-convert` for missing vortex siblings, `/raincloud-tighten-variant` for variant-pending slugs. +This is read-only — it never writes anything. Safe to invoke whenever you want a snapshot. Suggest `/raincloud-build` for a missing canonical or Parquet file, and `/raincloud-export --format vortex` for a missing or stale Vortex file when the canonical is present. -Context: [SKILLS.md](../../context/SKILLS.md), [AGENTS.md "How the build pipeline is structured"](../../context/AGENTS.md#how-the-build-pipeline-is-structured). +Context: [SKILLS.md](../../context/SKILLS.md), [AGENTS.md "How a build works"](../../context/AGENTS.md#how-a-build-works). diff --git a/.agents/skills/raincloud-tighten-variant/SKILL.md b/.agents/skills/raincloud-tighten-variant/SKILL.md deleted file mode 100644 index 7481ed6..0000000 --- a/.agents/skills/raincloud-tighten-variant/SKILL.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -name: raincloud-tighten-variant -description: In-place promote JSON-annotated string columns to VARIANT in built parquets. Use when a parquet already exists and you want to upgrade its JSON columns without rerunning the full pipeline. -argument-hint: [...] [--chunked] [--dry-run] -disable-model-invocation: true -allowed-tools: Bash(python -m scripts.pipeline.tighten_variant *) ---- - -Run the JSON → VARIANT in-place tightening pass: - -```bash -python -m scripts.pipeline.tighten_variant $ARGUMENTS -``` - -Selection: -- *(no slugs)* — every parquet under `outputs/v*/` is considered. -- `...` — only those specific slugs. - -Modifiers: -- `--dry-run` — report which parquets *would* be rewritten, without touching them. -- `--chunked` — force row-group-at-a-time mode. Needed for wide / deeply-nested records where single-shot VARIANT cast spills blow up DuckDB memory (e.g. Open Food Facts). - -Behavior: -- Idempotent: parquets already lacking JSON-annotated columns are skipped (reported as "already"). -- Uses `CAST(col AS VARIANT)` + atomic tmp-rename via `duckdb_connect` (which applies `storage_compatibility_version=v1.5.0`). -- Memory-hungry on heavily-nested payloads. Set `RAINCLOUD_DUCKDB_MEMORY_LIMIT=96GB` for known-heavy cases (Open Food Facts is the tested ceiling). - -When to use: -- After a build that produced a JSON-annotated string column you want to promote without rerunning the full pipeline. -- For new builds that should emit VARIANT from the start, write a streaming handler instead — see `/raincloud-add-handler` and [SKILLS.md](../../context/SKILLS.md#promoting-a-json-column-to-variant). - -After this runs, suggest `/raincloud-docs columns_parquet coverage_parquet` to refresh the parquet-side derived docs. diff --git a/.agents/skills/raincloud-validate-manifest/SKILL.md b/.agents/skills/raincloud-validate-manifest/SKILL.md index 6617304..d470b14 100644 --- a/.agents/skills/raincloud-validate-manifest/SKILL.md +++ b/.agents/skills/raincloud-validate-manifest/SKILL.md @@ -1,30 +1,33 @@ --- name: raincloud-validate-manifest -description: Static checks for sources.json — JSON Schema shape + cross-checks (handler registry, slug uniqueness, fetch.type/auth consistency). Use after any manifest edit, before triggering a build, or whenever an agent wants a sub-second sanity check that the manifest is well-formed. -argument-hint: [--json] [--strict] -allowed-tools: Bash(python -m scripts.pipeline.validate_manifest *) +description: Static checks for sources.json — JSON Schema shape + cross-checks (handler registry, slug uniqueness, fetch.type/auth consistency). Use after any manifest edit, before triggering a build, or whenever an agent wants a fast sanity check that the manifest is well-formed. +argument-hint: [path/to/sources.json] [--json] [--strict] +allowed-tools: Bash(python -m raincloud.pipeline.validate_manifest *) --- Run the manifest validator: ```bash -python -m scripts.pipeline.validate_manifest $ARGUMENTS +python -m raincloud.pipeline.validate_manifest $ARGUMENTS ``` What it checks: -1. **JSON Schema** — shape and enums declared in [`sources.schema.json`](../../../sources.schema.json) (Draft 2020-12). Requires the `jsonschema` package; pinned in `pyproject.toml`. Skipped with a hint if missing. +1. **JSON Schema** — shape and enums declared in [`sources.schema.json`](../../../sources.schema.json) (Draft 2020-12). Requires the `jsonschema` package, declared in the `[build]` extra. Skipped with a hint if missing. 2. **Cross-checks** the schema can't express: - Slug uniqueness across `datasets[]`. - - Every `transform.handler` resolves in `scripts/pipeline/handlers/__init__.py:_REGISTRY`. - - Every registered handler is referenced by ≥1 spec (orphans → warning). - - `fetch.urls` non-empty unless `fetch.type == "custom"`. + - Every `transform.handler` is declared in `HANDLERS` in `raincloud/_registry.py` (`handlers/__init__.py:_REGISTRY` is derived from it). + - Every declared handler is referenced by ≥1 spec (orphans → warning). + - `derive.from` names an ordinary dataset, and a hydrated dataset is named `-hydrated`. + - `fetch.urls` non-empty unless `fetch.type` is `custom` or `generated`; a `generated` fetch names a registered generator, valid parameters and one of its outputs. - `fetch.auth` matches `fetch.type` for `kaggle` / `huggingface`. - - `fetch.requires_interactive_accept` only on `fetch.type == "kaggle"`. - - `write.output` filename agrees with slug for single-output handlers (warning otherwise — multi-output handlers legitimately diverge). + - `fetch.requires_interactive_accept` only on `kaggle` / `huggingface` fetches. + - Exports: in v2, `export.formats` names the formats a dataset wants (`parquet`/`vortex`; leaving one out needs no reason, and a writer's limitation is measured by the build, never declared), and `convert.*` is rejected; `export.priority` (a list or a per-format map) names real writers. A list must name a writer for every exported format (`["hardwood"]` on a dataset that exports Vortex is an error). + +It prints which manifest it validated. With no argument that is the selected catalog's (`RAINCLOUD_MANIFEST`, the checkout's `sources.json`, or the copy installed with raincloud); a path argument validates that file instead. Modifiers: -- `--json` — machine-readable report (`{ok, n_datasets, errors, warnings, schema_skipped}`). +- `--json` — machine-readable report (`{ok, manifest, n_datasets, schema_skipped, errors, warnings}`; `manifest` names where the validated manifest came from). - `--strict` — treat warnings as errors. Useful in CI-style gating. Exit code: `0` on success (warnings allowed), `1` on errors. @@ -34,4 +37,4 @@ When to invoke: - Before `/raincloud-build` on a fresh slug — catches typo'd handler names without paying for a fetch. - As the read-only counterpart to `/raincloud-status`: `/raincloud-status` reports filesystem state, `/raincloud-validate-manifest` reports manifest correctness. -Context: [AGENTS.md "Safe ways to edit sources.json"](../../context/AGENTS.md#safe-ways-to-edit-sourcesjson), [sources.schema.md](../../context/sources.schema.md), [`sources.schema.json`](../../../sources.schema.json). +Context: [AGENTS.md "Editing sources.json"](../../context/AGENTS.md#editing-sourcesjson), [sources.schema.md](../../context/sources.schema.md), [`sources.schema.json`](../../../sources.schema.json). diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a633ca3..4b41a03 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -31,25 +31,66 @@ jobs: - name: Pin Python run: uv python install 3.11 - # `--extra dev` brings in pytest + ruff. `--extra tui` brings in - # textual so the test_browse suite runs instead of skipping. `--extra - # build` brings in the heavy pipeline deps (duckdb, osmium, pyreadstat, - # zstandard, jsonschema, …) — required because validate_manifest + - # pytest collection import the handler registry, which transitively - # pulls those. Skip kaggle/huggingface — those deps are only needed at - # fetch time and neither test path imports them. + # `--extra dev` brings in pytest + ruff; `--extra tui` textual, so the + # test_browse suite runs instead of skipping. `build` is the pipeline + # core and `pandas` backs Dataset.to_pandas(); osm/sas/excel/archives are the + # per-handler format extras, which the handler tests import. Skip + # kaggle/huggingface -- those deps are only + # needed at fetch time and neither test path imports them. - name: Install dependencies - run: uv sync --extra dev --extra tui --extra build + run: uv sync --extra dev --extra tui --extra build --extra pandas --extra osm --extra sas --extra excel --extra archives --inexact - name: Lint (ruff) run: uv run ruff check - name: Validate manifest - run: uv run python -m scripts.pipeline.validate_manifest + run: uv run python -m raincloud.pipeline.validate_manifest - name: Test (pytest) run: uv run pytest -q + java-sidecars: + # Validate the JVM conformance lanes: the parquet@java lane is a Gradle + # composite build over the parquet-arrow-java git submodule, so this job + # must check out submodules recursively (the default checkout omits them, + # which would break `includeBuild`). Guards against the "green PR, broken + # composite build" gap. parquet@hardwood builds on Java 21 (Hardwood's + # target); Gradle finds it through JAVA_HOME_21_X64 (sidecars/java/gradle.properties), + # and the last version listed, 17, stays the default JAVA_HOME. + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Set up JDK 21 and 17 + uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: | + 21 + 17 + cache: gradle + + - name: Build + test JVM sidecars (conformance-common + parquet@java, parquet@hardwood, vortex@jni lanes) + run: ./sidecars/java/gradlew -p sidecars/java :conformance-common:test :parquet-java:test :parquet-java:installDist :parquet-hardwood:test :parquet-hardwood:installDist :vortex-jni-reader:test :vortex-jni-reader:installDist + + - uses: astral-sh/setup-uv@v5 + with: + enable-cache: true + + - name: Install reader-fixture dependencies + run: uv sync --python 3.11 --extra dev --extra build --inexact + + - name: Verify Java lanes against shared fidelity fixtures + env: + RAINCLOUD_READER_PARQUET_JAVA: ${{ github.workspace }}/sidecars/java/parquet-java/build/install/raincloud-export-parquet-java/bin/raincloud-read-parquet-java + RAINCLOUD_SIDECAR_PARQUET_HARDWOOD: ${{ github.workspace }}/sidecars/java/parquet-hardwood/build/install/raincloud-export-parquet-hardwood/bin/raincloud-export-parquet-hardwood + RAINCLOUD_READER_PARQUET_HARDWOOD: ${{ github.workspace }}/sidecars/java/parquet-hardwood/build/install/raincloud-export-parquet-hardwood/bin/raincloud-read-parquet-hardwood + RAINCLOUD_SIDECAR_VORTEX_JNI: ${{ github.workspace }}/sidecars/java/vortex-jni-reader/build/install/raincloud-read-vortex-jni/bin/raincloud-export-vortex-jni + RAINCLOUD_READER_VORTEX_JNI: ${{ github.workspace }}/sidecars/java/vortex-jni-reader/build/install/raincloud-read-vortex-jni/bin/raincloud-read-vortex-jni + run: uv run --no-sync pytest -q tests/test_reader_fidelity.py tests/test_java_reader_schema_compare.py tests/test_jvm_sidecar_lanes.py + wheel: runs-on: ubuntu-latest steps: @@ -60,8 +101,8 @@ jobs: enable-cache: true - name: Pin Python run: uv python install 3.11 - - name: Install dev deps (for pytest + vortex base dep used by fixtures) - run: uv sync --extra dev + - name: Install dev and optional Vortex fixture dependencies + run: uv sync --extra dev --extra vortex --inexact # Scope collection to test_wheel.py: this env intentionally omits the # [build] extra, but pytest imports every collected module before -m # filtering, and test_manifest/test_profile import jsonschema (a [build] @@ -81,6 +122,42 @@ jobs: - name: Pin Python run: uv python install 3.11 - name: Install dev + build deps - run: uv sync --extra dev --extra build + run: uv sync --extra dev --extra all --inexact - name: Run real-build network tests run: uv run pytest --run-network -m network -v + + native-readers: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + - uses: astral-sh/setup-uv@v5 + - uses: dtolnay/rust-toolchain@stable + - uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: | + 21 + 17 + - name: Install fixture and test dependencies + run: uv sync --python 3.11 --extra dev --extra build --extra http --inexact + # Also builds the Rust and Java sidecars and runs their conformance suites; + # PYTEST_MODULES in the runner lists the pytest modules it covers. Needs + # CMake and readelf (both preinstalled). + - name: Verify Python, Rust, C, C++, and Java readers + run: uv run --no-sync python scripts/test_native_readers.py + + portable-base-wheel: + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - uses: astral-sh/setup-uv@v5 + - name: Install base and test tools + run: uv sync --python 3.11 --extra dev --inexact + - name: Test isolated base wheel outside the checkout + run: uv run --no-sync pytest --run-wheel -q tests/test_wheel.py -k "portable_base_install or wheel_builds_and_base_install_imports or base_install_excludes_heavy_deps" diff --git a/.gitignore b/.gitignore index 217720b..1bd4a7d 100644 --- a/.gitignore +++ b/.gitignore @@ -53,13 +53,19 @@ htmlcov/ *.sqlite *.sqlite3 -# Pipeline build artifacts — regenerate with scripts/pipeline/build.py +# Pipeline build artifacts — regenerate with raincloud/pipeline/build.py. +# `/outputs` also matches when it is a symlink to bulk storage (a trailing-slash +# pattern matches only a real directory). outputs/ +/outputs # Archived notes from prior iterations (Kaggle triage, attribution audit, # conversation logs). Kept locally for reference but not tracked. .archive/ +# Local planning notes — not tracked. +.big-plans/ + # OS metadata .DS_Store Thumbs.db @@ -76,7 +82,18 @@ Thumbs.db _workdir/ .tmp -# scratch (top-level docs/*.md / *.json mirror; canonical copies live in docs/v1/) +# scratch (top-level docs/*.md / *.json mirror; canonical copies live in docs/v{n}/) docs/datasets.md docs/handlers.md docs/snapshot.json + +# Local planning notes — not tracked. +.dispatch/ + +# Native reader build outputs +/clients/rust/target/ +/clients/java/.gradle/ +/clients/java/build/ +/clients/c/build/ +# profile promotion lock beside tracked profiles +docs/**/.profiles-write.lock diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..d915be0 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "sidecars/java/parquet-arrow-java"] + path = sidecars/java/parquet-arrow-java + url = https://github.com/mprammer/parquet-arrow-java.git diff --git a/AGENTS.md b/AGENTS.md index 66651e2..76300e7 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,133 +1,209 @@ # AGENTS.md -Guidance for AI coding agents (Claude Code, Cursor, etc.) working in this repo. Read this before making non-trivial changes — the repo's layout is intentional and the core invariants below are easy to violate accidentally. +Guidance for AI coding agents working in this repo. The layout is deliberate and the +invariants below are easy to break by accident — read them before non-trivial changes. -For the user-facing overview, see [`README.md`](README.md). For the manifest schema, see [`sources.schema.md`](sources.schema.md). The repo root also has a `CLAUDE.md → AGENTS.md` symlink so Claude Code auto-loads this file; both names point at the same content. +For what raincloud is and how to use it, see [`README.md`](README.md). For the manifest +schema, [`sources.schema.md`](sources.schema.md). For step-by-step procedures, +[`SKILLS.md`](SKILLS.md). `CLAUDE.md` is a symlink to this file. -## First contact +## Start here -On a fresh clone `outputs/` is empty — that's expected. The `outputs/v1//` directories are gitignored and only populated by builds. Verify your environment with the read-only smoke test before doing anything heavy: +On a fresh clone `outputs/` is empty. That's expected — artifacts are built, not shipped. ```bash -python -m scripts.pipeline.status --fast --missing-only +python -m raincloud.pipeline.status --fast --missing-only # read-only; seconds +python -m raincloud.pipeline.validate_manifest # schema + registry cross-checks +pytest # needs --extra dev --extra all ``` -It loads `sources.json`, walks the manifest, and prints per-slug filesystem state in seconds with no side effects. A bare `uv sync --inexact` (or `pip install "raincloud @ git+https://github.com/spiraldb/raincloud"` from GitHub — not PyPI) installs only the lightweight loader; running any **build** needs the heavy toolchain, so fix the env with `uv sync --extra build --inexact` before invoking `scripts.pipeline.build`. Always pass `--inexact` to `uv sync`: without it, syncing one extra (e.g. `--extra dev`) silently uninstalls the others (build, kaggle, huggingface, tui), so a subsequent build of an HF/Kaggle slug will fail. +Installs are layered. A bare `uv sync --inexact` gets only the loader; builds need +`uv sync --extra build --inexact`, plus the extra a dataset needs for its format or +source: `osm`, `sas`, `excel`, `archives`, `generated` (the TPC-H/TPC-DS generators), +`kaggle`, `huggingface`. `--extra all` installs everything. **Always pass +`--inexact`**: without it, syncing one extra silently uninstalls the others, and a +later Kaggle/HF build fails. -For a manifest sanity check that doesn't touch the filesystem at all: +Query the catalog rather than grepping `sources.json` or scrolling +`docs/v2/datasets.md`: ```bash -python -m scripts.pipeline.validate_manifest +python -m raincloud.pipeline.list_datasets --handler uci_default --count +python -m raincloud.pipeline.list_datasets --kaggle-tos # gated behind a one-time click-through (Kaggle or Hugging Face) +python -m raincloud.pipeline.list_datasets --grep '\bgeo' --long +raincloud describe # one dataset's columns and types, from the catalog +python -m raincloud.pipeline.list_datasets --columns --column-grep PATTERN # columns across locally built files +python -m raincloud.pipeline.list_datasets --coverage --source parquet # type coverage of locally built files +python -m raincloud.pipeline.list_datasets --stale-version # slugs BUILT under an OLDER schema_version (never-built excluded) ``` -Validates `sources.json` against [`sources.schema.json`](sources.schema.json) (Draft 2020-12) plus cross-checks that the schema can't express — handler-name resolution against the live registry, slug uniqueness, `fetch.type`/`fetch.auth` consistency. Sub-second; safe to invoke after any manifest edit. - -For catalog queries that would otherwise require greping the ~545 KB `sources.json` (or scrolling ~158 KB of [`docs/v1/datasets.md`](docs/v1/datasets.md)): - -```bash -python -m scripts.pipeline.list_datasets --handler uci_default --count -python -m scripts.pipeline.list_datasets --handler tighten_types --long -python -m scripts.pipeline.list_datasets --fetch-type kaggle --kaggle-tos -python -m scripts.pipeline.list_datasets --grep '\bgeo' --long -``` - -Filters compose with AND across `--handler`, `--license`, `--fetch-type`, `--reader`, `--vortex` / `--no-vortex`, `--kaggle-tos`, `--grep`. Output modes: default (one slug per line), `--long` (wide table), `--json` (jq-friendly), `--count`. - -If the user wants to *browse* interactively rather than query, point them at `python -m scripts.pipeline.browse` (read-only Textual TUI over the same data; requires `uv sync --extra tui --inexact`). It's a human-facing tool — don't try to run it from an agent context, since it won't render and will hang waiting for keystrokes. - -For a slightly broader regression net, the `tests/` directory carries a sub-second pytest smoke suite (manifest shape, schema self-consistency, handler registry, example template). Run it after any change to the manifest, the schema, or the handler registry: - -```bash -uv sync --extra dev --inexact # one-time — installs pytest, preserves other extras -pytest -``` - -Copy-pasteable templates for the two most common edits live under [`templates/`](templates/) — `minimal_spec.json` for new manifest entries, `streaming_handler.py.tmpl` for memory-constrained transform handlers. (Runnable demos of the `raincloud.load` API live under [`examples/`](examples/).) - -If your agent harness supports the [Agent Skills](https://agentskills.io) standard (Claude Code, Codex, etc.), the `.agents/skills/` directory carries 21 invokable skills wrapping every pipeline entry point and procedural playbook — see [`.agents/skills/README.md`](.agents/skills/README.md). `.claude → .agents` is a symlink so both naming conventions resolve. The `.agents/settings.json` at the same level is a tracked allow-list of safe, read-only commands so a fresh-clone agent doesn't burn turns on permission prompts; per-machine overrides go in the gitignored `.agents/settings.local.json`. - -## Don't read the giant derived docs cover-to-cover - -`docs/v1/datasets.md` (~158 KB) is large; prefer targeted reads via `offset`/`limit`. Column-level / coverage / vortex-skip / hydrate-candidate views are NOT markdown anymore — they used to be (huge `columns_*.md` and `coverage_*.md` files, plus per-slug `vortex_skip.md` and `hydrated.md` listings) but those were unscannable as a reading experience and duplicated state already queryable. They're now flags on `list_datasets`: - -```bash -python -m scripts.pipeline.list_datasets --columns [...] [--column-grep PATTERN] -python -m scripts.pipeline.list_datasets --coverage [--source parquet|vortex] -python -m scripts.pipeline.list_datasets --no-vortex --long # vortex-opted-out slugs + reasons (via --json) -python -m scripts.pipeline.list_datasets --hydrate --long # hydration candidates -``` - -Hydration policy / philosophy lives in the hand-maintained [`HYDRATING.md`](HYDRATING.md) (preamble only, no auto-generated per-slug list). For catalog-shape questions ("which slugs use handler X", "what's CC0-licensed") prefer `list_datasets`. The top-level `docs/*.md` mirrors are gitignored scratch and behave identically. - -[`docs/v1/handlers.md`](docs/v1/handlers.md) (small — ~3 KB) is fine to read in full and carries one row per registered handler with purpose, streaming flag, **the format-specific deps it imports** (`pandas`, `openpyxl`, `pyreadstat`, `osmium`, `zstandard`, `unlzw3` — pyarrow / numpy / duckdb suppressed as core), manifest spec count, and example slugs. Read it before adding a new handler so you can pick precedent and know which extras the manifest entry will need. - -## What this repo does - -Raincloud is a **client-reproducible pipeline** for building a curated catalog of public datasets as Parquet + optional Vortex files. The single source of truth is `sources.json`. Everything under `outputs/`, the two derived docs (`docs/datasets.md`, `docs/handlers.md`), and the JSON catalog snapshot (`docs/snapshot.json` — read by the TUI as a fallback for unbuilt-locally slugs, AND used by `docs.py` itself as the row-count / file-size fallback when regenerating `datasets.md` on a partial build) is **derived** — regenerate, never hand-edit. Column-level / coverage / vortex-skip / hydrate-candidate views are queryable via `list_datasets` flags rather than markdown. - -The pipeline flow is: **fetch → extract → parse → transform → write → validate → convert** (stage 7 opt-in per-spec), orchestrated by `scripts.pipeline.build`. - -## The loader package (`raincloud`) - -Separate from the build pipeline under `scripts/`, the repo also ships an importable **`raincloud`** package — a lightweight loader for *already-prepared* artefacts. `raincloud.load("")` (alias `load_dataset`) returns a lazy `Dataset` handle; nothing is fetched until you call `.path()` / `.to_arrow()` / `.scan()` / `.to_pandas()`. Resolution order is **local cache → mirror → local build** (`raincloud/_resolve.py`): a cache hit short-circuits, otherwise it pulls from the configured mirror, and only on a cache+mirror miss does it shell out to `scripts.pipeline.build` as a last resort. - -The install is **layered** — this is a behaviour change from earlier releases: - -- A bare `uv sync --inexact` (or a `pip install` from the GitHub repo) installs only the lightweight loader: base deps are `pyarrow`, `numpy`, `vortex-data`, `fsspec`. Transport backends are per-scheme extras (`[s3]` → s3fs, `[http]` → aiohttp; `file://` needs neither); `[duckdb]` / `[pandas]` back `Dataset.scan()` / `.to_pandas()`. -- **Building datasets now requires `uv sync --extra build --inexact`** — the heavy toolchain (duckdb, osmium, pyreadstat, pandas, openpyxl, py7zr, unlzw3, zstandard, jsonschema) moved behind the `[build]` extra. A bare sync no longer pulls these, so any `scripts.pipeline.build` / handler work needs `--extra build` first. - -The mirror is a **private/internal artefact store** — a bucket a team points its own CI at, configured via the `RAINCLOUD_MIRROR` env var (`s3://bucket/prefix`, `file:///path`, etc.); there is no public Raincloud-hosted endpoint, and this does not change the no-redistribution posture in [`DISCLAIMER.md`](DISCLAIMER.md). `RAINCLOUD_CACHE` overrides the cache dir and `RAINCLOUD_OFFLINE` forces cache-only (mirror/build misses raise). Maintainers publish built `outputs/v1/...` to a mirror with `python -m scripts.pipeline.publish --mirror `, gated on a snapshot sha256 match. Integrity: `docs/v1/snapshot.json` carries per-slug `parquet_sha256` / `vortex_sha256` (recorded only for slugs already built + hashed locally — today a minority of the catalog) plus a byte size for *every* slug. `publish` refuses to upload an artifact whose on-disk sha disagrees with the snapshot (slugs with no recorded sha are uploaded ungated). The loader, by default, **warns-and-adopts** on a checksum mismatch (drift is an alert, not a blocker — upstream data shifts) and falls back to the byte size as a cheap corruption check when no sha is pinned; set `RAINCLOUD_STRICT_CHECKSUM=1` to turn a mismatch on mirror bytes into a hard `ChecksumMismatch`. Locally-built artefacts are never strict-gated against the maintainer's sha (a client build legitimately differs); instead they're trusted via a provenance pin (`origin=build` + the snapshot pin they were built against) and served from cache until that snapshot pin changes — so a strict, mirror-less deployment rebuilds a slug once when the source of truth moves, not on every load. To backfill checksums for the rest of the catalog, build the slugs and run `python -m scripts.pipeline.docs snapshot --rehash`. - -**Build data-area env vars** (separate from the loader's cache vars above): the build pipeline writes artefacts under a configurable root. In a checkout, that root is the repo directory; in a `pip install raincloud[build]` wheel install, it defaults to `~/.cache/raincloud` (XDG-aware, no init step). The resolution logic lives in `scripts/pipeline/spec.py:data_root()`. - -| Env var | Controls | Default | -|---|---|---| -| `RAINCLOUD_HOME` | build data-area root | checkout root (if `sources.json` present), else `~/.cache/raincloud` | -| `RAINCLOUD_OUTPUTS` | built-artifact base (`/v{n}` under it) | `$RAINCLOUD_HOME/outputs` | -| `RAINCLOUD_RAW_DOWNLOADS` | cached raw upstream bytes | `$RAINCLOUD_OUTPUTS/raw_downloads` | -| `RAINCLOUD_WORKDIR` | extract/scratch space | `$RAINCLOUD_HOME/_workdir` | -| `RAINCLOUD_MANIFEST` | `sources.json` path | checkout copy, else the wheel-packaged copy | - -In the defaults above, `$RAINCLOUD_HOME` / `$RAINCLOUD_OUTPUTS` mean the *resolved* roots — when those vars are unset they fall back to the checkout (or `~/.cache/raincloud`) and `/outputs` respectively. - -From an agent context: on a fresh clone all five default to the repo tree (existing behaviour). On a wheel install with no checkout present, builds silently use `~/.cache/raincloud` (honoring `XDG_CACHE_HOME`) — same root `RAINCLOUD_CACHE` defaults to — so the loader's cache-hit path fires after the first build without any extra config. - -## Invariants (don't break these) - -1. **`sources.json` is authoritative.** Every row of every derived artefact maps back to a `DatasetSpec` here. If you're tempted to hand-edit `docs/*.md` or drop a parquet into `outputs/v1//` by hand — stop, fix the manifest, re-run the build, re-run `docs.py`. -2. **`outputs/raw_downloads//` is unversioned; `outputs/v{schema_version}///` is version-scoped.** Raw upstream bytes are the same regardless of output schema_version, so they're cached outside the version prefix. Within a version, artefacts live under per-format subdirectories: today `parquet/.parquet` and `vortex/.vortex`, with room for `parquet-hydrated/`, partitioned variants, etc. without filename collisions. Path helpers in `scripts/pipeline/spec.py`: `output_format_dir(slug, fmt)`, `prepared_parquet(slug)`, `prepared_vortex(slug)`. A manifest bump to v2 would populate `outputs/v2/` alongside `outputs/v1/`, both sharing `raw_downloads/`. -3. **`_workdir//` is scratch.** Gitignored and safe to wipe. Handlers should clean up what they put there; `build.py --clean-workdir` also wipes after a successful build. -4. **`.archive/` is gitignored and local-only.** Holds Kaggle-era triage/attribution docs kept on the maintainer's tree for reference. A fresh-clone agent won't have this directory — when other docs reference it as a "fallback" alongside git history, treat git history as the only fallback you can rely on. -5. **Always go through `spec.duckdb_connect`** when opening a DuckDB connection, not `duckdb.connect(...)` directly. The helper applies env-var-driven resource limits and the `storage_compatibility_version=v1.5.0` setting required for persistent VARIANT writes. See [`SKILLS.md`](SKILLS.md#opening-a-duckdb-connection) for detail. -6. **`docs/` layout is split.** Top-level `docs/*.md` is gitignored scratch — regenerable against a subset of parquets for local type-coverage experiments. `docs/v{schema_version}/*.md` is the tracked canonical snapshot matching `outputs/v{n}/`. Regenerating docs via `scripts.pipeline.docs` writes to the top-level path; promotion to `docs/v{n}/` is a manual copy. - -## How the build pipeline is structured - -The seven stages are in `scripts/pipeline/` and are each independently invokable: - -| Stage | Module | Reads | Writes | +`--grep` is a regex over `slug short_name full_name description` joined by spaces, +so anchor one slug as `'^ '`; `'^\b'` also matches `-hydrated` +and other hyphenated siblings. + +Filters AND together across `--handler`, `--license`, `--fetch-type`, `--reader`, +`--vortex`/`--no-vortex`, `--kaggle-tos`, `--stale-version`, `--local`, `--grep`. Output: +default one bare slug per line (a terminal also marks hydrated ones `[hydrated]`), +`--long`, `--json`, `--count`. In `--long`, `recorded` is what the tracked catalog +records (in `--json`, `built_version` / `stale_version`) and `local` is the formats +prepared on this install's disk. + +`raincloud.pipeline.browse` is a human-facing TUI — it will hang waiting for keystrokes. +Don't run it from an agent context; point the user at it instead. + +## Invariants + +1. **`sources.json` is authoritative.** Every row of every derived artifact maps back to + a spec here. Never hand-edit `docs/*.md` or drop a file into `outputs/` — fix the + manifest, rebuild, regenerate docs. +2. **`outputs/raw_downloads//` is unversioned; `outputs/v{n}///` is + version-scoped.** Raw upstream bytes don't depend on schema version, so they're cached + outside the version prefix and shared across versions. Path helpers live in + `raincloud/pipeline/spec.py` — use them rather than composing paths by hand. +3. **`/.recipes///` is scratch.** Handlers clean up after + themselves; `build.py --clean-workdir` removes only the selected generation. Clearing + it forces re-extraction without disturbing another recipe. +4. **Raincloud code, tests and examples open DuckDB through `raincloud.duckdb_connect`**, + never `duckdb.connect` directly. It applies the `RAINCLOUD_DUCKDB_*` resource limits + and `storage_compatibility_version=v1.5.0`, which persistent VARIANT writes require. +5. **`docs/` is split.** Top-level `docs/*.md` is gitignored scratch. `docs/v{n}/*` is the + tracked canonical set. `raincloud.pipeline.docs` writes to the top level; promoting to + `docs/v{n}/` is a deliberate manual copy. +6. **A superseded version is frozen.** Artifacts under an older `outputs/v{n}/` are not + rebuilt and must not be wiped — nothing regenerates them. +7. **`.archive/` is local-only and gitignored.** A fresh clone won't have it. Where other + docs name it as a fallback, git history is the only one you can rely on. + +## How a build works + +Orchestrated by `raincloud.pipeline.build`. The pipeline is **canonical-Arrow-spined**: +transform produces Arrow, `write_canonical` persists the one canonical artifact, and +every output format is derived from it by an exporter. + +| stage | module | reads | writes | |---|---|---|---| | fetch | `fetch.py` | `fetch.*` | `outputs/raw_downloads//` | -| extract | `extract.py` | `extract.*` | `_workdir//` | -| parse | `parse.py` | `parse.*` | in-memory `(Path, Table)` tuples | -| transform | `transform.py` | `transform.*` | in-memory `(slug, Table)` tuples *or* direct-to-parquet (streaming handlers) | -| write | `write.py` | `write.*` | `outputs/v{n}//parquet/.parquet` | -| validate | `validate.py` | `expect.*` | raises on mismatch unless `--loose` | -| convert | `convert.py` | `convert.*` | `outputs/v{n}//vortex/.vortex` (when `convert.vortex = true`); ALSO `outputs/v{n}//vortex-hydrated/.vortex` when a hydrated parquet exists. Same flag governs both pairs. | -| hydrate (opt-in, off the default build path) | `hydrate.py` | `hydrate.*` | `outputs/v{n}//parquet-hydrated/.parquet` (only when `hydrate` is set; safety-filter-gated; outbound HTTP). Auto-runs convert at the end when `convert.vortex = true`. | - -Streaming handlers (`factbook_variant_parse`, `jsonbench_variant_parse`, `wikipedia_variant_parse`, `lichess_pgn_parse`, `stack_exchange_split`, `osm_pbf_split`, `public_bi_merge`) write the parquet themselves and return `[]` — the write stage becomes a no-op. +| extract | `extract.py` | `extract.*` | `/.recipes///` | +| parse | `parse.py` | `parse.*` | in-memory `(Path, Table)` | +| transform | `transform.py` | `transform.*` | in-memory `(slug, Table)` | +| write_canonical | `canonical.py` | transform output | `outputs/v{n}//arrow/.arrow.zstd` | +| validate | `validate.py` | `expect.*` | hashes canonical schema, checks rows; `[WARN]` unless `--strict` | +| run_exporters | `export/` | `export.formats`, `export.priority` | `parquet/`, `vortex/` under `outputs/v{n}//`; the build record | +| hydrate *(named builds only)* | `hydrate.py` | `derive.hydrate` | a `-hydrated` dataset — outbound HTTP, safety-filter gated | + +`run_exporters` is also invokable on its own, which is the whole job whenever a +change touches only the export stage (row-group sizing, a codec, a new cell) — +the canonical is the input and is left alone: -Some `fetch.type: "kaggle"` entries carry `fetch.requires_interactive_accept: true` — those datasets are gated behind a one-time click-through ToS acceptance on the Kaggle web UI and can't be built on a fresh Kaggle account without that manual step. See [`SKILLS.md`](SKILLS.md#adding-a-kaggle-dataset-gated-behind-tos-acceptance) for the pattern. - -## Safe ways to edit `sources.json` +```bash +python -m raincloud.pipeline.export ... # re-derive from existing canonicals +python -m raincloud.pipeline.export --format vortex # refresh only the Vortex file +python -m raincloud.pipeline.export --format parquet@rs # this writer, this run +``` -The manifest is a large hand-authored JSON file (~545 KB, 249 dataset entries) with a specific top-level key order (`schema_version`, `generated_at`, `audit_cutoff`, `notes`, `datasets`). Stick with small Python scripts for edits: +It refuses a slug with no canonical rather than silently starting a build. A +`--format parquet@rs` override replaces that dataset's file with one from another +writer, so its sha256 no longer matches the catalog; `--all` with it rewrites every +Parquet file in the store, which takes hours. Confirm before running either. The +file is `parquet/.parquet` whichever writer made it, and the build record +(`/builds.json`) records the writer; the catalog learns it only when a +maintainer regenerates it (see [Regenerating derived docs](#regenerating-derived-docs)). + +Field-level `custom_metadata` (the `VARIANT_EXT` marker, GeoParquet `geo` metadata) rides +through the canonical IPC losslessly. Stamp VARIANT only through `variant.attach_variant` / +`attach_variant_schema` (the DuckDB bridge does): the stamp also declares the storage struct's +`metadata`, and an unshredded `value`, non-nullable, as the Parquet VARIANT spec and +`arrow.parquet.variant` require, and checks every row against that. DuckDB's Arrow export +declares every field nullable, which a hand-set marker would carry into the Parquet schema. + +**Streaming handlers** write the canonical spine themselves via +`canonical.open_canonical_writer` and `return []`, so `write_canonical` is a no-op for +them; they share the same `validate → run_exporters` tail. To find which handlers do +this, check the `streaming` column in `docs/v2/handlers.md` — don't rely on a list here. + +In `schema_version` 2, `export.formats` is the only declaration of which formats a +dataset exports. `convert.vortex` is v1-only: the schema and `validate_manifest` +reject it in a v2 manifest, while a released v2 catalog that still carries +`convert.vortex: false` (and no `export.formats`) keeps reading as Parquet-only. A +format is one file whichever writer makes it. The writer is the first *installed* one +in `export.priority`, looked up in the spec, then the catalog's `export_priority`, then +`RAINCLOUD_EXPORT_PRIORITY`, then the built-in `py, rs, java`. The spec and catalog +levels take a list, which applies to every format and so must name a writer for each +one the dataset exports, or a map from format to list (`{"parquet": ["rs", "py"]}`); +a format the map leaves out falls through to the next level. The machine level is a +list. The build record, and after regeneration the catalog, records the writer as +`_writer`. Sidecar cells (`parquet@rs`, `parquet@java`, `parquet@hardwood`, +`vortex@rs`, `vortex@jni`) run only where their binary is installed. Compliance +measures every writer in scratch, never over the dataset's file. + +`export.formats` lists the formats a dataset wants. When the planned writer cannot +produce one for the dataset -- it raises, dies, reports a failed round-trip, or exceeds +`RAINCLOUD_EXPORT_TIMEOUT` -- the previous file comes back and the build records the +failure in the build record as that format's `unavailable` measurement (writer cell, +error, toolchain versions, recipe, canonical sha, time), then carries on: the dataset is +built with the formats that worked, `[unavailable] /` is printed and repeated +in the summary, and the build exits 0. Never write a writer's limitation into +`export.notes`: docs regen carries the measurement into the snapshot +(`_unavailable`), the loader reports it (`describe`; `FormatUnavailable` quoting +it; `auto` skips it), a later successful export replaces it, and `compliance` prints +`[stale opt-out]` once a writer round-trips it. In-process writers run in a forked +child so the limits can stop them: `RAINCLOUD_EXPORT_TIMEOUT` and +`RAINCLOUD_EXPORT_MEMORY` (resident memory, default half of RAM), and the child raises +its own `oom_score_adj` so a machine that runs short loses the writer, not the build. +Run an unattended build as a systemd unit with `OOMPolicy=continue`: the default +`stop` ends the whole unit when the kernel kills one process in it. `export` without `--format` behaves like the build; +with a bare `--format vortex` it records the failure and exits 1, and a named cell's +failure (`--format vortex@rs`) exits 1 and records nothing. + +Every writer reads back what it writes before its file is promoted. An in-process +writer reads its file with the same format's in-process reader and compares it to the +canonical (`exporters.read_back`), streamed window by window (`compare.stream_equal`: +one batch of each side in memory, Parquet read batches sized by bytes), inside the +bounded child, so the time and memory limits cover the read too. A mismatch or a read +error (Vortex 0.86.1 writes a multi-batch VARIANT column it cannot read back) is a +failed round-trip, recorded as above; an in-process writer never reports +`roundtrip=None`, and a read-back that decides neither pass nor fail raises as a bug. A +sidecar verifies in its own process and may report `roundtrip: null` (a comparator gap, +or out of memory while verifying): that file is promoted, `[unverified] /` +is printed and repeated in the summary, the build record keeps `verified: false` and the +writer's note as `verify_note` (every other export records `verified: true`), docs +regen carries them into the snapshot (`_verified`, `_verify_note`), and +`describe` shows the file as UNVERIFIED with the reason. The read-back is one more full +read of every file a build writes: on stackoverflow-badges (51M rows, 479 MB canonical) +it adds 6.7 s to an 8.1 s Parquet write and 2.0 s to a 2.7 s Vortex write; a streamed +compare peaks at 2.9 GiB resident on code-contests' 4.3 GB Parquet (18.5 GiB decoded) +and 1.1 GiB on jsonbench's 22.5 GB Vortex file. + +A recorded failure is not repeated. Before a writer runs, `run_exporters` looks up the +measurement that applies (this install's build record at the recipe, else the catalog's +snapshot; `records.recorded_failure`). If it names the same writer cell with the same +toolchain (`writer_toolchain`, compared exactly: Python and library versions in +process, binary name and sha prefix for a sidecar) and, when it records one, the same +canonical sha, the format is skipped: `[skip] /: ...; pass --retry-errors to +try again`, nothing new recorded, the measurement kept. Anything different (an upgraded +`vortex-data`, another writer, a rebuilt canonical) is attempted with a `[retry]` line +naming the difference. A skip is not a new failure: `build` and `export` without +`--format` exit 0 and list it in the summary; `export --format ` and `convert` +asked for that file, so they exit 1. `--retry-errors` on `build`, `export` and `convert` +(`raincloud load --retry-errors`, `load(..., retry_errors=True)`, or the `retry_errors` +setting / `RAINCLOUD_RETRY_ERRORS`, which carries it to a child build) attempts it +anyway: a success replaces the measurement, a planned writer's failure records it again. +Compliance calls `run_bounded` directly and measures every write cell regardless, which +is how a stale opt-out is found. A write cell's `roundtrip` is the writer's own +read-back, including for an in-process file compliance finds on disk and does not +re-encode (`bounded.read_back_bounded`), and that read-back is also the in-process +writer's diagonal read cell (its own reader over its own file), not a second read. Only +a sidecar's `null` is filled from the read matrix's diagonal cell. + +## Editing `sources.json` + +Large hand-authored JSON with a fixed top-level key order (`schema_version`, +`generated_at`, `audit_cutoff`, `notes`, `datasets`). Edit structurally, never with `sed`: ```python import json from pathlib import Path -SRC = Path("sources.json") # run from the repo root, or use an absolute path +SRC = Path("sources.json") m = json.loads(SRC.read_text()) for d in m["datasets"]: if d["slug"] == "target-slug": @@ -136,31 +212,160 @@ for d in m["datasets"]: SRC.write_text(json.dumps(m, indent=2) + "\n") ``` -Don't use `sed` or text-based edits — JSON-safe structural edits are cheap and avoid accidental quoting breakage. +Run `validate_manifest` afterwards. Templates for common edits are in +[`templates/`](templates/). -## Rebuilding is expensive — confirm before triggering +## Data locations -Building a single large dataset can take hours (observed: JSONBench 100M ≈ 6 h; OSM Germany extract ≈ 45 min per element kind; Wikipedia Structured Contents → 34 GB parquet, multi-hour). The `outputs/v1//parquet/.parquet` + `vortex/.vortex` pair on disk already reflects a full catalog build — rebuilding wipes and redoes that work. Before running `python -m scripts.pipeline.build ` on anything non-trivial, confirm with the user. +The build and loader resolve their roots in this order: explicit argument, environment, +user config file, system config file, default. `raincloud config show` prints what is +in effect and where each value came from. A source checkout skips the system config +files (the user config and `RAINCLOUD_CONFIG` still apply), so a checkout builds into +its own `outputs/` rather than a machine's shared store. -Small (<100 MB) parquets are fine to rebuild without asking. - -## Regenerate derived docs after any pipeline change +| env var | controls | default | +|---|---|---| +| `RAINCLOUD_HOME` | when set, forces `/outputs` and `/_workdir` | checkout root, else the user data dir | +| `RAINCLOUD_OUTPUTS` | built-artifact root (`v{n}/` and `raw_downloads/` live directly under it) | `/outputs`; outside a checkout, the user data dir itself | +| `RAINCLOUD_RAW_DOWNLOADS` | cached raw upstream bytes | `$RAINCLOUD_OUTPUTS/raw_downloads` | +| `RAINCLOUD_WORKDIR` | scratch root holding `.recipes/` | `/_workdir`; outside a checkout, `/workdir` | +| `RAINCLOUD_MANIFEST` / `RAINCLOUD_SNAPSHOT` | a matched local catalog: `sources.json` and its snapshot | checkout copy, else the packaged copy | +| `RAINCLOUD_CATALOG` | which catalog: `auto`, `active`, `checkout`, `bundled`, `local` (the manifest `RAINCLOUD_MANIFEST` names), a revision or unique prefix, or a bundle/pack directory | `auto` | +| `RAINCLOUD_CATALOG_DIR` | installed catalog revisions | `/catalogs` | +| `RAINCLOUD_CATALOG_URL` | where `raincloud catalog update` looks when no `--source` is given | unset | +| `RAINCLOUD_CACHE` | optional separate artifact cache for the loader | same as the data root | +| `RAINCLOUD_MIRROR` | a private artifact store readers fall back to (`s3://` needs `[s3]`, `https://` needs `[http]`) | unset | +| `RAINCLOUD_OFFLINE` | `1`: read only local files; never contact the mirror | unset | +| `RAINCLOUD_RETRY_ERRORS` | `1`: a build attempts a format whose writer, with this toolchain, already failed at the recipe (as `--retry-errors`) | unset | +| `RAINCLOUD_CONFIG` / `RAINCLOUD_NO_CONFIG` | select or disable the config file | unset | +| `RAINCLOUD_SETTINGS` | settings JSON the CLI reads with `--settings-env`; how native readers pass options | unset | +| `RAINCLOUD_DUCKDB_MEMORY_LIMIT` | DuckDB memory ceiling, applied by `raincloud.duckdb_connect` | DuckDB default (~80% RAM) | +| `RAINCLOUD_DUCKDB_THREADS` | DuckDB thread count | DuckDB default | +| `RAINCLOUD_DUCKDB_TEMP_DIRECTORY` | DuckDB spill directory | DuckDB default | +| `RAINCLOUD_FETCH_DEADLINE` | wall-clock ceiling on one download | 6 h (`0` disables) | +| `RAINCLOUD_GENERATOR_TIMEOUT` | ceiling on a generator subprocess | 6 h (`0` disables) | +| `RAINCLOUD_MAX_TABLE_CELLS` | rows x columns a whole-table handler may materialize | 50,000,000 (`0` disables) | +| `RAINCLOUD_MAX_DECOMPRESSED_BYTES` | one in-memory decompression | 4 GiB (`0` disables) | +| `RAINCLOUD_ROW_GROUP_TARGET_ENCODED_BYTES` | Parquet row-group size, in encoded bytes (parquet@java counts compressed pages, so its groups come out larger) | 128 MiB | +| `RAINCLOUD_ROW_GROUP_MAX_ROWS` | row cap per group, used only when a spec omits `write.row_group_size_rows`; a spec's cap wins in every writer, sidecars included | 10,000,000 | +| `RAINCLOUD_ROW_GROUP_TARGET_BYTES` | memory guard: decoded Arrow bytes buffered for one row group | 512 MiB | +| `RAINCLOUD_ROW_GROUP_PROBE_ROWS` | rows the Python Parquet writer samples to size its groups (must be > 0) | 262,144 | +| `RAINCLOUD_BATCH_ROWS` / `RAINCLOUD_BATCH_BYTES` | batch bounds in the streaming ingestion paths (memory only, NOT the row-group size) | 4096 rows / 16 MiB | +| `RAINCLOUD_EXPORT_PRIORITY` | machine writer preference, e.g. `rs,py` | unset (`py, rs, java`) | +| `RAINCLOUD_EXPORT_TIMEOUT` | ceiling on one export: an in-process writer (run in a child process) or a sidecar writer; hitting it records the format unavailable | 6 h (`0` disables) | +| `RAINCLOUD_EXPORT_MEMORY` | ceiling on one in-process export's resident memory (bytes); the parent stops a writer over it and records the format unavailable | half of physical memory (`0` disables) | +| `RAINCLOUD_SIDECAR_TIMEOUT` | ceiling on one sidecar reader call (sidecar writers use `RAINCLOUD_EXPORT_TIMEOUT`) | 30 min (`0` disables) | +| `RAINCLOUD_TPCGEN_CLI` | path to the `tpcgen-cli` executable the tpcgen-rs TPC-DS generator runs | beside the Python executable, else `PATH` | + +Individual vars and explicit values win over `RAINCLOUD_HOME`. A malformed numeric value +is an error naming the variable, never a silent default. Loader handles and build +entry points freeze these for the duration of an operation. The seven `0 disables` +ceilings exist because builds are often left to run unattended: each bounds work that +is otherwise decided by an upstream file or an external process (a download, a +generator, a sidecar), and each can be lifted with `0` for a run that genuinely needs +it. + +Two directories are named `.recipes/`. `/.recipes///` +is one recipe's extract scratch, so a changed recipe never reuses another's +intermediates. `//.recipes//` holds raw bytes for a catalog +or fetch recipe other than the one that owns `//` itself. Skills and +playbooks that say `` mean the first. + +## Public loader API + +`load` / `load_dataset`, `slugs()`, `describe(slug)`, `reader_capabilities()`, +`Config` / `resolve_config`, and the exception hierarchy. Anything under a leading +underscore is not it — an example that reaches into `raincloud._catalog` teaches +that import to everyone who copies it, and usage is what makes a name public. + +## Confirm before rebuilding + +Large datasets take hours, and a rebuild wipes and redoes existing work. Ask the user +before running `raincloud.pipeline.build` on anything non-trivial. Parquets under ~100 MB +are fine to rebuild unprompted. + +## Regenerating derived docs ```bash -python -m scripts.pipeline.docs # datasets.md + handlers.md + snapshot.json +python -m raincloud.pipeline.docs # datasets.md + handlers.md + snapshot.json ``` -All three derived artefacts regenerate in one pass by default. Run this after any build, convert run, in-place parquet mutation, or when a handler is added/removed/renamed (handlers.md regenerates from the registry + manifest). +This is the only way the catalog changes: builds write the install's build record +(`/builds.json`), never the tracked snapshot, and regenerating takes each built +file's sha and writer from that record. In a checkout it writes the gitignored scratch +copies under `docs/`; promote them, then review and commit: -**Keep `docs/snapshot.json` fresh — it's load-bearing.** `datasets.md` regen reads from disk for slugs you've built locally and falls back to `docs/snapshot.json` (or `docs/v{schema_version}/snapshot.json` on a fresh clone) for everything else. Without that fallback, regenerating on a partial build would dash-out 200+ rows and silently destroy ground truth in the tracked snapshot. The default no-args invocation regens snapshot + datasets in lockstep, so it's only at risk if you do partial regens — `docs.py datasets` alone won't refresh the snapshot. After a build, prefer the no-args form. - -## Style and scope +```bash +python -m raincloud.pipeline.docs +cp docs/snapshot.json docs/datasets.md docs/handlers.md docs/v2/ +git diff docs/v2/ +``` -- **No Kaggle-era narrative.** The legacy triage / binary-blob-integration / Kaggle-filter history lives in `.archive/`. New README/AGENTS/SKILLS content should reflect only the current three-point intent: fetch → transform → outputs. -- **One handler per upstream shape.** Don't shoehorn a new shape into `tighten_types` or `identity`; write a dedicated handler under `scripts/pipeline/handlers/` and register it in `handlers/__init__.py`. -- **Handlers are short.** Most are under 150 lines. If a new handler balloons past that, look for reuse opportunities with existing helpers (`duckdb_connect`, `outputs_root`, `spec_field`). -- **No backwards-compat stubs.** When removing a handler or slug, remove it fully — git history (and the maintainer's local `.archive/`) is the fallback, not half-wired shims. +A machine's shared store is released from a commit with +`python -m raincloud.pipeline.publish --store DIR --catalogs DIR`. + +**The snapshot is load-bearing.** `datasets.md` regen reads from disk for locally built +slugs and falls back to the snapshot for everything else. A partial regen without that +fallback would dash out most rows and destroy ground truth. The no-args form regenerates +snapshot and datasets in lockstep — prefer it; `docs.py datasets` alone will not refresh +the snapshot. + +## Conventions + +- **One handler per upstream shape.** Don't stretch `tighten_types` or `identity` — add a + handler under `raincloud/pipeline/handlers/` and declare it in `HANDLERS` in + `raincloud/_registry.py` (see below). Read `docs/v2/handlers.md` first to pick + precedent and see which extras you'll need. +- **Handlers stay short.** Most are under 150 lines; reuse `open_canonical_writer`, + `duckdb_connect`, `workdir_root`, `spec_field` before growing one. +- **No backwards-compat stubs.** Remove a handler or slug fully; git history is the + fallback. +- **Handlers, exporters and generators are declared in `raincloud/_registry.py`**, + and nowhere else. The registries build from it (`handlers/__init__.py` only + resolves names lazily), and the capability list a catalog bundle records derives + from it, so adding one is a single edit. That module + imports nothing, which is what lets the loader answer "can this be built here?" + without pulling in the build toolchain. +- **Version numbers have one home each.** The release version is + `raincloud/__init__.py:__version__`. `pyproject.toml`, the Java client and the + C/C++ CMake build read it. Two files cannot and carry a literal: + `clients/rust/Cargo.toml` (Cargo requires one) and `CITATION.cff`. Bump them with + it; `tests/test_loader_package.py::test_version_mirrors_agree` fails on drift. The set of + artifact layouts is the `schema_version` enum in `sources.schema.json`, read by + Python at runtime; the native clients hold no copy, because the CLI resolves + layouts for them. Don't add a second copy, and don't give `schema_version` a + default — a wrong one silently selects another layout. +- **Upstream bytes are untrusted input.** Archive members get `_safe_target` + + `_claim` (no escape, no two members on one path); anything written under a final + name goes through an atomic temp-then-rename, so `[cached]` can mean "complete"; + and a row the pipeline drops gets counted and printed. Silence is the bug — a + short table looks exactly like a correct one. +- **Test the observable result**, not the mock. Use real small Arrow/Parquet files and + real build subprocesses; don't mock the resolver, serializer, checksum or builder that + the test exists to verify. Wheel and live-upstream tests are opt-in + (`--run-wheel`, `--run-network`). + +## Where things are + +- `raincloud/pipeline/` — the build stages and CLI entry points +- `raincloud/` — the importable loader; `clients/` — Rust, C/C++, Java readers + (`clients/README.md`). The native readers hold no catalog; they ask the `raincloud` + CLI, so there is nothing of the catalog to keep in step there. +- `sidecars/` — reference writers/readers behind the sidecar cells, a PATH-discovered CLI + contract. The JVM lanes are a Gradle composite build over a git submodule; a fresh + clone needs `git submodule update --init`. +- `raincloud.pipeline.compliance` — maintainer-run measurement of the + `(slug × format × impl)` matrix. Never gates a build; absent toolchains `skip`. + `--check-oracle` runs the additive-only gate: a cell may be added, never removed or + mutated. Re-measure the committed oracle whenever the toolchain pins move; until + then the gate reports every cell the new toolchain changed as a mutation. See + `sidecars/README.md`. +- `.agents/skills/` — invokable skills wrapping the pipeline entry points. + `.claude → .agents` is a symlink. `.agents/settings.json` is a tracked read-only + command allow-list; machine overrides go in the gitignored `settings.local.json`. ## When you're unsure -Prefer *Read* → *Grep* → ask, over guessing. The pipeline has hidden contracts (streaming handlers returning `[]`, raw_downloads being unversioned, VARIANT requiring storage_compatibility_version) that aren't obvious from any single file. +Read, then grep, then ask — don't guess. The pipeline has contracts that aren't visible +from any single file: streaming handlers returning `[]`, `raw_downloads` being +unversioned, VARIANT requiring the DuckDB compatibility setting. diff --git a/CHANGELOG.md b/CHANGELOG.md index 26399d2..96e3302 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,360 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.3.0] - Unreleased + +A breaking release: the pipeline's entry points, the default data locations and +the artifact layout all move. Read **Changed** before upgrading. This release is +verified on Linux x86-64; the macOS and Windows base-wheel CI lanes are defined +but have not yet run. + +### Added + +- **Canonical Arrow IPC spine.** Every build writes + `outputs/v2//arrow/.arrow.zstd` (zstd-compressed Arrow IPC), the + format-neutral intermediate that every writer exports from and every + conformance check compares against. +- **Several writers per format.** Parquet: `parquet@py` (pyarrow), `parquet@rs` + (arrow-rs), `parquet@java` (Apache parquet-java through the Hadoop-free + [`parquet-arrow-java`](https://github.com/mprammer/parquet-arrow-java) 0.2.0 + bridge, a Git submodule) and `parquet@hardwood` (Hardwood 1.1.0.Beta1 from Maven + Central). Vortex: `vortex@py`, `vortex@rs` and `vortex@jni`. Each lane also + reads its format. The Rust (`sidecars/rust/`) and JVM (`sidecars/java/`) lanes + are PATH-discovered CLIs that skip with a note when their toolchain is absent, + so a pure-Python machine still builds. A dataset still has one file per format, + `/.`; the writer that made it is recorded beside its sha256 + (`parquet_writer`, `vortex_writer`, shown by `describe`) as provenance. + `export.formats` names a dataset's formats (`["parquet", "vortex"]`) and + `export.priority` (or the catalog-level `export_priority`) states the writer + preference, optionally per format (`{"parquet": ["rs", "py"]}`): the first + installed writer runs. The built-in order is Python first, so by default a + dataset's bytes do not depend on which sidecars a machine has; the SF100 + TPC-H/TPC-DS tables prefer `parquet@rs`. `python -m raincloud.pipeline.export + --format parquet@rs` overrides the writer for one run. +- **Every writer reads back what it writes.** Each written file is read with the + same format's reader and compared to the canonical, streamed window by window, + before it is published. The read-back costs one more full read (on + stackoverflow-badges, 51M rows: 6.7 s on an 8.1 s Parquet write, 2.0 s on a + 2.7 s Vortex write). A sidecar that cannot measure its round-trip (for example + the JVM running out of memory while verifying) reports `roundtrip: null`: the + file is kept, the build prints `[unverified] /` with the reason, + and `describe` shows the format as UNVERIFIED. +- **Measured format opt-outs.** A writer that cannot make a format no longer + fails the build. When it raises, crashes, writes a file that does not read + back, or exceeds `RAINCLOUD_EXPORT_TIMEOUT` (default 6 h) or + `RAINCLOUD_EXPORT_MEMORY` (default half of physical memory), the previous + file is kept and the failure is recorded as that format's `unavailable` + measurement (writer, error, toolchain versions, recipe, time). The dataset is + built with the formats that worked, and `[unavailable]` lines name the rest. + A recorded failure is skipped (`[skip]`) while the writer, its toolchain + versions and the canonical are unchanged, and retried (`[retry]`) when any of + them changes; `--retry-errors` (also `raincloud load --retry-errors`, + `load(..., retry_errors=True)`, `RAINCLOUD_RETRY_ERRORS`) retries anyway. The + measurement is shown by `describe`, `datasets.md`, `list_datasets + --no-vortex`, `status` and `browse`; `load(format=...)` raises + `FormatUnavailable` quoting it (`.measurement`), and `auto` skips it. + In-process writers run in a child process, so a looping, crashing or + ballooning writer is stopped and recorded instead of taking the build down. + This replaces 0.2.1's prose `vortex_skip_reason` opt-outs: + jsonbench-bluesky-100m, wikipedia-structured-contents and code-contests ask + for Vortex again. +- **VARIANT in Parquet.** `parquet@rs`, `parquet@java` and `parquet@hardwood` + write and read Parquet's VARIANT logical type; `parquet@py` (pyarrow cannot + write it) and the Vortex writers store the column as its storage struct. The + `variant_faithful` compliance field records which did. A VARIANT column's + `metadata` (and an unshredded `value`) is declared non-nullable, as the + Parquet VARIANT spec and the Arrow extension require, and a present VARIANT + lacking one fails the build naming the column and rows. +- **Cross-implementation conformance harness** (`python -m + raincloud.pipeline.compliance`, a maintainer step that never gates a client + build). It measures the `(slug × format × implementation)` matrix: each + enabled writer exports each slug, every reader of that format reads the + result, and each cell gets a `pass`/`fail`/`skip`/`na` verdict against the + canonical. `--write-ledger` records the results in the additive-only ledger + `docs/v2/compliance.json`; `--check-oracle` fails when a cell deviates from + it or disappears. A writer that round-trips a format the catalog records as + unavailable is reported as `[stale opt-out]`. See + [Compliance baseline](#compliance-baseline). +- **Build record.** What a build made goes in that install's + `/builds.json` (sha256, bytes, writer and recipe per file, updated + under a lock so concurrent builds keep each other's entries). The loader + serves such a file for that install while the dataset's recipe is unchanged, + and says so when it was built from an earlier one. A rebuilt canonical + supersedes the entries of exports made from the old one. +- **The `raincloud` command.** `build`, `list`, `browse`, `load`, `describe`, + `config`, `capabilities`, `catalog` and more, printing readable text + (`--json` for JSON). An unknown dataset or format name fails with a + did-you-mean; bare `describe`/`load`/`build`/`catalog pin` show help; + `describe` says which formats are prepared on this machine and how to get the + others; `raincloud list` prints bare slugs when piped and has a `--local` + filter. `raincloud config show` prints each setting and where it came from. +- **Native readers for Rust, C, C++ and Java.** Each exposes lazy + prepared-data handles and native Arrow batch readers. They hand catalog + selection, resolution, downloads and verification to the `raincloud` CLI + (`describe`, `load --json`, settings passed in the environment) and decode + only the file it names, so they need the Python package installed. They are + built from source; C/C++ install a relocatable CMake package and Java a + runtime distribution. Inputs are checked before any download (an empty, + NUL-containing or `-`-leading format is `INVALID_ARGUMENT`), and the C ABI + version rule is "additive, check `>=`" (see `clients/README.md`). +- **Versioned catalogs.** Catalog bundles support explicit `raincloud catalog + update`, `pin`, `rollback` and `gc`, with matched hashes, compatibility checks + and recipe provenance. Reads hold their selected revision, and `gc` never + removes a revision a running build or the settings still use. +- **`publish --store DIR --catalogs DIR`** places verified artifacts in a + machine's shared content store (one hard-linked copy each) and releases the + catalog by rewriting the pack directory's `latest.json`; it refuses, before + placing anything, a catalog naming anything the store lacks. A catalog + setting may name a pack directory, so readers follow a release with no config + edit. The redistribution gates apply to `--mirror` only. +- **185 new datasets; the catalog grows from 250 to 435.** Generated benchmark + tables: all TPC-H tables from DuckDB and tpcgen-rs at SF1, plus Rust + SF10/SF100; TPC-DS SF1 from DuckDB and the Rust C/Trino modes, plus Rust C + SF10/SF100. A generator is an upstream with an explicit + generator/version/parameter identity, an atomic multi-file cache, checksums, + and deliberate refresh with drift reporting; they need the new `[generated]` + extra. Also the 21 IMDb/JOB and 9 Appian benchmark tables, + with pinned source checksums; a downloaded DuckDB database is opened + read-only and exposes one table per batch stream. +- **`raincloud.duckdb_connect()`** is public API and the one way raincloud + code, tests and examples open DuckDB: it applies the `RAINCLOUD_DUCKDB_*` + limits and `storage_compatibility_version=v1.5.0`. It was + `scripts.pipeline.spec.duckdb_connect`; the `[duckdb]` extra (included in + `[build]`) installs DuckDB for it, and a missing DuckDB raises + `MissingDependency`. +- **`browse` `self-rt` column**: per-lane writer self-roundtrip, with a rollup + subtitle. +- **`list_datasets --stale-version`** lists slugs whose recorded artifacts + predate the current `schema_version`. `--long` gains a `recorded` column + (`v2` current, `v1!` superseded, `·` unknown) and `--json` carries + `built_version` / `stale_version`. + +### Changed + +- **Breaking: the build pipeline moved into the package.** `scripts/pipeline/` + is now `raincloud/pipeline/`, so every `python -m scripts.pipeline.` + command becomes `python -m raincloud.pipeline.` (`build`, `fetch`, + `extract`, `publish`, `docs`, `list_datasets`, `status`, ...). The installed + `raincloud` command also covers the common ones: `raincloud build`, + `raincloud list`, `raincloud browse`. There is no shim: update cron jobs, CI + steps and scripts that call the old module paths. +- **Breaking: default locations outside a source checkout moved.** 0.2.x put + builds, scratch and the loader cache under `~/.cache/raincloud` (`outputs/`, + `_workdir/`). 0.3.0 uses the platform's user directories. The data directory + is the user data dir itself (`~/.local/share/raincloud` on Linux), holding + `v{n}/` and `raw_downloads/`; scratch is `/workdir` + (`~/.cache/raincloud/workdir`); the loader's cache defaults to the data + directory; installed catalogs live in `/catalogs`; and the optional + config file is `/config.toml` (`~/.config/raincloud/config.toml`). + Nothing is moved or migrated, and 0.3.0 does not serve the v1 artifacts a + 0.2.x install built. To reuse a 0.2.x store's raw downloads, point 0.3.0 at + it: `RAINCLOUD_HOME=~/.cache/raincloud` (which selects its `outputs/` and + `_workdir/`), or `data_dir = "~/.cache/raincloud/outputs"` in the config file. + A source checkout still uses its own `outputs/` and `_workdir/`, and skips the + system config files so it never builds into a machine's shared store. +- **Breaking: `schema_version = 2`.** Builds target `outputs/v2/` + `docs/v2/`, + and the loader, `publish` and `docs` derive the version from the snapshot they + read, so `raincloud.load()` looks under `outputs/v2/`. `docs/v1/` + + `outputs/v1/` are the frozen 0.2.x catalog: never rebuilt or wiped and not + served by the loader. `docs`, `list_datasets` and `browse` read only the + current version's snapshot; a checkout still shows `docs/v1/profiles/` for a + slug with no v2 profile. Raw downloads stay shared across versions. In a v2 + manifest `export.formats` is the only declaration of a dataset's formats; + `convert.vortex` / `vortex_skip_reason` are schema_version 1 only and fail v2 + validation. `overnight_profile`'s disk-hygiene wipe skips a version that has + a newer sibling on disk (`wipe-skipped-frozen`). +- **Reads no longer build by default.** A dataset that is not prepared locally + or in the mirror raises `ArtifactNotFound`, naming the command that prepares + it. Build with `raincloud build `, or opt in with Python + `load(..., build=True)` / `raincloud load --build`. `auto` selects a + supported advertised representation; explicit requests never substitute + another format. +- **The catalog is the authority on what an artifact is.** Its sha256 and byte + size name each file; bytes are checked once, as they enter a store (a mirror + download, a `publish --store`), and a local file at its key with the catalog's + size is the artifact. Mirror bytes that do not match are refused with + `ChecksumMismatch` instead of warned about and adopted. The catalog + (`sources.json` + `docs/v{n}/snapshot.json` in git, released as fixed + bundles) changes only when a maintainer regenerates it: `python -m + raincloud.pipeline.docs` takes each built file's sha and writer from the + build record, and the result is reviewed and committed. No build changes it. + Gone with the model this replaces: `.pin` provenance sidecars, warn-and-adopt, + and `strict_checksum` / `RAINCLOUD_STRICT_CHECKSUM`. +- **`Dataset.scan()` is replaced by `Dataset.dataset()`**, a lazy pyarrow + Dataset of the format you loaded that DuckDB, Polars and pyarrow all scan + with pushdown (`duckdb.sql("select ... from d")`). `scan()` bound raincloud to + DuckDB and silently switched every Vortex load to its Parquet sibling. The + loader no longer imports DuckDB; the `[duckdb]` extra now backs + `raincloud.duckdb_connect()`. A Parquet VARIANT column arrives as its + shredded struct; `duckdb.read_parquet(str(ds.path()))` decodes it natively. +- **Hydrated data is a dataset of its own.** `-hydrated` derives from + its parent (`derive: {from, hydrate: {columns: {url: {into, type}}}}`, plus an + `advisory`): the build reads the parent's canonical Arrow, fetches the listed + URL columns, and exports it like any dataset, so `raincloud.load()` reads it, + with a `HydratedDatasetWarning` naming the parent every time. `raincloud + list` marks it `[hydrated]` on a terminal, and `--all` never builds it. Its + recipe folds in the parent's, and editing the hydration does not change the + parent's. The `parquet-hydrated`/`vortex-hydrated` companion tier is gone; + provenance is `__provenance` per fetched column. `hydrate` options that + change what is fetched (`--limit`, `--block`, `--urlhaus`, a non-default + `--max-bytes` or `--timeout`, or the unsafe bypass) write an unpublished + sample under `//sample/`; a blocklist meant for the + published dataset goes in `derive.hydrate.blocked_hosts_extra`. +- **Layered extras.** Vortex is no longer a base dependency: the base wheel + reads Arrow IPC and Parquet, and `auto` picks Vortex only where a Vortex + reader is installed (`[vortex]`). `[build]` is the pipeline core (DuckDB, + zstandard, jsonschema, Vortex). Each handler's format-specific dependency is + its own extra (`osm`, `sas`, `excel`, `archives`), imported only when that + handler runs; acquisition has `generated`, `kaggle` and `huggingface`. + `[all]` still installs everything. A build that lacks an extra fails in about + a second, before fetching, naming it; a missing DuckDB tpch/tpcds extension + prints the `INSTALL` command. +- **Vortex 0.86.1 in every lane** (0.2.1 used `vortex-data` 0.69): `vortex-data` + (PyPI), `vortex` (crates.io) and `dev.vortex:vortex-jni` (Maven) move together, + so a differing conformance verdict is an implementation difference and never + a version difference. The published line adds the **map** datatype. The Rust + reader and sidecars use Arrow/Parquet 59.2, and the native reader requires + Rust 1.95 or newer. +- **Parquet row groups are sized by bytes.** 0.2.1 wrote 1,048,576-row groups + (`write.row_group_size_rows`). Every Parquet writer now targets 128 MiB + encoded (`RAINCLOUD_ROW_GROUP_TARGET_ENCODED_BYTES`) under a 512 MiB decoded + ceiling (`RAINCLOUD_ROW_GROUP_TARGET_BYTES`), with the spec's + `write.row_group_size_rows` as a row cap (10,000,000 across the catalog, + including the three GloVe slugs, which asked for 50,000; sidecars receive it + as `RAINCLOUD_ROW_GROUP_MAX_ROWS`). All Parquet writers cut one recipe's row + groups at the same planned rows. `parquet@java` counts closed pages at their + compressed size, so its groups come out larger for the same setting. + stackoverflow-badges (51M rows) is written as 10 row groups. + All Parquet artifacts change bytes and checksums. +- Multi-file Parquet inputs are ingested as serial batch streams with one type + plan across the whole input. Batch producers close on early exit and reject + inputs changed after planning. +- **Every stage command selects datasets the same way.** `raincloud build`, + `export`, `convert`, `compliance`, `hydrate`, `fetch`, `extract`, + `generate` and `publish` refuse an unknown slug before doing any work (exit + 2, with a did-you-mean), and `--all` skips hydrated datasets with a note. A + bare `fetch` no longer downloads the whole catalog; `--help` works + everywhere. `fetch`, `extract` and `generate` refuse a derived dataset by + name; `fetch --verify` re-checks cached downloads. `publish` refuses an + `http(s)` mirror, which is read-only, before planning, and refuses a named + slug with nothing built (exit 1) instead of skipping it. `convert` exits 1 + for a named slug it cannot convert. +- **Numeric `RAINCLOUD_*` settings are checked.** A malformed value such as + `8GiB` or `-1` is an error naming the variable. Python, the Rust sidecars and + the Java sidecars share one grammar: a plain ASCII number, no sign, + underscores or non-ASCII digits. `build`, `export` and `compliance` check + every knob at startup. +- **Reads fail with a typed error.** An unknown column raises `UnknownColumn`, + an unreadable mirror `MirrorUnavailable` (distinct from `ArtifactNotFound`, + a mirror that answered "no such file"), a present file that cannot be + decoded `CorruptArtifact`, and a type the reader cannot represent + `UnsupportedType`; all are `RaincloudError`s. +- **Published stats are redacted.** Snapshot column stats and profile top + values redact URL credentials, signed-URL and token query parameters, + `file://` and `:`-joined paths, `/tmp`, `/var/folders`, `/mnt`, `/opt` and + every configured data root. +- **`profile`**: a named slug with no Parquet exits 1; a profile of a Parquet + replaced mid-run is discarded; failed re-profiles and profiles of another + schema_version are never promoted. `status` marks a Parquet older than its + canonical as stale. `autotag` runs only with the checkout's catalog + selected, the one whose `sources.json` it rewrites. +- `load(build=True)` and `raincloud load --build` log to stderr, so the path is + the only thing on stdout. + +### Removed + +- **`python -m scripts.pipeline.*`**: see the entry-point move under Changed. +- **`fetch.verify_tls`.** A recipe could set it to `false` to skip TLS + certificate verification for its downloads. No dataset in the catalog used it, + and catalogs are shareable bundles, so the recipe asking to weaken transport + security need not be the operator's own. A spec still carrying the field is + refused by the manifest schema and by `fetch`. Pin payload integrity with + `fetch.expected_sha256`. +- **`tighten_variant` and `_enrich_public_bi`.** The first was an in-place v1 + pass (promote JSON to VARIANT in the transform recipe and rebuild instead); + `status` loses its `variant` column with it. The second was a one-shot + enricher nothing referenced. +- **`write.output` and `write.page_index`** (v2): no writer read them; a v2 + manifest carrying them fails validation. +- **`extract.type: "custom"`, `"tar.gz"` and `"tgz"`.** The first imported a + module that never existed; `tar` handles `.tar.gz` and `.tgz`. +- **`parse.options.strict`**: CSV parsing is always strict (see Fixed). + +### Fixed + +- **The JSONBench and CIA Factbook VARIANT columns hold parsed JSON.** Their + handlers cast text straight to VARIANT, which DuckDB stores as a VARCHAR + variant, so every record was one string. They now cast through JSON; both + datasets must be rebuilt, and their checksums change. +- **Upstream records are never dropped.** The Bluesky dumps wrap 16 records + longer than 65,535 bytes onto two lines (32 lines, in 9 of the 100 files), + which were stored as two events each. JSONBench now rejoins them: + `jsonbench-bluesky-100m` has 99,999,984 records, and any other line that is + not a JSON object fails the build, naming the file, line and byte length. + Generic CSV parsing is strict: a row whose field count differs from the header + fails the build, naming the file and row, where it was skipped, and + `public_bi_merge` does the same per partition. `uci-thyroid-disease` now + includes allbp.test, which its handler ignored (3,772 rows), and `uci-diabetes` + keeps the 66 records with an empty first or last field (29,330 rows). The + openlibrary, GloVe (a token with spaces is kept whole), California housing, + GHCN-Daily, Stack Exchange, lichess, HAR, seeds and JSONL handlers and the + archive extractors fail instead of skipping, nulling or zeroing a value, and + decode strict UTF-8 or ASCII. Lichess games gain `white_title` and + `black_title`; HAR features are float64, which the source's eight significant + digits need. +- **No upstream value is lost to a type.** `uci-diabetes` stores `value` as + float64, keeping the 61 fractional insulin doses (`4.5`, ...) that became + null, plus `value_raw` with each record's exact upstream text (meter flags + `0Hi`/`0Lo`, `3A`, zero padding). `uci-online-retail-ii` columns are typed + from their cells instead of forced to text: `xlsx_parse` infers each + column's narrowest faithful type across every sheet, without pandas, and + fails the build on a mix no single type holds, formula cells, gaps between + data rows, or headers that differ between sheets. +- **Downloads are complete or absent.** A short HTTP body is retried and never + cached; `RAINCLOUD_FETCH_DEADLINE` covers all attempts and catches a slow + drip; a download that disagrees with its declared size or sha256 is deleted. + Public BI fetches use the same path, and a Public BI schema is skipped only + on HTTP 404; any other fetch error fails the build. +- **A cached Kaggle download builds without Kaggle credentials.** The fetcher + authenticated before checking the cache, so rebuilding a dataset whose raw + bytes were already on disk failed on a machine with no Kaggle token. +- **Errors are no longer swallowed.** A corrupt snapshot, cache marker or + profile reports the file instead of reading as empty, and the overnight wipe + refuses when it cannot list the version directories. +- **Non-finite snapshot stats are written as null** instead of `Infinity`, which + is not JSON. +- **Snapshot min/max are unknown when any row group lacks statistics**, rather + than the extremes of the groups that have them. +- **The Iris description no longer carries its donor's email address.** The + attribution stays; the address, copied verbatim from the UCI page, is gone + from the manifest and the generated dataset tables. + +### Compliance baseline + +The committed oracle in `docs/v2/compliance.json` was measured on 2026-09-26 against +the shipped toolchain (Vortex 0.86.1, pyarrow 24.0.0, Python 3.11, Hardwood +1.1.0.Beta1 from Maven Central) over the 126 datasets whose canonical Arrow is built +on the measuring machine, re-encoding every cell. Every registered writer ran -- +`parquet@py`, `parquet@rs`, `parquet@java`, `parquet@hardwood`, `vortex@py`, +`vortex@rs`, `vortex@jni` -- and every registered reader read each artifact of its +format: 3,129 reads pass and 17 fail (3,021 cells are a reader of the other +format); 881 of 882 write cells round-trip. + +Every failure is one of Hardwood 1.1.0.Beta1's two upstream reader bugs, measured, +not worked around: + +- A page header whose statistics exceed 1 KiB ("Malformed Parquet metadata", + fixed upstream in #1104, unreleased): 14 reads of pyarrow-written files with + long strings. +- Automatic batch sizing that counts a binary value as 16 bytes, which asks for an + array past the JVM's limit on `peoples-speech-clean-validation` (2.46 GB of + audio): its 3 reads and the Hardwood writer's self-verify. + +`countries-of-the-world`, the one VARIANT dataset in scope, round-trips in every +cell. `parquet@rs`, `parquet@java` and `parquet@hardwood` keep it as a Parquet +VARIANT (`variant_faithful: true`); pyarrow cannot write that logical type, and the +three Vortex writers store the shredded struct, so theirs are `false`. + ## [0.2.1] - 2026-06-11 ### Added @@ -527,6 +881,8 @@ This release bundles: this repository" button in the repo sidebar with BibTeX / APA / Chicago exports. +[0.3.0]: https://github.com/spiraldb/raincloud/releases/tag/v0.3.0 +[0.2.1]: https://github.com/spiraldb/raincloud/releases/tag/v0.2.1 [0.2.0]: https://github.com/spiraldb/raincloud/releases/tag/v0.2.0 [0.1.5]: https://github.com/spiraldb/raincloud/releases/tag/v0.1.5 [0.1.4]: https://github.com/spiraldb/raincloud/releases/tag/v0.1.4 diff --git a/CITATION.cff b/CITATION.cff index 8f3be98..24b5aa9 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -7,8 +7,8 @@ abstract: >- transform, validate, and convert behaviour, supporting verifiable provenance and consistent re-derivation of dataset artefacts across users and machines. type: software -version: 0.1.1 -date-released: 2026-05-07 +version: 0.3.0 +# date-released: set to the tag date when the release is cut, matching CHANGELOG.md. url: "https://github.com/spiraldb/raincloud" repository-code: "https://github.com/spiraldb/raincloud" license: Apache-2.0 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 6b1ba66..a55292d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,40 +8,51 @@ pipeline itself, see [`README.md`](README.md), [`AGENTS.md`](AGENTS.md), and ## Setting up ```bash -git clone git@github.com:spiraldb/raincloud.git +git clone --recurse-submodules https://github.com/spiraldb/raincloud.git cd raincloud -uv sync --extra dev --inexact +uv sync --extra dev --extra all --inexact ``` -`--extra dev` pulls in `pytest`. The base install is the lightweight loader -(`pyarrow`, `numpy`, `vortex-data`, `fsspec`); the heavy build toolchain -(duckdb, pandas, osmium, pyreadstat, openpyxl, …) now lives behind the `build` -extra, so **add `--extra build` when working on the pipeline or handlers** — -otherwise the build stages fail on a missing import. Add `--extra kaggle` or -`--extra huggingface` if your work touches those upstream types, or `--extra -all` for everything. Always pass `--inexact` — without it, each `uv sync ---extra X` removes the extras from the previous one (e.g. syncing `--extra dev` -after `--extra huggingface` uninstalls `huggingface_hub`). +The submodule (`sidecars/java/parquet-arrow-java`) is needed only for JVM +sidecar work; in a clone made without it, run `git submodule update --init +--recursive`. + +`--extra dev` pulls in `pytest`; `--extra all` installs every optional part. The +base install is the lightweight loader (`pyarrow`, `numpy`, `fsspec`, +`platformdirs`). The pipeline core (duckdb, zstandard, jsonschema, Vortex) is the +`build` extra, and each handler's format-specific dependency is its own extra, +imported only when that handler runs: `osm` (osmium), `sas` (pyreadstat), `excel` +(openpyxl, pandas), `archives` (py7zr, unlzw3). A build that needs one you lack +says which to install. `generated` covers the TPC-H/TPC-DS generators +(tpchgen-cli and a pinned DuckDB), and `kaggle` and `huggingface` cover those +upstreams. Always pass `--inexact` — without it, each `uv sync --extra X` removes +the extras from the previous one (e.g. syncing `--extra dev` after +`--extra huggingface` uninstalls `huggingface_hub`). ## Before you open a PR -Three sub-second checks are the minimum gate (CI runs all three): +Three checks are the minimum gate (CI runs all three): ```bash -ruff check # lint (pyflakes + pycodestyle + isort) -python -m scripts.pipeline.validate_manifest # JSON Schema + cross-checks on sources.json -pytest # smoke regression net (manifest, schema, registry, examples, loader) +ruff check # lint (pyflakes + pycodestyle + isort); seconds +python -m raincloud.pipeline.validate_manifest # JSON Schema + cross-checks on sources.json; seconds +pytest # the hermetic suite; minutes, needs --extra dev --extra all ``` -`pytest` now also covers the `raincloud` loader package (catalog resolution, -cache/mirror/build dispatch, sha256 integrity) alongside the manifest checks. +`pytest` covers the manifest, schema and registry, the `raincloud` loader +(catalog resolution, cache/mirror dispatch, sha256 integrity), the examples, and +real small builds run in temporary directories. CI's hermetic lane syncs +`--extra dev --extra tui --extra build --extra pandas --extra osm --extra sas +--extra excel --extra archives`; `--extra all` adds the acquisition extras and pins DuckDB to the +`generated` extra's exact version, so a local run with it can differ from that lane. After a manifest-only edit, +`pytest tests/test_manifest.py` is the fast subset. If you touched the build pipeline, install the build extra and run a small end-to-end build to make sure it still produces the expected output: ```bash uv sync --extra build --inexact -python -m scripts.pipeline.build countries-of-the-world # ~200 ms, 227 rows +python -m raincloud.pipeline.build countries-of-the-world # ~200 ms, 262 rows ``` For larger builds, see [`SKILLS.md`](SKILLS.md#running-a-large-build-safely). @@ -50,15 +61,17 @@ For larger builds, see [`SKILLS.md`](SKILLS.md#running-a-large-build-safely). - **New datasets** — see [`SKILLS.md`](SKILLS.md#adding-a-new-dataset). Most entries copy [`templates/minimal_spec.json`](templates/minimal_spec.json) and - pick an existing handler from [`docs/v1/handlers.md`](docs/v1/handlers.md). + pick an existing handler from [`docs/v2/handlers.md`](docs/v2/handlers.md). - **New transform handlers** — see [`SKILLS.md`](SKILLS.md#adding-a-new-transform-handler). One handler per - upstream shape; register in `scripts/pipeline/handlers/__init__.py`. + upstream shape; declare it in `HANDLERS` in `raincloud/_registry.py`, the + only registration. - **Bug fixes** — start with a failing test where practical. -- **Documentation** — README/AGENTS/SKILLS edits welcome. The two derived docs - (`docs/datasets.md`, `docs/handlers.md`) are machine-generated; don't - hand-edit them — fix the manifest or the registry and regenerate via - `python -m scripts.pipeline.docs`. +- **Documentation** — README/AGENTS/SKILLS edits welcome. The derived docs + (`docs/v2/datasets.md`, `docs/v2/handlers.md`, `docs/v2/snapshot.json`) are + machine-generated; don't hand-edit them — fix the manifest or the registry, + regenerate via `python -m raincloud.pipeline.docs`, and promote the result + (see [`AGENTS.md`](AGENTS.md#regenerating-derived-docs)). ## Tests for new functionality @@ -99,9 +112,10 @@ For security-related issues, do **not** open a public issue — see comment-light Python with explicit names over abstractions. - No backwards-compat stubs or shims when removing handlers/slugs — git history is the fallback. -- Always go through `scripts.pipeline.spec.duckdb_connect` for DuckDB - connections so resource limits and `storage_compatibility_version=v1.5.0` - apply (see [`AGENTS.md`](AGENTS.md#invariants-dont-break-these)). +- Raincloud code, tests and examples always go through `raincloud.duckdb_connect` + for DuckDB connections so resource limits and + `storage_compatibility_version=v1.5.0` apply (see + [`AGENTS.md`](AGENTS.md#invariants)). ## License diff --git a/DISCLAIMER.md b/DISCLAIMER.md index b9797e6..464b090 100644 --- a/DISCLAIMER.md +++ b/DISCLAIMER.md @@ -14,8 +14,10 @@ those resources without notice: - **Link rot** — the URL stops resolving or moves. - **Content drift** — the bytes behind a URL change, sometimes silently. - `expect.rows` and `expect.sha256` catch many cases at validate time, but - not all (and `--loose` explicitly relaxes them). + `fetch.expected_sha256` (where a spec pins it) catches a changed payload at + fetch time, and `expect.rows` catches many other cases at validate time, but + not all — and by default a row-count drift is a warning, not a build failure + (pass `--strict` to make it fatal). - **Supply-chain compromise** — an upstream could be attacked and serve swapped-in content. We have no way to detect this in advance. @@ -34,7 +36,7 @@ maintained by the upstream parties, not by us. Some entries are broad-web crawls (FineWeb, Common-Crawl-derived corpora, and similar). We mark such entries with a `license.scrape_advisory` field and surface them with a ⚠ glyph in -[`docs/v1/datasets.md`](docs/v1/datasets.md) because we view them as +[`docs/v2/datasets.md`](docs/v2/datasets.md) because we view them as elevated-risk for unaudited or low-provenance content. The honest reality is broader: **any** fetched file may contain questionable or offensive material — upstream providers do their own quality and @@ -72,19 +74,23 @@ For security vulnerabilities specifically, use the channel in ## User responsibility -Running `python -m scripts.pipeline.fetch ` (or `build`, which calls +Running `python -m raincloud.pipeline.fetch ` (or `build`, which calls fetch) makes HTTP requests against the URLs in `sources.json` and writes the returned bytes to local disk. That decision rests with the user. We have mitigated what we reasonably can: -- HTTPS-only delivery for HTTP fetches. -- Optional content-hash verification (`expect.sha256`) and row-count - validation (`expect.rows`), enforced unless the user passes `--loose`. +- TLS certificate verification on every HTTPS fetch; no recipe can turn it + off. Some upstreams are served over plain `http://`, and those fetches have + no transport security at all; the catalog names each URL as its publisher + serves it. +- Optional content-hash verification (`fetch.expected_sha256`) and row-count + validation (`expect.rows`). Row-count drift is reported as a warning by + default and becomes a hard failure under `--strict`. - A two-flag bypass on the optional hydrate stage so a single accidentally-typed flag can't open the safety filter — see [`HYDRATING.md`](HYDRATING.md). -- Static manifest validation (`scripts.pipeline.validate_manifest`) that +- Static manifest validation (`raincloud.pipeline.validate_manifest`) that runs in CI on every change to `sources.json`. We cannot guarantee against a future supply-chain attack on any of the diff --git a/HYDRATING.md b/HYDRATING.md index b3700da..38d7744 100644 --- a/HYDRATING.md +++ b/HYDRATING.md @@ -1,28 +1,34 @@ # Hydration policy -The optional **hydrate stage** (`python -m scripts.pipeline.hydrate `) dereferences URL columns from slugs marked with a `hydrate` block in `sources.json`, writing a sibling parquet at `outputs/v{n}//parquet-hydrated/.parquet`. When the slug also has `convert.vortex: true`, the same run produces `outputs/v{n}//vortex-hydrated/.vortex`. +A **hydrated dataset** is a parent dataset with some of its URL columns fetched from the open web. It is its own catalog entry, named `-hydrated`, declared with a `derive` block (`from` the parent, which columns to fetch `into` what) and an `advisory`. Building it reads the parent's canonical Arrow, fetches every URL through the filter below, and writes the result like any other dataset — canonical Arrow plus Parquet/Vortex exports — so `raincloud.load("laion-400m-hydrated")` works. It warns every time, because you probably want the parent. -This document is hand-maintained. The list of currently-marked candidates is queryable via the TUI (`python -m scripts.pipeline.browse` — sort by the `hydrate` column) or `python -m scripts.pipeline.list_datasets --hydrate --long`. +Hydrated datasets are never built unless named: `raincloud build -hydrated` uses the safe defaults, and `python -m raincloud.pipeline.hydrate -hydrated` takes the options below (`hydrate ` names the same dataset). Options that change what is fetched — `--limit`, `--block`, `--urlhaus`, a non-default `--max-bytes` or `--timeout`, or the bypass — make the run a **sample**: its table is written to `//sample/.arrow.zstd` and is never published, recorded in the build record, or served by `raincloud.load()`. Only a run with the safe defaults (`raincloud build -hydrated`, or `hydrate` without those options) produces the dataset. Spell the flags out in full; abbreviations are refused. In a terminal, `raincloud list` marks them `[hydrated]` (piped output is bare slugs); `raincloud list --hydrate` lists only them. + +This document is hand-maintained. ## What we provide vs. what you provide -Raincloud ships the **mechanism**, not the **policy**. The hydrate stage filters URLs through: +Raincloud ships the **mechanism**, not the **policy**. Unless the bypass below is active, the hydrate stage filters URLs through: -1. **A scheme allowlist** (always on) — only `http` and `https`. `file://`, `data:`, `javascript:`, `.onion`, etc. are blocked. -2. **The dataset's own `hydrate.blocked_hosts_extra`** — the manifest author's pre-banned hostnames for that slug, applied regardless of run-time flags. -3. **Per-run `--block FILE`** — additional hostnames you supply. Plug in [StevenBlack/hosts](https://github.com/StevenBlack/hosts), your corporate DNS list, an IWF feed if you have access, etc. +1. **A scheme allowlist** — only `http` and `https`. `file://`, `data:`, `javascript:`, `.onion`, etc. are blocked. +2. **The dataset's own `derive.hydrate.blocked_hosts_extra`** — the manifest author's pre-banned hostnames, applied whatever `--block`/`--urlhaus` flags a run passes. +3. **Per-run `--block FILE`** — additional hostnames you supply, e.g. [StevenBlack/hosts](https://github.com/StevenBlack/hosts), your corporate DNS list, an IWF feed if you have access. 4. **`--urlhaus`** (opt-in) — fetches the [abuse.ch URLhaus](https://urlhaus.abuse.ch/) hostfile at run start, caches it for 24h. Covers active malware. Off by default because it adds a network dependency at hydrate-start. -We do **not** bundle a static "unsafe" list. They go stale; we can't cover every category (e.g. CSAM lists like IWF aren't publicly distributable); and our editorial choices wouldn't match yours. Plug in the upstream filter sources you trust, or run hydration behind a DNS-filtered network (CleanBrowsing, Quad9, Cloudflare 1.1.1.2). +Layers 3 and 4 make the run a sample, so they preview what a filtered dataset would hold; they never shape the published one. A blocklist that must govern the published dataset goes in the manifest, as `derive.hydrate.blocked_hosts_extra`, or in the network: run hydration behind a DNS-filtered resolver (CleanBrowsing, Quad9, Cloudflare 1.1.1.2). + +We do **not** bundle a static "unsafe" list. They go stale; we can't cover every category (e.g. CSAM lists like IWF aren't publicly distributable); and our editorial choices wouldn't match yours. Bring the filter sources you trust. **Bypass** requires *two* flags to make a single-flag accident impossible: ```bash -python -m scripts.pipeline.hydrate --unsafe-allow-all-domains --i-accept-the-risk +python -m raincloud.pipeline.hydrate -hydrated --unsafe-allow-all-domains --i-accept-the-risk ``` -The hydrated parquet records the filter decision per row (`_hydrate_provenance.filter_decision`), so a downstream consumer always knows *why* a row's `` is null — fetched-and-empty, blocked-by-host, blocked-by-scheme, or fetched-and-errored. +The bypass disables **every** layer, the scheme allowlist and the dataset's own `blocked_hosts_extra` included: each URL is fetched whatever its scheme or host. A bypass run is always a sample. + +Each fetched column `` is followed by a `__provenance` struct recording the filter decision per row, so a downstream consumer always knows *why* a value is null. `filter_decision` is one of `allowed` (fetched, including under the bypass), `blocked_scheme`, `blocked_by_host` (any blocklist: `blocked_hosts_extra`, `--block` or `--urlhaus`) or `fetch_error`; `error` and `http_status` say more about a fetch that failed. ## What you're consenting to -Hydration dereferences arbitrary URLs from the open web. Raincloud makes no claim about the safety, legality, or appropriateness of any bytes you receive — you are consenting to download whatever the URL returns. The hydrated parquet is a **separate, deliberately sketchy artefact tier**: no file-size guarantees, no reproducibility guarantees (URLs die, content drifts), no completeness guarantees. Treat it as research convenience, not a redistributable corpus. +Hydration dereferences arbitrary URLs from the open web. Raincloud makes no claim about the safety, legality, or appropriateness of any bytes you receive — you are consenting to download whatever the URL returns. A hydrated dataset is **deliberately sketchy**: no file-size guarantees, no reproducibility guarantees (URLs die, content drifts), no completeness guarantees. Treat it as research convenience, not a redistributable corpus. diff --git a/README.md b/README.md index 7bdca9a..99aca1b 100644 --- a/README.md +++ b/README.md @@ -5,389 +5,297 @@ [![License](https://img.shields.io/github/license/spiraldb/raincloud)](LICENSE) [![Cite](https://img.shields.io/badge/cite-CITATION.cff-blue)](CITATION.cff) -A reproducible pipeline for building a curated catalog of public datasets as analytics-ready Parquet and Vortex files. - -Raincloud is a reproducible baseline of public datasets in modern columnar formats, curated from research papers and existing community efforts. The project's motivation comes from file-format research, where consistent test corpora are needed to compare encoding, compression, and layout choices on real-world inputs. Beyond file-format research, we see broader value in providing a community-curated set of real-world data, as we expect it to be useful for other tasks such as analytical benchmarking and model evaluation. - -> ⚠ **Third-party data.** Raincloud fetches data from URLs declared in `sources.json`. Those bytes come from upstream sources, not from us — we don't audit, host, or redistribute them. See [`DISCLAIMER.md`](DISCLAIMER.md) for the AS IS posture, content / license / supply-chain disclaimers, and the dataset-removal channel. - -The repo is driven by a single manifest — `sources.json` — which declares: - -1. **Where to fetch data from.** Each entry names an upstream source (HTTP, Kaggle, Hugging Face) and the URLs to pull. -2. **How to transform it.** Each entry names a parser (`csv`, `parquet`, `jsonl`, `xml`, `pbf`, `custom`) and a transform handler that converts the raw bytes into one or more typed Arrow tables. -3. **Where it lands.** Transformed tables are written to `outputs/v{schema_version}//parquet/.parquet`, with the optional Vortex sibling at `outputs/v{schema_version}//vortex/.vortex`. The per-format subdirectory leaves room for additional artifact tiers (e.g. `parquet-hydrated/`) without filename collisions. - -Nothing downstream of `sources.json` is hand-maintained; `docs/datasets.md` and `docs/handlers.md` are derived artefacts regenerated after each build. Column-level / type-coverage / vortex-skip / hydration-candidate views are queryable via `list_datasets` flags and the TUI rather than markdown. - -## Getting started - -**Browse the catalog at a glance** — sortable columns, parquet/vortex presence per slug, no builds required: +**Raincloud is a harness for data management research.** It curates the datasets the +field actually works with — standard benchmarks, real-world workloads at real scale, +and data chosen to stress storage formats — and gives you one way to fetch, build and +read all of them. + +Raincloud distributes the harness, not the data. Each dataset is a reproducible +recipe: where the bytes come from, how to turn them into Arrow, Parquet and Vortex, +and how to check you got what was expected. The catalog records the sha256 and size +of every file a recipe produces. Bytes coming from a mirror, or entering a shared +store, are checked against it; a build you run yourself is recorded in your install's +build record and served from there, and may differ when an upstream has drifted. +You either read prepared files, from a store an operator set up on your machine or a +mirror your team runs, or you build a dataset yourself from its upstream source. + +> ⚠ **Third-party data.** Raincloud fetches from URLs declared in `sources.json`. +> Those bytes come from upstream sources, not from us — we don't audit, host or +> redistribute them. See [`DISCLAIMER.md`](DISCLAIMER.md). + +--- + +## What's in it + +**Over 250 real-world datasets, plus tables from standard data generators** +(`raincloud list --count` counts every entry, generated tables included). Selection is +by relevance to data management research — some of it canonical, much of it niche, chosen +for what it exercises rather than how well known it is. The catalog grows; what follows +is what it is for, not an inventory. + +**Standard benchmarks.** TPC-H and TPC-DS, wired to more than one generator so you can +compare implementations rather than trusting a single one, at SF1, SF10 and SF100 +(another scale factor is one manifest entry away). Alongside them the Public BI +benchmark, the Join Order Benchmark over the IMDb tables, ClickBench, and the Appian +benchmark set. + +**Real-world data at awkward sizes.** Weather observations in the billions of rows +(`ghcn-daily`), Wikipedia's structured contents in the tens of gigabytes, the full +Stack Overflow dump split into posts, users, tags, badges and post links, OpenStreetMap +Germany as nodes, ways and relations, NYC taxi trips, the 2011 Google cluster trace, +Open Library and Hacker News. Sizes span from empty tables to billions of rows, because a +format that behaves well at one scale often does not at another. + +**Encoding and type stress.** The catalog is curated so a format or encoding change has +something real to run against: deeply nested structs and lists, dense float vectors +both fixed-width and variable (embeddings from GloVe, DBpedia and Cohere), JSON +promoted to VARIANT, geospatial geometry as WKB, and decimals carried through the +benchmark tables. + +**Classic tabular.** The UCI staples, for when you want something small, familiar and +quick to reason about. + +For the actual contents, query the catalog rather than reading a list here. These +commands answer from catalog metadata, so they work before anything is built: ```bash -uv sync --extra tui --inexact -python -m scripts.pipeline.browse +raincloud list --long # every dataset: handler, source, license, rows, what is on disk here +raincloud list tpch lineitem # only the entries matching every word +raincloud describe uci-iris # one dataset: columns and types, rows, formats and sizes, license ``` -A read-only Textual TUI over `sources.json`. Click any column header to sort; right pane shows description, license, fetch URL, and on-disk state for the highlighted slug. Press `q` to quit. +## Getting data -**Tell Raincloud which dataset you want; get back a Parquet + Vortex file on disk.** Building needs the heavy toolchain behind the `build` extra (a bare `uv sync --inexact` installs only the lightweight loader — see [Upstream-specific extras](#upstream-specific-extras)): +Install the reader. It is deliberately light: Arrow, NumPy, fsspec and platformdirs. +Requires Python 3.11+. ```bash -uv sync --extra build --inexact -python -m scripts.pipeline.status --fast --missing-only # read-only env check -python -m scripts.pipeline.build countries-of-the-world -``` - -``` -outputs/v1/countries-of-the-world/parquet/countries-of-the-world.parquet -outputs/v1/countries-of-the-world/vortex/countries-of-the-world.vortex +pip install "raincloud @ git+https://github.com/spiraldb/raincloud" ``` -The command runs every pipeline stage — fetch, extract, parse, transform, write, validate, convert — and leaves both a Parquet file and its converted Vortex sibling under per-format subdirectories of `outputs/v1//`. - -### Load prepared files in your own scripts / CI - -Install just the loader (no build toolchain): +Raincloud reads prepared files, and they come from one of three places: a store an +operator has set up on this machine (a system config file names it), a mirror, or a +build you run yourself. A mirror is a private artifact store your team fills with +`python -m raincloud.pipeline.publish --mirror` and points readers at with +`RAINCLOUD_MIRROR` (or `--mirror`): a directory (`file:///path`), `s3://bucket/prefix` +with the `[s3]` extra, or `https://…` with `[http]`. There is no public mirror. On a fresh install nothing is +prepared, so build the dataset first. Building needs the `[build]` extra (see +[Building locally](#building-locally)): ```bash -# from GitHub (not published to PyPI); pin a tag like @v0.2.0 for reproducible CI -pip install "raincloud @ git+https://github.com/spiraldb/raincloud" -# remote-mirror backends: "raincloud[s3] @ git+https://github.com/spiraldb/raincloud" +pip install "raincloud[build] @ git+https://github.com/spiraldb/raincloud" +raincloud build uci-iris ``` +Then read it by name. Nothing is read until you ask for data: + ```python import raincloud -ds = raincloud.load("countries-of-the-world") # lazy handle, default Vortex -table = ds.to_arrow() # materialize when you want it -path = ds.path() # or just the cached file path -``` - -Resolution is **cache → mirror → local build**. Point CI at a prepared-artifact -bucket and loads become downloads, not multi-hour rebuilds: - -```bash -export RAINCLOUD_MIRROR=s3://your-bucket/raincloud # or file:///path -``` -When the catalog records a checksum for an artifact, a drift from it warns and -adopts by default (`RAINCLOUD_STRICT_CHECKSUM=1` makes it a hard failure); where -no checksum is recorded yet, the pinned byte size is used as a cheap corruption -check. The `raincloud[build]` extra adds the full pipeline for the local-build -fallback on a cache + mirror miss. +ds = raincloud.load("uci-iris") +ds.num_rows # catalog metadata, no bytes read +ds.column_names -### Discover +table = ds.to_arrow() # materialize the whole table -Run `python -m scripts.pipeline.browse` and click the **Encoding** preset. The left panel filters by domain, size, shape traits, license, or fetch type; click a slug to see its description, on-disk state, and per-column profile (run `python -m scripts.pipeline.profile ` first to populate it). +with ds.batches(columns=["sepal_length"]) as batches: + for batch in batches: # or stream PyArrow RecordBatches + print(batch.num_rows) -Headless? The same axes are flags on `list_datasets`: - -```bash -python -m scripts.pipeline.list_datasets --view encoding --long -python -m scripts.pipeline.list_datasets --tag geospatial -python -m scripts.pipeline.list_datasets --trait has_nested --size m -python -m scripts.pipeline.list_datasets --inspect clickbench-hits -python -m scripts.pipeline.list_datasets --tags-help +d = ds.dataset() # lazy pyarrow Dataset of the loaded format; +con = raincloud.duckdb_connect() # DuckDB, Polars and pyarrow scan it with pushdown +con.sql("select count(*) from d").show() # DuckDB needs `raincloud[duckdb]` +ds.to_pandas() # pandas DataFrame [pandas] ``` -The curated-picks header at the top of [`docs/v1/datasets.md`](docs/v1/datasets.md) groups slugs into two editorial tiers (Encoding, Stress) drawn from each spec's `showcase` field — pick any slug and pass it to `build` the same way. Examples spanning the size range: - -```bash -python -m scripts.pipeline.build uci-seeds # 210 rows, ~200 ms -python -m scripts.pipeline.build clickbench-hits # 100 M rows, ~10 GB parquet -``` +`raincloud load uci-iris` prints the path of the file instead, and +`raincloud describe uci-iris` shows which formats are prepared on this machine. -### Upstream-specific extras +A format the dataset's writer could not produce is reported, not offered as a +build: when a build measured that (the writer raised, crashed, or ran past +`RAINCLOUD_EXPORT_TIMEOUT`), `raincloud describe` shows the format as unavailable +with the writer, its version and its error, asking for it raises +`FormatUnavailable` quoting them, and `format="auto"` skips it. -A bare `uv sync --inexact` (or a `pip install` from the GitHub URL above) installs only the lightweight loader — `pyarrow`, `numpy`, `vortex-data`, `fsspec`. **Building datasets requires the heavy toolchain behind the `build` extra:** +Reads never build. A dataset that is not prepared raises `ArtifactNotFound`, and +the message names the command that prepares it. To let a read build, ask for it +explicitly (this needs `[build]` too): -```bash -uv sync --extra build --inexact # duckdb, pandas, osmium, pyreadstat, openpyxl, … +```python +raincloud.load("uci-iris", build=True) ``` - -Add `--extra build` before running `python -m scripts.pipeline.build` (or working on a handler); without it the build stages fail on a missing import. - -157 of 249 manifest entries fetch from direct HTTPS endpoints and need no additional setup. The rest: - ```bash -# Kaggle-hosted (33 slugs). One-time credential setup: -uv sync --extra kaggle --inexact -mkdir -p ~/.kaggle && mv /path/to/kaggle.json ~/.kaggle/ && chmod 600 ~/.kaggle/kaggle.json - -# Hugging Face-hosted (59 slugs): -uv sync --extra huggingface --inexact - -# Everything: -uv sync --extra all --inexact -``` - -The `--inexact` flag matters: by default `uv sync` removes any extras you installed previously. Pass it on every `uv sync` so the tui / kaggle / huggingface / dev extras accumulate instead of overwriting each other. - -## For AI coding agents - -If you're an AI coding agent landing in this repo: - -1. Read [`AGENTS.md`](AGENTS.md) (auto-loaded from `CLAUDE.md → AGENTS.md`) for the invariants and architecture. -2. Run `python -m scripts.pipeline.status --fast --missing-only` to verify the env, then `python -m scripts.pipeline.validate_manifest` to confirm `sources.json` is well-formed. Both are sub-second and side-effect-free. -3. Run `pytest` (after `uv sync --extra dev --inexact`) for a regression net before any non-trivial change to the manifest, schema, or handler registry. -4. For catalog questions ("which slugs use handler X", "what's CC0-licensed"), use `python -m scripts.pipeline.list_datasets` rather than greping `sources.json` or scrolling [`docs/v1/datasets.md`](docs/v1/datasets.md). -5. Copy-pasteable templates for new manifest entries and streaming handlers live in [`templates/`](templates/); runnable demos of the `raincloud.load` API are in [`examples/`](examples/). -6. Harnesses that follow the [Agent Skills](https://agentskills.io) standard get 21 invokable skills under [`.agents/skills/`](.agents/skills/) (the `.claude → .agents` symlink means Claude Code sees the same files). Tracked safe-default permissions in [`.agents/settings.json`](.agents/settings.json) — see [`.agents/README.md`](.agents/README.md) for the full layout. - -## Repository layout - -``` -sources.json # the manifest — one DatasetSpec per dataset -sources.schema.md # human-friendly schema reference -sources.schema.json # machine-readable JSON Schema (Draft 2020-12) -AGENTS.md # invariants + first-contact guide for AI coding agents (CLAUDE.md → AGENTS.md) -SKILLS.md # narrative playbooks -HYDRATING.md # hand-maintained hydration policy / philosophy -DISCLAIMER.md # AS IS posture, content/license disclaimers, dataset-removal reporting -raincloud/ # importable loader package — raincloud.load("") → lazy Dataset (cache → mirror → build) -scripts/ - pipeline/ - build.py # orchestrator — ties the 7 stages together - fetch.py # stage 1: download raw bytes - custom_fetch.py # named custom-fetch helpers (fetch.type = "custom") - extract.py # stage 2: unpack archives into _workdir/ - parse.py # stage 3: read raw files into Arrow tables - transform.py # stage 4: dispatch to named handler - write.py # stage 5: emit parquet - validate.py # stage 6: assert rows / schema_hash - convert.py # stage 7 (optional): emit sibling .vortex per spec's convert.vortex flag - hydrate.py # stage 8 (optional, opt-in): dereference URL columns into parquet-hydrated/ - docs.py # regenerate docs/datasets.md + handlers.md (other catalog views live in list_datasets / TUI) - publish.py # sync built outputs/v1/ artifacts to a mirror (snapshot-sha256-gated) - tighten_variant.py # in-place JSON → VARIANT pass - validate_manifest.py # static checks on sources.json (schema + cross-checks) - list_datasets.py # filter/list slugs by handler / license / tag / size / etc. - status.py # per-slug filesystem state report - browse.py # interactive Textual TUI over sources.json (requires --extra tui) - spec.py # manifest loader, path helpers, duckdb_connect - handlers/ # named transform handlers -tests/ # pytest smoke suite (manifest, schema, handler registry, examples) -templates/ # copy-pasteable authoring templates (minimal_spec.json, streaming_handler.py.tmpl) -examples/ # runnable code-path demos of raincloud.load (use_loader.py, nyc_taxi_tip_rate.py, …) -.agents/ # tracked agent allow-list (settings.json) + 21 invokable skills (.claude → .agents) -outputs/ - raw_downloads// # stage 1 output — unversioned, cached - v{schema_version}// # stage 5 output — version-scoped -docs/ - datasets.md # auto-generated index (one row per dataset) - handlers.md # auto-generated registry view (purpose, streaming, extra deps, usage) - v{schema_version}/ # tracked canonical snapshot of datasets.md + handlers.md -_workdir// # stage 2 scratch space (gitignored) +raincloud load uci-iris --build ``` -## Running the pipeline - -```bash -# Build a single dataset -python -m scripts.pipeline.build - -# Build several datasets at once -python -m scripts.pipeline.build uci-iris uci-seeds uci-wine-quality - -# Build every dataset in the manifest -python -m scripts.pipeline.build --all - -# Loosen validation (warn instead of error on row-count drift) -python -m scripts.pipeline.build --loose - -# Regenerate the derived docs after a build -python -m scripts.pipeline.docs # both files (datasets.md + handlers.md) -python -m scripts.pipeline.docs datasets # just datasets.md -python -m scripts.pipeline.docs handlers # just handlers.md - -# Catalog views that used to be markdown live as list_datasets flags now -python -m scripts.pipeline.list_datasets --columns [...] [--column-grep PATTERN] -python -m scripts.pipeline.list_datasets --coverage [--source parquet|vortex] -python -m scripts.pipeline.list_datasets --no-vortex --json # vortex-skip slugs + reasons -python -m scripts.pipeline.list_datasets --hydrate --long # hydration candidates - -# Post-process: promote JSON-annotated string columns to VARIANT in-place -python -m scripts.pipeline.tighten_variant # every built parquet -python -m scripts.pipeline.tighten_variant ... # specific slugs - -# Emit a sibling .vortex for every spec that opts in via convert.vortex: true -python -m scripts.pipeline.convert # respects per-spec flag -python -m scripts.pipeline.convert ... - -# Optional stage 8: dereference URL columns into parquet-hydrated/.parquet. -# Off by default — only for slugs that opted in via the `hydrate` block. -# Safety filter ON by default; bypass requires --unsafe-allow-all-domains -# AND --i-accept-the-risk. See HYDRATING.md for the full discussion. -python -m scripts.pipeline.hydrate # one slug -python -m scripts.pipeline.hydrate --limit 100 # first N rows (recommended for first run) -python -m scripts.pipeline.hydrate --all # every spec with hydrate - -# Read-only inspection / triage -python -m scripts.pipeline.status --fast --missing-only # filesystem state across the manifest -python -m scripts.pipeline.validate_manifest # static checks on sources.json (schema + cross-checks) -python -m scripts.pipeline.list_datasets --handler uci_default # filter the catalog without grepping JSON -python -m scripts.pipeline.list_datasets --handler tighten_types --long -python -m scripts.pipeline.list_datasets --grep '\bgeo' --long -python -m scripts.pipeline.browse # interactive TUI (requires --extra tui) - -# Run the test suite (sub-second, no fetch / no build) -uv sync --extra dev --inexact && pytest +**Which format you get.** A dataset can have Arrow IPC, Parquet and Vortex files. +`format="auto"`, the default, picks Vortex, then Parquet, then Arrow, among the +formats you have a reader for. The base install reads Arrow and Parquet; `[vortex]` +adds Vortex, and `[build]` includes it. Installing either one therefore changes what +`auto` returns, down to the Arrow types: Vortex returns some string columns as +`string_view`. Name the format when that matters: +`raincloud.load("uci-iris", format="parquet")`. + +Other extras: `[s3]` and `[http]` add mirror transports, `[pandas]` backs `.to_pandas()`. + +### From other languages + +Prepared data reads from Rust, C, C++ and Java, returning native Arrow record +batches. The native clients only read. Choosing, downloading and verifying the file +is done by the Python `raincloud` command, which they run, so install the Python +package as well. They find it through their `cli` option, then `RAINCLOUD_CLI`, then +`PATH`. + +```rust +use raincloud_reader::{Dataset, RecordBatchReader}; +use serde_json::json; + +fn main() -> raincloud_reader::Result<()> { + // raincloud_reader::load("uci-iris")? uses default settings and picks the format. + let ds = Dataset::load(&json!({"config": "/path/to/config.toml"}), "uci-iris", "parquet")?; + let batches = ds.batches(65536)?; + println!("{:?}", batches.schema()); + for batch in batches { + println!("{} rows", batch?.num_rows()); + } + Ok(()) +} ``` -Each stage is independently invokable — e.g. `python -m scripts.pipeline.fetch ` to download raw bytes without running the rest. Stages are idempotent: fetch skips when `expected_bytes`/`expected_sha256` already matches on disk, write skips when the output parquet is already current. - -### DuckDB resource limits - -Every DuckDB connection in the pipeline goes through `scripts.pipeline.spec.duckdb_connect`, which reads these optional env vars before opening: +The clients are built from source; no native binary packages are published yet. +The C and C++ build installs a relocatable CMake package, and the Java build a +runtime distribution. See [`clients/README.md`](clients/README.md). These source +builds are verified on Linux x86-64 only. -| Env var | Effect | -|---|---| -| `RAINCLOUD_DUCKDB_MEMORY_LIMIT` | Caps DuckDB's working set (`memory_limit` setting). E.g. `8GB`, `512MB`. DuckDB spills to disk once the limit is hit. Unset = DuckDB's default (~80% of system RAM), which can be a problem on shared hosts or CI runners. | -| `RAINCLOUD_DUCKDB_THREADS` | Caps the thread pool. Integer. | -| `RAINCLOUD_DUCKDB_TEMP_DIRECTORY` | Where DuckDB spills intermediate batches. Default = system tempdir. Point at a larger volume if the system tempdir runs out of room on a big build. | +### Pinning a catalog -Example: +The catalog is versioned independently of the software and of your data. Updates +are explicit — nothing refreshes underneath a running job. ```bash -RAINCLOUD_DUCKDB_MEMORY_LIMIT=8GB \ -RAINCLOUD_DUCKDB_TEMP_DIRECTORY=/mnt/scratch/duckdb-tmp \ - python -m scripts.pipeline.build jsonbench-bluesky-100m +raincloud catalog status # the catalog in use, and the installed revisions +raincloud catalog update --source LOCATION # install the latest revision from a catalog source +raincloud catalog pin # a revision, or the 12-character prefix `raincloud` prints +raincloud catalog rollback ``` -Persistent DuckDB databases are opened with `storage_compatibility_version=v1.5.0` automatically (required for VARIANT columns). - -### Data locations - -By default, builds write under the repo root (if `sources.json` is present — the checkout case) or under `~/.cache/raincloud` (wheel-install case). All five paths are overridable: - -| Env var | Controls | Default | -|---|---|---| -| `RAINCLOUD_HOME` | build data-area root | checkout root (if `sources.json` is present), else `~/.cache/raincloud` | -| `RAINCLOUD_OUTPUTS` | built-artifact base (`/v{n}` under it) | `$RAINCLOUD_HOME/outputs` | -| `RAINCLOUD_RAW_DOWNLOADS` | cached raw upstream bytes | `$RAINCLOUD_OUTPUTS/raw_downloads` | -| `RAINCLOUD_WORKDIR` | extract/scratch space | `$RAINCLOUD_HOME/_workdir` | -| `RAINCLOUD_MANIFEST` | `sources.json` path | checkout copy, else the wheel-packaged copy | - -In the defaults above, `$RAINCLOUD_HOME` / `$RAINCLOUD_OUTPUTS` mean the *resolved* roots — when those vars are unset they fall back to the checkout (or `~/.cache/raincloud`) and `/outputs` respectively. +There is no hosted catalog. `update` needs the location your operator or team +publishes catalogs to: a local directory or an HTTPS URL, given as `--source` or as +`catalog_url` in the config file. -In a **checkout** (`uv sync --extra build --inexact`), builds write to `/outputs/` as before — unchanged. In a **wheel install** (`pip install raincloud[build]`), builds default to `~/.cache/raincloud` (same cache tier as Hugging Face `datasets`, honoring `XDG_CACHE_HOME`) — no init step required. +## Adding your own -`RAINCLOUD_CACHE` (the loader's *download* cache for already-built artefacts fetched via mirror) is independent of the above and always defaults to `~/.cache/raincloud` (honoring `XDG_CACHE_HOME`). +A dataset is one entry in the manifest, [`sources.json`](sources.json). The shape, +abridged to the parts you will actually think about — where the bytes come from, how +to parse them, and what you expect to get: -## The manifest (`sources.json`) - -See [`sources.schema.md`](sources.schema.md) for the human-friendly reference and [`sources.schema.json`](sources.schema.json) for the machine-readable JSON Schema (Draft 2020-12). After editing the manifest, run - -```bash -python -m scripts.pipeline.validate_manifest -``` - -to catch typo'd handler names, slug collisions, and shape errors in under a second before paying for a fetch. - -A minimal entry looks like: - -```jsonc +```json { - "slug": "clickbench-hits", - "short_name": "ClickBench Hits", - "license": { "spdx": "Apache-2.0", "source_url": "..." }, - "fetch": { "type": "http", "urls": ["https://datasets.clickhouse.com/hits_compatible/hits.parquet"] }, - "extract": { "type": "passthrough" }, - "parse": { "reader": "parquet" }, - "transform": { "handler": "identity" }, - "write": { "output": "clickbench-hits.parquet", "compression": "zstd" }, - "expect": { "rows": 99997497 } + "slug": "my-dataset", + "short_name": "My Dataset", + "description": "One-line summary of what this contains.", + "license": { "spdx": "CC0-1.0", "redistribution_permitted": true }, + "fetch": { "type": "http", "urls": ["https://example.org/data.csv"] }, + "parse": { "reader": "csv", "options": { "has_header": true } }, + "transform": { "handler": "tighten_types" }, + "expect": { "rows": 1000 } } ``` -Current counts: - -- **Fetch types in use:** `http`, `kaggle`, `huggingface`. -- **Parse readers in use:** `csv`, `parquet`, `jsonl`, `xml`, `pbf`, `custom`. -- **Schema version:** 1 — outputs land in `outputs/v1/`. +That block is illustrative and will not validate on its own; copy +[`templates/minimal_spec.json`](templates/minimal_spec.json), which does. Many +datasets need nothing more than a stock handler (`tighten_types`, `uci_default`, +`identity`). When upstream data needs real work, write a handler under +`raincloud/pipeline/handlers/` and name it here; see [`templates/`](templates/) for +starting points and [`sources.schema.md`](sources.schema.md) for the full schema. -## Output layout +In a source checkout, edit `sources.json` itself. A pip install reads the copy +inside the package, which `raincloud config show` names under `manifest`. Copy that +file, add your entry, and point Raincloud at the copy: -Each dataset produces exactly one parquet per output slug (some handlers split one source into multiple outputs — `glove_split` → 3, `osm_pbf_split` → 3, `stack_exchange_split` → N). Within each slug directory, artefacts live in per-format subdirectories so additional tiers (Vortex sibling, future hydrated copies, partitioned variants) can coexist without filename collisions: - -``` -outputs/v1/clickbench-hits/parquet/clickbench-hits.parquet -outputs/v1/clickbench-hits/vortex/clickbench-hits.vortex -outputs/v1/glove-6b-50d/parquet/glove-6b-50d.parquet -outputs/v1/glove-6b-50d/vortex/glove-6b-50d.vortex -outputs/v1/osm-germany-nodes/parquet/osm-germany-nodes.parquet -... +```bash +export RAINCLOUD_MANIFEST=/path/to/my-sources.json # or `manifest = "..."` in the config file ``` -Raw downloads are cached separately and *not* version-scoped, since the same upstream bytes can feed any schema_version: +On a machine whose config file selects a catalog (an operator-configured store +does), a manifest override is refused until you also set `RAINCLOUD_CATALOG=local`, +which says to read the manifest you named. Every command then reads your manifest. Validate the entry, then build it: +```bash +python -m raincloud.pipeline.validate_manifest +raincloud build my-dataset ``` -outputs/raw_downloads/clickbench-hits/hits.parquet -outputs/raw_downloads/glove-6b-50d/glove.6B.zip # hardlinked into sibling slugs -outputs/raw_downloads/osm-germany-nodes/germany-latest.osm.pbf -``` - -Sibling slugs sharing the same upstream URL (GloVe 50d/100d/200d; OSM Germany nodes/ways/relations) are deduped via hardlink during fetch. - -## Parquet type coverage - -The manifest is curated to exercise a broad range of Parquet logical and nested types, including: - -- `VARIANT` — `countries-of-the-world` (227 country JSON blobs), `jsonbench-bluesky-100m` (100M Bluesky firehose records). -- GeoParquet 1.1 with WKB geometry — `osm-germany-{nodes,ways,relations}`. -- `fixed_size_list` — GloVe embeddings, dbpedia 1536-dim OpenAI embeddings. -- `list<...>` with tightened element types — e.g. `list` for Hacker News kids/parts. -- Nested `struct` / `list` / `map` — Wikipedia Structured Contents. -- Timestamp precision narrowing (`ns → ms` where every value is a whole second). -- UUID and JSON logical-type annotations on string columns. -- `DECIMAL(P, S)` where every double value round-trips losslessly through the chosen precision. - -Type-tightening is idempotent — `tighten_types` can be re-run against any parquet in `outputs/v*/` without regressing the widths. - -## Derived docs - -- [`docs/datasets.md`](docs/datasets.md) — one row per dataset with short/full name, description, source URL, data kind, license, row count, row group count, and file size. Regenerate: `python -m scripts.pipeline.docs datasets`. -- [`docs/handlers.md`](docs/handlers.md) — one row per registered transform handler with its one-line purpose, streaming flag, **format-specific deps it imports** (e.g. `pandas`, `openpyxl`, `pyreadstat`, `osmium`, `zstandard`, `unlzw3` — pyarrow / numpy / duckdb suppressed as core), manifest-spec usage count, and example slugs. Useful when picking a handler for a new dataset, finding precedent for a given upstream shape, or knowing which extras a new manifest entry will pull in. Regenerate: `python -m scripts.pipeline.docs handlers`. -Both are machine-generated; do not hand-edit. `python -m scripts.pipeline.docs` with no args refreshes both. +## Building locally -[`HYDRATING.md`](HYDRATING.md) is **hand-maintained** policy / philosophy for the optional hydrate stage — preamble only, no auto-generated per-slug list. - -Other catalog views (column index, type coverage, vortex-skip list, hydration candidates) used to be auto-generated markdown. They moved out of the markdown layer because the multi-megabyte indexes were unscannable as a reading experience and duplicated state already queryable. They're now flags on `list_datasets`: +Builds need the pipeline toolchain, which is not installed by default: ```bash -python -m scripts.pipeline.list_datasets --columns [...] [--column-grep PATTERN] -python -m scripts.pipeline.list_datasets --coverage [--source parquet|vortex] -python -m scripts.pipeline.list_datasets --no-vortex --json # vortex-skip slugs + reasons -python -m scripts.pipeline.list_datasets --hydrate --long # hydration candidates +pip install "raincloud[build] @ git+https://github.com/spiraldb/raincloud" ``` -Or use `python -m scripts.pipeline.browse` for an interactive view. - -## Contributing - -Bug reports, feature requests, and PRs are welcome. See -[`CONTRIBUTING.md`](CONTRIBUTING.md) for dev-environment setup, the pre-PR -check sequence, and pointers into [`SKILLS.md`](SKILLS.md) for the most common -change types (new dataset, new handler). Notable changes land in -[`CHANGELOG.md`](CHANGELOG.md). - -## Security - -Please report vulnerabilities privately rather than via a public issue — see -[`SECURITY.md`](SECURITY.md) for the disclosure channel and timelines. +Some datasets need one more extra, for their file format or their source: -## Disclaimers - -[`DISCLAIMER.md`](DISCLAIMER.md) covers Raincloud's posture on third-party -datasets: AS IS warranty disclaimer, content and association disclaimer -(any fetched file may contain questionable or offensive material — we -don't audit upstream content), license diligence, supply-chain risk, and -the process for requesting that a dataset be removed from `sources.json`. - -## License - -Raincloud is licensed under the [Apache License 2.0](LICENSE). Each dataset -declared in `sources.json` carries its own upstream license under the -`license.spdx` field; those licenses govern redistribution of any Parquet / -Vortex artefact built against that upstream and are independent of the -license covering the pipeline code itself. +| extra | for | +|---|---| +| `osm` | OpenStreetMap PBF extracts | +| `sas` | SAS transport (`.xpt`) files | +| `excel` | Excel workbooks | +| `archives` | 7-Zip and Unix `.Z` archives | +| `generated` | TPC-H and TPC-DS tables from the DuckDB and tpcgen-rs generators | +| `kaggle` | Kaggle-hosted datasets; downloading needs a Kaggle API token, in `KAGGLE_API_TOKEN` or `~/.kaggle/access_token` (the legacy `~/.kaggle/kaggle.json` still works). A download already on disk needs no token. | +| `huggingface` | Hugging Face datasets; gated ones need a token (`hf auth login`, or `HF_TOKEN`) | + +Combine them as `raincloud[build,osm,kaggle]`; `raincloud[all]` installs everything. +Generators never download anything while they run, so two one-time steps come +first. The DuckDB-generated tables need DuckDB's `tpch` / `tpcds` extension: +`python -c "import duckdb; duckdb.execute('INSTALL tpch')"` (and the same with +`tpcds`); a build that lacks it prints this command. The TPC-DS tables from +tpcgen-rs need that generator's CLI, built from a clean tpcgen-rs checkout at the +commit the recipe pins (the `+git.` in its `fetch.version`, which the build +error also names): +`python -m raincloud.pipeline.generators.install_tpcgen --source `. + +Built files land under `/v2//{arrow,parquet,vortex}/`. The data +directory is `outputs/` in a source checkout and the platform's user data directory +otherwise (`~/.local/share/raincloud` on Linux). Raw downloads are cached under +`/raw_downloads/`, outside the version prefix, and are shared across +schema versions. Every location is configurable: `raincloud init --data-dir DIR` +writes the setting, and `raincloud config show` prints what is in effect. + +Some datasets are large: single datasets can run for hours, and a full catalog build +is measured in days. Build what you need. + +A build does not fail because one format's writer cannot handle a dataset. Every +export is bounded by `RAINCLOUD_EXPORT_TIMEOUT` (default 6 h; `0` disables it); a +writer that raises, crashes, reports a failed round-trip or runs out of time leaves +the previous file in place, the failure is recorded in the build record +(`/builds.json`), and the build prints `[unavailable] /`, +repeats it in its summary, and succeeds with the formats that worked. A later +successful export (`python -m raincloud.pipeline.export --format `) +replaces the record. + +A recorded failure is not repeated: the next build skips that format with a +`[skip]` line when the same writer, with the same toolchain, already failed on the +same inputs, and still exits 0. An upgraded writer library is attempted again on +its own. To try again with nothing changed, pass `--retry-errors` +(`raincloud build --retry-errors`, `raincloud load --retry-errors`, +or `load(..., retry_errors=True)`). + +## Licensing and redistribution + +Each entry carries an SPDX identifier, a source URL, and an explicit +`redistribution_permitted` flag. **A large share of the catalog may not be +redistributed** — which is why raincloud ships recipes rather than bytes, and why the +build fetches from upstream. + +If you mirror artifacts for your own team, `python -m raincloud.pipeline.publish +--mirror URL` refuses to upload anything whose license forbids it. Your obligations +are the upstream licenses; the catalog records them but does not grant them. + +## More + +- [`AGENTS.md`](AGENTS.md) — working in this repo; also the entry point for coding agents +- [`SKILLS.md`](SKILLS.md) — task-by-task procedures +- [`CONTRIBUTING.md`](CONTRIBUTING.md) · [`SECURITY.md`](SECURITY.md) · [`DISCLAIMER.md`](DISCLAIMER.md) +- [`CITATION.cff`](CITATION.cff) — how to cite this work diff --git a/SKILLS.md b/SKILLS.md index f1372df..dc8de4b 100644 --- a/SKILLS.md +++ b/SKILLS.md @@ -2,14 +2,15 @@ Playbooks for common operations in this repo. Each section is a self-contained recipe — copy and adapt. -Prereqs: Python 3.11+ and [uv](https://docs.astral.sh/uv/). A bare `uv sync --inexact` installs only the lightweight loader (`pyarrow`, `numpy`, `vortex-data`, `fsspec`); **running the build pipeline needs the heavy toolchain behind the `build` extra** — `uv sync --extra build --inexact` (pulls `duckdb`, `zstandard`, `py7zr`, `unlzw3`, `pandas`, `openpyxl`, `pyreadstat`, `osmium`, `jsonschema`). Add `--extra kaggle` for Kaggle-hosted datasets, `--extra huggingface` for Hugging Face ones, or `--extra dev` for `pytest` — see [`README.md`](README.md#upstream-specific-extras). Always pass `--inexact` so subsequent extras accumulate instead of overwriting prior ones (uv's default is "exact" sync, which removes anything not requested by the current invocation). Invoke Python as `.venv/bin/python` (or activate the venv). +Prereqs: Python 3.11+ and [uv](https://docs.astral.sh/uv/). A bare `uv sync --inexact` installs only the lightweight loader (`pyarrow`, `numpy`, `fsspec`, `platformdirs`); **running the build pipeline needs the `build` extra**, the pipeline core (`uv sync --extra build --inexact`). A dataset whose format or source needs more names its extra when it is missing; add it as another `--extra`: `osm`, `sas`, `excel` and `archives` for handler formats, `generated`, `kaggle` and `huggingface` for acquisition, `dev` for `pytest` and `ruff`, or `all` for everything. What each extra installs is declared once, in `[project.optional-dependencies]` in [`pyproject.toml`](pyproject.toml). Always pass `--inexact` so subsequent extras accumulate instead of overwriting prior ones (uv's default is "exact" sync, which removes anything not requested by the current invocation). Invoke Python as `.venv/bin/python` (or activate the venv). ## Index - [Loading prepared datasets](#loading-prepared-datasets) — `raincloud.load` from cache / mirror -- [Publishing artefacts to a mirror](#publishing-artefacts-to-a-mirror) — `scripts.pipeline.publish` +- [Releasing to this machine's store](#releasing-to-this-machines-store) — `publish --store` +- [Publishing artefacts to a mirror](#publishing-artefacts-to-a-mirror) — `publish --mirror` - [Opening a DuckDB connection](#opening-a-duckdb-connection) -- [Running the test suite](#running-the-test-suite) — pytest smoke regression net +- [Running the test suite](#running-the-test-suite) — pytest regression net - [Querying the catalog](#querying-the-catalog) — `list_datasets` filters - [Validating `sources.json`](#validating-sourcesjson) — schema + cross-checks - [Adding a new dataset](#adding-a-new-dataset) @@ -19,7 +20,7 @@ Prereqs: Python 3.11+ and [uv](https://docs.astral.sh/uv/). A bare `uv sync --in - [Writing a streaming handler](#writing-a-streaming-handler) - [Promoting a JSON column to VARIANT](#promoting-a-json-column-to-variant) - [Tightening existing integer / binary-string columns](#tightening-existing-integer--binary-string-columns) -- [Hydrating a URL column](#hydrating-a-url-column) — optional stage 8 +- [Hydrating a URL column](#hydrating-a-url-column) — a `-hydrated` dataset - [Debugging a failing build](#debugging-a-failing-build) - [Running a large build safely](#running-a-large-build-safely) - [Regenerating specific docs](#regenerating-specific-docs) @@ -29,40 +30,69 @@ Templates referenced by the playbooks: [`templates/minimal_spec.json`](templates ## Loading prepared datasets -Use the importable `raincloud` loader to pull an *already-prepared* artefact instead of rebuilding it. The base install (a `pip install` from the GitHub repo, or a bare `uv sync --inexact`) is the lightweight loader only — add `[s3]` / `[http]` for a remote mirror, `[duckdb]` / `[pandas]` for `.scan()` / `.to_pandas()`. +Use the importable `raincloud` loader to pull an *already-prepared* artefact instead of rebuilding it. The base install (a `pip install` from the GitHub repo, or a bare `uv sync --inexact`) is the lightweight loader only — add `[s3]` / `[http]` for a remote mirror, `[pandas]` for `.to_pandas()`; `.dataset()` needs only pyarrow (plus `[vortex]` for Vortex files). ```python import raincloud -ds = raincloud.load("countries-of-the-world") # lazy handle, default Vortex +ds = raincloud.load("countries-of-the-world") # lazy handle, auto selects an installed reader table = ds.to_arrow() # materialize when you want it path = ds.path() # or just the cached file path ``` -Resolution is **cache → mirror → local build**: a local cache hit short-circuits; otherwise it pulls from `RAINCLOUD_MIRROR` (a private/internal artefact store — `s3://bucket/prefix`, `file:///path`); only on a cache+mirror miss does it shell out to `scripts.pipeline.build` (which needs the `[build]` extra). When `docs/v1/snapshot.json` records a checksum, a drift warns-and-adopts by default (`RAINCLOUD_STRICT_CHECKSUM=1` for a hard gate); otherwise the pinned byte size is the corruption check. +Resolution is **local data/cache → mirror**. Missing prepared files raise an error. Build explicitly with `raincloud build SLUG`, or opt in with `load(SLUG, build=True)` and the `[build]` extra. `RAINCLOUD_MIRROR` selects a private/internal artifact store (`s3://bucket/prefix`, `file:///path`). The catalog is the authority on each artifact's sha256 and byte size: a local file at its key with the catalog's size is the artifact, and bytes from a mirror must match the catalog's sha256 (or its size, when it records none) or they are refused with `ChecksumMismatch`. No build changes the catalog. A build records what it produced in this install's build record (`/builds.json`), and the loader serves a local file that differs from the catalog's (upstream drift) when the build record names it at its size, built from the dataset's current recipe. ```bash export RAINCLOUD_MIRROR=s3://your-bucket/raincloud # point CI at a prepared-artefact bucket export RAINCLOUD_CACHE=/var/cache/raincloud # optional cache-dir override -export RAINCLOUD_OFFLINE=1 # cache-only; mirror/build misses raise OfflineMiss +export RAINCLOUD_OFFLINE=1 # local only: never contacts the mirror; misses raise OfflineMiss ``` +Use `raincloud init --data-dir /mnt/data/raincloud --scratch-dir /mnt/fast/raincloud` for optional local settings. `raincloud config show` reports effective paths. Add `[vortex]` for Vortex reads; `raincloud capabilities` reports installed readers. Catalog update/pin/rollback is explicit and independent of package installation; see [README](README.md#pinning-a-catalog). + +## Releasing to this machine's store + +A machine that serves prepared data to its users has one shared content store (an operator-owned `data_dir`) and a catalog pack directory that users' system config names as their `catalog`. A maintainer releases into both from a reviewed commit: + +```bash +python -m raincloud.pipeline.publish ... --store /path/to/store --catalogs /path/to/catalogs --dry-run # preview +python -m raincloud.pipeline.publish ... --store /path/to/store --catalogs /path/to/catalogs +python -m raincloud.pipeline.publish --all --store /path/to/store --catalogs /path/to/catalogs +``` + +- Each artifact's sha256 is checked against the selected catalog's snapshot (`docs/v{n}/snapshot.json` in a checkout) before it enters the store, then placed as a hard link (a copy across filesystems) and renamed into place. An artifact whose snapshot entry records no sha256 is placed ungated, and one already in the store as the same file is not re-hashed (so when `data_dir` is the store, nothing sha-checked a build written straight into it). +- A hard link or copy keeps the builder's owner and mode. Build under a umask (or group) that lets the store's other users read the files. +- `--catalogs DIR` releases the catalog: it writes the selected catalog into `DIR` as a revision and rewrites `DIR/latest.json` to point at it. Before placing anything it refuses a catalog that names an artifact the store would not hold at the recorded size. Without `--catalogs`, only artifacts are placed and the released catalog is unchanged. +- Users whose `catalog` setting names the pack directory (normally in the machine's system config) follow the release on their next read, with no config edit. A dataset handle already open keeps the catalog metadata it opened with, but store keys are not content-addressed: a file under an unchanged key is replaced in place, so a handle that reads after a release can get the new bytes (or a size mismatch against its older metadata). +- Rolling back restores catalog metadata only. Releasing the previous commit's catalog works while the store still holds that catalog's bytes; once a release replaced them, rebuild the previous commit's artifacts and place them with `--store` before releasing its catalog, or `--catalogs` refuses (sizes differ) or names bytes the store no longer holds (sizes match). +- The license gates do not apply: the store serves this machine's users, which is not redistribution. `--allow-*` flags have no effect with `--store`. + ## Publishing artefacts to a mirror -Maintainers sync built `outputs/v1/...` artefacts up to a mirror bucket with the `publish` CLI. Each artefact's on-disk sha256 must match `docs/v1/snapshot.json` (regenerate the snapshot via `python -m scripts.pipeline.docs` after a build first), otherwise the upload is gated off with a `PublishMismatch`. +Maintainers upload built artefacts to an off-machine mirror with `--mirror`. Each artefact's on-disk sha256 must match the selected catalog's snapshot (`docs/v{n}/snapshot.json`, today `docs/v2/`), otherwise the upload is refused with a `PublishMismatch`. An artefact whose snapshot entry records no sha256 is uploaded ungated. + +```bash +python -m raincloud.pipeline.publish countries-of-the-world --mirror s3://your-bucket/raincloud +python -m raincloud.pipeline.publish --all --mirror file:///path/to/mirror --dry-run # preview the plan +``` + +After a rebuild, the snapshot must record the new bytes before they can be published. A plain regeneration takes each file's sha256 and writer from this install's build record, so run it after a local build or export, promote all three scratch copies, and commit them: ```bash -python -m scripts.pipeline.publish countries-of-the-world --mirror s3://your-bucket/raincloud -python -m scripts.pipeline.publish --all --mirror file:///tmp/mirror --dry-run # preview the plan +python -m raincloud.pipeline.docs +cp docs/snapshot.json docs/datasets.md docs/handlers.md docs/v2/ +git diff docs/v2/ ``` -The mirror is a private/internal store you control — there is no public Raincloud-hosted endpoint, and publishing here does not change the no-redistribution posture in [`DISCLAIMER.md`](DISCLAIMER.md). The `--mirror` base is an `fsspec` URL; `s3://` needs `[s3]`, `http(s)://` needs `[http]`, `file://` needs neither. +Keep `docs snapshot --rehash` for files the build record does not describe (built elsewhere, or by an older raincloud). It bypasses the record and re-hashes every file, so a rehashed file whose sha changed loses its recorded writer: Parquet falls back to the writer its `created_by` names, and Vortex to none. + +Mirror uploads are redistribution, so two license gates apply: a spec whose license carries a `scrape_advisory`, or sets `redistribution_permitted: false`, is refused unless you pass `--allow-scrape-advisory` or `--allow-no-redistribution` respectively. The mirror is a private/internal store you control — there is no public Raincloud-hosted endpoint, and publishing here does not change the no-redistribution posture in [`DISCLAIMER.md`](DISCLAIMER.md). The `--mirror` base is a writable `fsspec` URL: `s3://` needs `[s3]`, `file://` needs nothing. An `https://` mirror can serve readers (with `[http]`) but is not writable, so `publish` refuses it (exit 2) before planning anything. ## Opening a DuckDB connection -Always go through `scripts.pipeline.spec.duckdb_connect` instead of `duckdb.connect(...)`. It applies Raincloud's env-var-driven resource limits and the `storage_compatibility_version=v1.5.0` setting required for persistent VARIANT writes. +Raincloud code, tests and examples always go through `raincloud.duckdb_connect` instead of `duckdb.connect(...)`. It applies Raincloud's env-var-driven resource limits and the `storage_compatibility_version=v1.5.0` setting required for persistent VARIANT writes. ```python -from scripts.pipeline.spec import duckdb_connect +from raincloud import duckdb_connect # In-memory, default config con = duckdb_connect() @@ -74,7 +104,7 @@ con = duckdb_connect("/path/to/build.duckdb") con = duckdb_connect(extra_config={"preserve_insertion_order": False}) ``` -Env vars the helper honours (see [`README.md`](README.md#duckdb-resource-limits)): +Env vars the helper honours (see [`AGENTS.md`](AGENTS.md#data-locations)): - `RAINCLOUD_DUCKDB_MEMORY_LIMIT` — e.g. `8GB`, `96GB`. **Set this for large builds.** Default (unset) lets DuckDB grab ~80% of system RAM, which can swap-thrash on heavily-nested VARIANT shredding. - `RAINCLOUD_DUCKDB_THREADS` — int. @@ -83,48 +113,55 @@ Env vars the helper honours (see [`README.md`](README.md#duckdb-resource-limits) ## Running the test suite ```bash -uv sync --extra dev --inexact # one-time — installs pytest, preserves other extras -pytest # ~0.5 s on the full suite +uv sync --extra dev --extra all --inexact # one-time — pytest plus every optional part +pytest # the full hermetic suite (minutes) +python -m raincloud.pipeline.validate_manifest && pytest tests/test_manifest.py # the fast gate after a manifest edit ``` -`tests/` carries a sub-second smoke suite for the manifest, the schema, the handler registry, and the example templates. No fetch, no build, no filesystem writes. Run after any change to `sources.json`, `sources.schema.json`, `scripts/pipeline/handlers/__init__.py`, `templates/`, or `examples/`. Tests exercise the same `validate_manifest` codepath the `/raincloud-validate-manifest` skill runs. +The suite is hermetic by default: it writes only to temporary directories, never to your data directory or the tracked docs, and it runs real small builds (`build.run_one`, build subprocesses) rather than mocking them. Tests that need live upstreams or a built wheel are opt-in, with `--run-network` and `--run-wheel`. Run it after any change to `sources.json`, `sources.schema.json`, `raincloud/_registry.py`, `templates/` or `examples/`; the manifest tests exercise the same `validate_manifest` codepath the `/raincloud-validate-manifest` skill runs. ## Querying the catalog -Filter the manifest from the command line instead of grepping the ~545 KB JSON or scrolling [`docs/v1/datasets.md`](docs/v1/datasets.md) (~158 KB): +Filter the manifest from the command line instead of grepping the JSON or scrolling [`docs/v2/datasets.md`](docs/v2/datasets.md): ```bash -python -m scripts.pipeline.list_datasets --handler uci_default # one slug per line -python -m scripts.pipeline.list_datasets --handler tighten_types --long -python -m scripts.pipeline.list_datasets --fetch-type kaggle --kaggle-tos -python -m scripts.pipeline.list_datasets --reader csv --vortex --count -python -m scripts.pipeline.list_datasets --grep '\bgeo' --long -python -m scripts.pipeline.list_datasets --license CC0-1.0 --json | jq -s 'length' +python -m raincloud.pipeline.list_datasets --handler uci_default # one slug per line +python -m raincloud.pipeline.list_datasets --handler tighten_types --long +python -m raincloud.pipeline.list_datasets --kaggle-tos +python -m raincloud.pipeline.list_datasets --reader csv --vortex --count +python -m raincloud.pipeline.list_datasets --grep '\bgeo' --long +python -m raincloud.pipeline.list_datasets --license CC0-1.0 --json | jq -s 'length' ``` -Filters compose with AND. `--long` emits a wide table (slug + handler + fetch type + reader + license + rows + vortex flag), `--json` emits one row per object for piping into `jq`, `--count` emits just the match count. Read-only — sub-second on the full manifest. Always pair with `/raincloud-status` if you need filesystem state for any returned slug. +Filters compose with AND. `--kaggle-tos` selects datasets gated behind a one-time click-through, Kaggle or Hugging Face. `--vortex` / `--no-vortex` say whether the catalog has Vortex for a dataset: `--no-vortex` lists one whose Vortex writer a build measured unable to produce the file (`--json` carries the measurement as `vortex_unavailable`) or whose export policy leaves Vortex out. The default output is one bare slug per line; on a terminal hydrated datasets are marked `[hydrated]`. `--long` emits a wide table (slug, handler, fetch type, reader, license, rows, vortex, scrape, hydrated, `recorded` — what the tracked catalog records — and `local` — the formats prepared on this install's disk), `--json` emits one row per object for piping into `jq`, `--count` emits just the match count. `--local` keeps only datasets with a file on this machine. Read-only and fast on the full manifest. Pair with `/raincloud-status` when you need filesystem state for a returned slug. ## Validating `sources.json` -Sub-second static check; safe to run after any manifest edit and before triggering a build: +A static check that takes seconds; safe to run after any manifest edit and before triggering a build: ```bash -python -m scripts.pipeline.validate_manifest # human-readable -python -m scripts.pipeline.validate_manifest --json # machine-readable -python -m scripts.pipeline.validate_manifest --strict # warnings → errors +python -m raincloud.pipeline.validate_manifest # the selected catalog's manifest +python -m raincloud.pipeline.validate_manifest path/to/sources.json # a named file +python -m raincloud.pipeline.validate_manifest --json # machine-readable +python -m raincloud.pipeline.validate_manifest --strict # warnings → errors ``` +It prints which manifest it validated: `RAINCLOUD_MANIFEST`, the checkout's `sources.json`, or the copy installed with raincloud. + Two layers: -1. **JSON Schema** ([`sources.schema.json`](sources.schema.json), Draft 2020-12) — shape, enums, regexes, required fields. Uses the `jsonschema` package (pinned in `pyproject.toml`); skipped with a hint if missing. +1. **JSON Schema** ([`sources.schema.json`](sources.schema.json), Draft 2020-12) — shape, enums, regexes, required fields. Uses the `jsonschema` package (declared in the `[build]` extra); skipped with a hint if missing. 2. **Cross-checks** the schema can't express: - slug uniqueness across `datasets[]` - - every `transform.handler` resolves in the live registry (`scripts/pipeline/handlers/__init__.py:_REGISTRY`) - - registered handlers referenced by 0 specs (orphans → warning) - - `fetch.urls` non-empty unless `fetch.type == "custom"` + - every `transform.handler` is declared in `HANDLERS` in `raincloud/_registry.py` (the handler registry is derived from it) + - declared handlers referenced by 0 specs (orphans → warning) + - `derive.from` names an ordinary (non-derived) dataset, and a hydrated dataset is named `-hydrated` + - `fetch.urls` non-empty unless `fetch.type` is `custom` or `generated` + - a `generated` fetch names a registered generator, valid parameters and one of its outputs - `fetch.auth` matches `fetch.type` for `kaggle` / `huggingface` - - `fetch.requires_interactive_accept` only on `fetch.type == "kaggle"` - - `write.output` filename agrees with slug (single-output handlers; multi-output are flagged as warnings — usually safe) + - `fetch.requires_interactive_accept` only on `fetch.type` `kaggle` or `huggingface` + - which formats a dataset exports: in v2, `export.formats` names the formats it wants (`parquet`/`vortex`) and `convert.*` is rejected (v1 pairs `convert.vortex` with `convert.vortex_skip_reason`). A writer's limitation is never declared: the build measures it + - `export.priority` (and the catalog's `export_priority`), a list or a per-format map, names writers that have an export cell, and a list names a writer for every format the dataset exports: a list serves every format and does not fall through, so `["hardwood"]` (a Parquet-only writer) on a dataset that exports Vortex is an error Exit code: `0` on success (warnings allowed), `1` on errors. @@ -132,77 +169,53 @@ The companion [`sources.schema.md`](sources.schema.md) is the human-friendly ref ## Adding a new dataset -1. **Identify the upstream.** Get a stable public URL (prefer the publisher's canonical endpoint over a mirror) and check the license permits redistribution-of-derivatives. -2. **Append a `DatasetSpec` to `sources.json`.** See [`sources.schema.md`](sources.schema.md) for the full shape. Minimal direct-HTTP example: - - ```jsonc - { - "slug": "my-dataset", - "short_name": "My Dataset", - "full_name": "My Dataset (publisher attribution)", - "description": "One-line summary.", - "license": { "spdx": "CC0-1.0", "source_url": "...", "redistribution_permitted": true, "attribution_required": false }, - "fetch": { "type": "http", "urls": ["https://..."], "auth": null }, - "extract": { "type": "passthrough" }, - "parse": { "reader": "csv", "options": { "delimiter": "," } }, - "transform": { "handler": "tighten_types", "params": {} }, - "write": { "output": "my-dataset.parquet", "compression": "zstd", "row_group_size_rows": 1048576, "statistics": true }, - "expect": { "rows": 123456 } - } - ``` - - Use the Python-load-edit-dump pattern from [`AGENTS.md`](AGENTS.md#safe-ways-to-edit-sourcesjson), not `sed`. +1. **Identify the upstream.** Get a stable public URL (prefer the publisher's canonical endpoint over a mirror) and record its license accurately: SPDX id, `source_url`, `redistribution_permitted`, and `scrape_advisory` for broad-web crawls. A license that forbids redistribution does not keep a dataset out of the catalog; it keeps it off mirrors (`publish --mirror` refuses it). +2. **Append a `DatasetSpec` to `sources.json`.** Copy [`templates/minimal_spec.json`](templates/minimal_spec.json), which validates as-is, and edit its placeholders; [`sources.schema.md`](sources.schema.md) documents every field. Use the Python-load-edit-dump pattern from [`AGENTS.md`](AGENTS.md#editing-sourcesjson), not `sed`. 3. **Validate the manifest** before paying for a fetch: ```bash - python -m scripts.pipeline.validate_manifest + python -m raincloud.pipeline.validate_manifest ``` - Catches typo'd handler names, missing required fields, and closed-vocab violations (tags / showcase / SPDX) in under a second. See [Validating `sources.json`](#validating-sourcesjson) above. + Catches typo'd handler names, missing required fields, and closed-vocab violations (tags / showcase / SPDX) in seconds. See [Validating `sources.json`](#validating-sourcesjson) above. 4. **Run the build** for just this slug: ```bash - python -m scripts.pipeline.build my-dataset + python -m raincloud.pipeline.build my-dataset ``` - The first run will fetch + extract + parse + transform + write + validate. If `expect.rows` was a guess and differs from the actual, re-run with `--loose` to get a warning instead of an error, then update the manifest. + The first run will fetch + extract + parse + transform + write the canonical + validate + export. If `expect.rows` was a guess and differs from the actual, the validate stage emits a `[WARN]` (row-count drift does not fail a build unless you pass `--strict`) — read the actual count off that warning and update the manifest. 5. **Regenerate derived docs:** ```bash - python -m scripts.pipeline.docs + python -m raincloud.pipeline.docs ``` ## Emitting a Vortex file alongside the Parquet -Vortex (https://github.com/spiraldb/vortex) is an optional stage-7 output — a sibling `.vortex` next to the prepared parquet. +Vortex (https://github.com/spiraldb/vortex) is one of the default exports: under `schema_version` 2 a dataset exports `vortex/.vortex` from its canonical Arrow file, beside `parquet/.parquet`. -1. Opt the spec in by adding a `convert` block: +1. `export.formats` is the only declaration of which formats a dataset wants. Without it, the defaults export Parquet and Vortex. A deliberate policy may leave Vortex out (`"export": {"formats": ["parquet"]}`, with `notes` if the reason is worth keeping). Do **not** leave it out because the Vortex writer fails on the data: keep it listed and let the build measure that. (`convert.vortex` is v1-only; v2 validation rejects it.) - ```jsonc - "convert": { "vortex": true } - ``` - -2. Build (or just run the convert stage in isolation): +2. Build all requested exports, or refresh only the Vortex file from the canonical already on disk: ```bash - python -m scripts.pipeline.build # convert runs as stage 7 - python -m scripts.pipeline.convert # just the convert stage - python -m scripts.pipeline.convert --all # every opted-in spec + python -m raincloud.pipeline.build + python -m raincloud.pipeline.export --format vortex ``` -3. The stage is idempotent: skips when `.vortex` is newer than `.parquet`. `vortex-data` is pulled in automatically by `uv sync` (pinned at `==0.69.0`); the old `vortex-array` package name is yanked. + `export` records what it wrote in the build record, as a build does. It refuses a canonical that is neither this install's build nor the catalog's file, since nothing exported from it could be recorded; rebuild that one. `--format` overrides the dataset's `export.formats` for the run, so `--format vortex` forces a Vortex export even where the dataset's policy leaves Vortex out. `vortex-data` is included in `[vortex]` and `[build]`, pinned to `0.86.1` alongside the Rust and JNI lanes. -4. **Hydrated companion is converted automatically.** When a slug has `convert.vortex: true` AND a hydrated parquet exists at `outputs/v{n}//parquet-hydrated/.parquet`, the same convert run produces `outputs/v{n}//vortex-hydrated/.vortex`. Same opt-in flag governs both pairs — there's no separate `convert.vortex_hydrated`. The `python -m scripts.pipeline.hydrate ` stage also auto-runs this convert at the end of its work, so the hydrated parquet and its vortex sibling land together. +3. Every writer reads back what it wrote, compared with the canonical, before the file is promoted. When the Vortex writer cannot produce the file for this dataset (it raises, dies, writes a file that does not read back to the canonical or cannot be read at all, or runs past `RAINCLOUD_EXPORT_TIMEOUT`, default 6 h), the build does not fail. The previous file, if any, comes back; the failure is recorded in the build record as the format's *unavailable* measurement (writer cell, error, toolchain versions, recipe, time); the dataset is built with the formats that worked; and the build prints `[unavailable] /vortex` and repeats it in its summary, exiting 0. `raincloud describe ` quotes the measurement, `load(..., format="vortex")` raises `FormatUnavailable` quoting it, and automatic format selection skips Vortex. Regenerating docs carries the measurement into the catalog snapshot (`vortex_unavailable`). A later successful export replaces it: after a toolchain upgrade, run `python -m raincloud.pipeline.export --format vortex` (exit 1 if Vortex is still unavailable) and regenerate. A recorded failure is not repeated: while the measurement that applies (this install's build record at the recipe, else the catalog's) names the same writer cell, the same toolchain versions and the same canonical, `build`, `export` and `convert` skip the format with `[skip] /vortex: ...; pass --retry-errors to try again` and keep the measurement (a `build`, or an `export` without `--format`, still exits 0 and lists it in the summary; `export --format vortex` and `convert` exit 1). A changed toolchain is attempted on its own, with a `[retry]` line saying what changed; `--retry-errors` attempts it with nothing changed. `compliance` prints `[stale opt-out]` when a writer round-trips a format the catalog records as unavailable, and docs regeneration warns when the compliance ledger says so. A sidecar writer that could not verify its own file (`"roundtrip": null`: a comparator gap, or out of memory while verifying) still publishes it; the build prints `[unverified] /` with the writer's reason and lists it in the summary, the build record and, after regeneration, the snapshot mark it (`verified: false` with `verify_note`; `_verified` / `_verify_note`), and `raincloud describe` shows the format as UNVERIFIED with the reason. -Known type-support gaps and the per-slug opt-outs they drive are queryable via `python -m scripts.pipeline.list_datasets --no-vortex --json` (the `vortex_skip_reason` field is in each spec's JSON). Today: `wikipedia-structured-contents` (FSB(16) UUIDs) and `ultrachat-200k` (nested list on chunked-array writes). Add a new opt-out by flipping `convert.vortex` to `false` and writing the reason; `validate_manifest` enforces that the boolean and the reason stay in lockstep. +Datasets without a Vortex file, with the measured reason (or the policy note) for each, are listed by `python -m raincloud.pipeline.list_datasets --no-vortex --json`. Other format-level caveats: - - VARIANT columns surface as their shredded struct on the round-trip (the VARIANT logical annotation isn't preserved) — see `_workdir/vortex_size_report.md` (gitignored, regenerate locally) for the resulting size blow-up on OpenLibrary. - - Expect per-file overhead to dominate on very small parquets — the size ratio can exceed 1.0 for datasets under a few MB. - - `Decimal128` works via the current `pf.read() → vxio.write(table)` path, despite older failures on `read_table()` routing. No special handling needed. + - VARIANT columns surface as their shredded struct in Vortex (the VARIANT logical annotation isn't preserved), which can make a `.vortex` file much larger than the Parquet on heavily nested data such as Open Library. + - Expect per-file overhead to dominate on very small datasets — the Vortex/Parquet size ratio can exceed 1.0 below a few MB. ## Adding a Kaggle dataset gated behind ToS acceptance @@ -233,89 +246,76 @@ The 403 handling is generic — it triggers whether or not `requires_interactive Use a dedicated handler when the default `tighten_types` / `identity` path can't produce the right shape — e.g. the source needs row-level JSON parsing, streaming to avoid OOM, multi-output splitting, or VARIANT columns. -1. **Create the handler** at `scripts/pipeline/handlers/.py`. Signature: +1. **Create the handler** at `raincloud/pipeline/handlers/.py`. Signature: ```python - def (spec: dict, parsed: list[tuple[Path, pa.Table | None]], **params - ) -> list[tuple[str, pa.Table]]: + def (spec: dict, parsed: list[tuple[Path, pa.Table | BatchStream | None]], **params + ) -> list[tuple[str, pa.Table | BatchStream]]: ... ``` - - `parsed` contains one `(path, table)` tuple per parsed file; `table` is `None` when `parse.reader = "custom"`. - - Return `[(output_slug, table), ...]` — one tuple per output parquet. Multi-output handlers emit several slugs from one source (see `glove_split`, `osm_pbf_split`, `stack_exchange_split`). - - **Streaming handlers** (write direct to parquet, bypass the write stage) return `[]`. See [below](#writing-a-streaming-handler). + - `parsed` contains one `(path, table)` tuple per parsed file; `table` is a `BatchStream` for a reader the handler declares with `batches.batch_input`, and `None` when `parse.reader = "custom"`. + - Return `[(output_slug, table), ...]` — one tuple per canonical output, a `Table` or a fixed-schema `BatchStream`. Multi-output handlers emit several slugs from one source (see `glove_split`, `osm_pbf_split`, `stack_exchange_split`). + - **Streaming handlers** write the canonical Arrow spine themselves (incrementally, via `canonical.open_canonical_writer`), bypassing the `write_canonical` stage, and return `[]`; the exporters then derive parquet/vortex from that canonical like any other slug. See [below](#writing-a-streaming-handler). -2. **Register** in `scripts/pipeline/handlers/__init__.py`: +2. **Declare** it in `HANDLERS` in `raincloud/_registry.py`: ```python - from . import - _REGISTRY = { + # raincloud/_registry.py + HANDLERS: dict[str, str] = { ... - "": , + "": ":", # ":" under handlers/ } ``` +That is the only place to add it. The registry imports the module on demand and +the catalog capability list is derived from the same declaration, so there is no +second file to keep in step. + 3. **Wire in the manifest:** ```jsonc "transform": { "handler": "", "params": { ... } } ``` -4. **Smoke-test:** `.venv/bin/python -c "from scripts.pipeline.handlers import _REGISTRY; print('' in _REGISTRY)"`. +4. **Smoke-test:** `.venv/bin/python -c "from raincloud.pipeline.handlers import _REGISTRY; print('' in _REGISTRY)"`. ## Writing a streaming handler Use this pattern when the full dataset can't fit in memory and you need to spill to disk during ingestion. -Template (based on `jsonbench_variant_parse`, `wikipedia_variant_parse`, `lichess_pgn_parse`): +A streaming handler opens the canonical Arrow spine with `canonical.open_canonical_writer(spec["slug"], schema)` and writes `RecordBatch`es (or tables) into it incrementally, then `return []`. The build's `write_canonical` stage becomes a no-op for it, and `validate → run_exporters` (parquet@py + vortex@py) run over the canonical the handler wrote — exactly as for a table-path slug. Look at `lichess_pgn_parse` / `osm_pbf_split` / `stack_exchange_split` for real, current examples. + +Use [`templates/streaming_handler.py.tmpl`](templates/streaming_handler.py.tmpl) for an executable NDJSON example: it ingests into a scratch DuckDB table, streams Arrow batches into `open_canonical_writer`, and removes its own scratch database. + +A handler depends on two things `build.run_one` sets up around it, so run it only through the builder. `workdir_root()` is the recipe's own scratch directory only inside `spec.recipe_scratch()`; called elsewhere it is the unscoped scratch root. `open_canonical_writer` registers the canonical it writes with the build's outputs (`lifecycle.build_outputs`), which is what publishes it atomically when the build succeeds. Around those, `run_one` holds the operation lock on the configured roots and writes the build record. ```python -from ..spec import REPO_ROOT, duckdb_connect, spec_field, outputs_root +from raincloud import duckdb_connect -def my_streaming_handler(spec, parsed): - # 1. Resolve output path - out_path = outputs_root() / spec["slug"] / spec_field( - spec, "write.output", f"{spec['slug']}.parquet") - out_path.parent.mkdir(parents=True, exist_ok=True) - compression = spec_field(spec, "write.compression", "zstd") - - # 2. Set up scratch DB under _workdir// — helper applies v1.5.0 - workdir = REPO_ROOT / "_workdir" / spec["slug"] - workdir.mkdir(parents=True, exist_ok=True) - db_path = workdir / "build.duckdb" - if db_path.exists(): db_path.unlink() - con = duckdb_connect(db_path) - - try: - # 3. Stream input into a DuckDB table, then COPY TO PARQUET - ... - finally: - con.close() - if db_path.exists(): db_path.unlink() +from ..canonical import open_canonical_writer - print(f" wrote {out_path.relative_to(REPO_ROOT)}") - return [] # <-- streaming contract: write stage is a no-op +def my_streaming_handler(spec, parsed): + with duckdb_connect() as con: + reader = con.execute( + "SELECT * FROM read_json_auto(?, format='newline_delimited')", + [[str(path) for path, _ in parsed]], + ).to_arrow_reader(65536) + with reader, open_canonical_writer(spec["slug"], reader.schema) as writer: + for batch in reader: + writer.write_batch(batch) + return [] ``` +For DuckDB VARIANT, use `duckdb_variant.stream_canonical_arrow` to bridge the query result to canonical Arrow with the required shredded representation and field marker. A plain DuckDB Arrow fetch cannot preserve that logical type. `stream_canonical_arrow` expects the SQL to project each VARIANT column through `variant_to_parquet_variant(...)` itself; `to_canonical_arrow` does that projection for you. See `jsonbench_variant_parse` and `wikipedia_variant_parse` for streaming examples. + `spec.parse.reader = "custom"` is how the manifest tells the pipeline to skip the normal parser and hand raw file paths to the handler. ## Promoting a JSON column to VARIANT -Two paths depending on whether the parquet already exists: - -**Existing parquet (in-place tightening):** +Promote JSON in the transform recipe and rebuild the canonical Arrow artifact and exports; exports are never rewritten in place, since they would diverge from the canonical spine. Heavily-nested payloads (e.g. Open Food Facts) need a generous `RAINCLOUD_DUCKDB_MEMORY_LIMIT`; 96 GB is the tested ceiling. -```bash -python -m scripts.pipeline.tighten_variant # all built parquets -python -m scripts.pipeline.tighten_variant ... # specific slugs -python -m scripts.pipeline.tighten_variant --dry-run -``` - -The pass is idempotent: parquets already lacking JSON-annotated columns are skipped. Uses `CAST(col AS VARIANT)` + atomic tmp-rename. Heavily-nested payloads (e.g. Open Food Facts) need a generous `RAINCLOUD_DUCKDB_MEMORY_LIMIT`; 96 GB is the tested ceiling. - -**New-build handler (emit VARIANT from the start):** - -Write a streaming handler that uses DuckDB's `CAST(to_json(col) AS VARIANT)` inside the `COPY ... TO PARQUET` statement. See `factbook_variant_parse` for the simplest 1-column example and `wikipedia_variant_parse` for the multi-column-with-typed-siblings example. +Build the VARIANT column in DuckDB from parsed JSON, `CAST(CAST(col AS JSON) AS VARIANT)` (a bare text-to-VARIANT cast would store the JSON as one string), then project it through `variant_to_parquet_variant(...)` — the scalar that shreds a VARIANT to the `struct` Arrow can carry — and write the **canonical Arrow spine**: for a small input, materialize the table with `duckdb_variant.to_canonical_arrow` and return `[(slug, table)]` (see `factbook_variant_parse`, ~1-column); for a large one, stream batch-by-batch through `duckdb_variant.stream_canonical_arrow` + `open_canonical_writer` and return `[]` (see `jsonbench_variant_parse`, single-column, and `wikipedia_variant_parse`, multi-column-with-typed-siblings). Either way the exporters derive Parquet/Vortex from the spine — pyarrow can't emit the VARIANT *logical* type, so the Parquet exporter records `variant_faithful=False` while preserving the shredded struct. The bridge's stamp (`variant.attach_variant` / `attach_variant_schema`) declares the struct's `metadata`, and an unshredded `value`, non-nullable, as the Parquet VARIANT spec and `arrow.parquet.variant` require (DuckDB exports every field nullable), so Parquet writers emit `required binary metadata`; a non-null VARIANT row missing either fails the build naming the column and rows. A NULL cell stays a null struct. A shredded `typed_value` that is itself a struct or list is refused, since its fields would need declaring too. VARIANT requires a persistent DuckDB DB opened at `storage_compatibility_version=v1.5.0` — `duckdb_connect(db_path)` applies that automatically. @@ -326,110 +326,137 @@ VARIANT requires a persistent DuckDB DB opened at `storage_compatibility_version - Narrows integer columns by min/max (`int64 → uint8/uint16/int32/...`). - Re-annotates `binary` columns as `string` when their bytes are valid UTF-8 (fixes the common DuckDB/ClickHouse export pattern where VARCHAR ships as unannotated BYTE_ARRAY). -To apply it to a new dataset, set `"transform": {"handler": "tighten_types"}` in the manifest. Runs automatically for the 62 slugs already wired. +To apply it to a new dataset, set `"transform": {"handler": "tighten_types"}` in the manifest. Runs automatically for the slugs already wired. -There's no standalone in-place `tighten_types` script (unlike `tighten_variant.py`) because the integer width / string annotation pass is cheap enough to do during build rather than as a post-pass. +There's no standalone in-place `tighten_types` script because the integer width / string annotation pass is cheap enough to do during build rather than as a post-pass. ## Hydrating a URL column -Optional stage 8 — for slugs that opted in via a `hydrate` block in the manifest, dereference each row's URL into a sibling parquet at `outputs/v{n}//parquet-hydrated/.parquet`. Off the default build path; invoke separately: +A hydrated dataset is its own manifest entry, `-hydrated`, that derives from an ordinary dataset instead of fetching an upstream: + +```json +{"slug": "laion-400m-hydrated", "short_name": "...", "full_name": "...", "description": "...", "license": {...}, + "derive": {"from": "laion-400m", "hydrate": {"columns": {"url": {"into": "content", "type": "binary"}}}}, + "advisory": "why a reader probably wants laion-400m instead"} +``` + +It has no fetch/extract/parse/transform stages: the build reads the parent's canonical Arrow, fetches each listed column's URLs into ``, appends a `__provenance` struct per column, and exports as usual. Never built unless named (`build --all` skips it): ```bash -python -m scripts.pipeline.hydrate # one slug -python -m scripts.pipeline.hydrate --limit 100 # first 100 rows (recommended for first run) -python -m scripts.pipeline.hydrate --all # every spec with hydrate +raincloud build laion-400m-hydrated # safe defaults +python -m raincloud.pipeline.hydrate laion-400m-hydrated --limit 100 # a sample of the first 100 rows, in scratch +python -m raincloud.pipeline.hydrate --all # every hydrated dataset ``` -The hydrated parquet is a **separate, deliberately sketchy artefact tier**: no file-size guarantees, no reproducibility (URLs die, content drifts), no completeness (rows that fail filter / fetch keep null `` cells, with a per-row `_hydrate_provenance` struct recording why). +`hydrate` also accepts the bare parent (`hydrate laion-400m`) for its `-hydrated` entry. Options that change what is fetched (`--limit`, `--block`, `--urlhaus`, a non-default `--max-bytes` or `--timeout`, the bypass) make the run a **sample** in scratch, never published or served; [`HYDRATING.md`](HYDRATING.md) has the full rule. + +It is **deliberately sketchy**: no file-size guarantees, no reproducibility (URLs die, content drifts), no completeness (rows that fail filter / fetch keep null cells, with the provenance struct recording why). Loading one emits `HydratedDatasetWarning`. ### Safety filter -Always on by default. Layered, all opt-out: +On by default. The scheme allowlist and `blocked_hosts_extra` apply unless the two-flag bypass is active; `--block` and `--urlhaus` are opt-in, and a run that uses them is a sample: -| Layer | How to extend | How to disable | -|---|---|---| -| Scheme allowlist (`http`/`https` only) | — | bypass-only (see below) | -| Per-slug `hydrate.blocked_hosts_extra` | edit the manifest | bypass-only | -| Per-run blocklist | `--block FILE` (repeatable; one host per line; `/etc/hosts`-style accepted; `#`-comments stripped) | omit the flag | -| URLhaus | `--urlhaus` (off by default; cached 24h under `_workdir/.urlhaus.hostfile`) | omit the flag | +| Layer | Applies to | How to extend | How to disable | +|---|---|---|---| +| Scheme allowlist (`http`/`https` only) | the dataset and samples | — | bypass-only (see below) | +| Per-dataset `derive.hydrate.blocked_hosts_extra` | the dataset and samples | edit the manifest | bypass-only | +| Per-run blocklist | samples only | `--block FILE` (repeatable; one host per line; `/etc/hosts`-style accepted; `#`-comments stripped) | omit the flag | +| URLhaus | samples only | `--urlhaus` (off by default; cached 24h under `/.urlhaus.hostfile`) | omit the flag | -Raincloud ships the **mechanism**, not the **policy** — no static "unsafe" list is bundled. Plug in upstream filter sources you trust ([StevenBlack/hosts](https://github.com/StevenBlack/hosts), URLhaus, IWF feeds for members, your corporate DNS list) or run hydration behind a DNS-filtered network (CleanBrowsing, Quad9, Cloudflare 1.1.1.2). See [`HYDRATING.md`](HYDRATING.md) for the full discussion. +Raincloud ships the **mechanism**, not the **policy** — no static "unsafe" list is bundled. A blocklist that must govern the published dataset goes in `derive.hydrate.blocked_hosts_extra`, or run hydration behind a DNS-filtered network (CleanBrowsing, Quad9, Cloudflare 1.1.1.2); `--block` and `--urlhaus` preview what such a list would remove ([StevenBlack/hosts](https://github.com/StevenBlack/hosts), URLhaus, IWF feeds for members, your corporate DNS list). See [`HYDRATING.md`](HYDRATING.md) for the full discussion. ### Bypass Both flags are required — single-flag accident is impossible: ```bash -python -m scripts.pipeline.hydrate --unsafe-allow-all-domains --i-accept-the-risk +python -m raincloud.pipeline.hydrate -hydrated --unsafe-allow-all-domains --i-accept-the-risk ``` -The bypass is for narrow research use against URL columns you've separately verified. **Do not** suggest it as a default. A multi-line warning prints regardless. +The bypass turns off **every** layer above, including the scheme allowlist and the dataset's own `blocked_hosts_extra`: each URL is fetched whatever its scheme or host, and the run is a sample. Its fetched rows record `filter_decision = "allowed"`. It is for narrow research use against URL columns you've separately verified. **Do not** suggest it as a default. A multi-line warning prints regardless. ### Tuning -- `--concurrency N` (default 8) — many origins rate-limit aggressively; raise carefully. -- `--timeout SEC` (default 30). -- `--max-bytes N` (default 10 MB) — per-row payload cap; truncated rows record `error="truncated"` in provenance. +- `--concurrency N` (default 8) — many origins rate-limit aggressively; raise carefully. It never makes a sample. +- `--timeout SEC` (default 30) — a non-default value makes the run a sample. +- `--max-bytes N` (default 10 MB) — per-row payload cap; truncated rows record `error="truncated"` in provenance. A non-default value makes the run a sample. -### Vortex companion - -When the slug has `convert.vortex: true`, the hydrate stage **auto-runs** vortex conversion at the end of its work, writing `outputs/v{n}//vortex-hydrated/.vortex` alongside the hydrated parquet. Same opt-in flag as the base — no separate manifest field. Standalone `python -m scripts.pipeline.convert ` also handles both pairs in one invocation. - -After a hydrate run, rerun `python -m scripts.pipeline.docs hydrated` if you've edited any `hydrate` blocks (the doc generates from the manifest, not from runs). +After a hydrated build, regenerate with `python -m raincloud.pipeline.docs`. List hydrated datasets with `python -m raincloud.pipeline.list_datasets --hydrate --long`. ## Debugging a failing build -1. Run with `--loose` to downgrade row-count mismatches from errors to warnings: `python -m scripts.pipeline.build --loose`. -2. Invoke individual stages to isolate: `python -m scripts.pipeline.fetch `, `python -m scripts.pipeline.extract `. -3. Check `outputs/raw_downloads//` — fetch skips when `expected_bytes` / `expected_sha256` match. Delete the dir to force a re-fetch. -4. Check `_workdir//` — contains extract stage output. If the handler complains "no .xxx files", look here first. +1. Row-count mismatches are `[WARN]` by default — a build only hard-fails on them under `--strict`. If a build IS failing on drift, drop `--strict` to see the rest of the pipeline run. +2. Invoke individual stages to isolate: `python -m raincloud.pipeline.fetch `, then `python -m raincloud.pipeline.extract `. These stage commands take slugs or `--all` (and `--help`), not the build's flags; an unknown name exits 2 with a did-you-mean. `fetch --verify` re-hashes receipt-backed HTTP (and UCI) downloads against their recorded sha256 instead of trusting their size. +3. Check the selected raw cache using `raincloud.pipeline.spec.raw_slug_dir(slug)` and the configured roots shown by `raincloud config show`. Invalidate only that generation's upstream payloads; preserve sibling `.recipes/` generations and internal metadata. +4. Check the configured scratch root's `.recipes///` directory — contains build extract output. If the handler complains "no .xxx files", look here first. 5. For DuckDB OOM / swap issues: cap memory via `RAINCLOUD_DUCKDB_MEMORY_LIMIT` and redirect spill via `RAINCLOUD_DUCKDB_TEMP_DIRECTORY`. ## Running a large build safely +Logs go to a persistent directory. Never `/tmp`: on many machines it is tmpfs, and a reboot mid-build would delete the only record of what failed. Pick a directory on durable disk, for example beside the data directory `raincloud config show` reports. Not beside the scratch root: outside a checkout that is the user cache, which is disposable: + ```bash +LOG_DIR=/path/to/durable/logs # e.g. beside the data dir, never under a cache or /tmp +mkdir -p "$LOG_DIR" RAINCLOUD_DUCKDB_MEMORY_LIMIT=32GB \ RAINCLOUD_DUCKDB_TEMP_DIRECTORY=/mnt/scratch/duckdb-tmp \ PYTHONUNBUFFERED=1 \ - nohup python -m scripts.pipeline.build wikipedia-structured-contents --loose --clean-workdir \ - > /tmp/wiki-build.log 2>&1 & + nohup python -m raincloud.pipeline.build wikipedia-structured-contents --clean-workdir \ + > "$LOG_DIR/build-wikipedia-structured-contents-$(date +%s).log" 2>&1 & ``` Flags that matter for batch runs: - - `--loose` — first build of a new slug; you don't yet know the exact row count, so downgrade `expect.rows` mismatches to warnings. - - `--clean-workdir` — wipe `_workdir//` after each successful build. Essential when running large batches at once; otherwise decompressed CSVs (Public BI can hit ~100 GB for one workload) accumulate. - - `PYTHONUNBUFFERED=1` — makes the tee'd log file update line-by-line instead of flushing only on buffer fill, so progress is inspectable mid-run. + - (no `--strict`) — the default for a first build of a new slug: you don't yet know the exact row count, and `expect.rows` drift stays a warning. Add `--strict` only for CI / pre-release gates. + - `--clean-workdir` — wipe only `/.recipes///` after each successful build. Standalone extraction uses the same directory. Essential when running large batches at once; otherwise decompressed CSVs (Public BI can hit ~100 GB for one workload) accumulate. + - `PYTHONUNBUFFERED=1` — makes the log file update line-by-line instead of flushing only on buffer fill, so progress is inspectable mid-run. Monitor: ```bash -tail -f /tmp/wiki-build.log -du -sh _workdir/wikipedia-structured-contents/ # scratch growth -df -h . # disk headroom +LOG_DIR=/path/to/durable/logs # the same directory; a new shell does not inherit it +tail -f "$LOG_DIR"/build-wikipedia-structured-contents-*.log +du -sh /.recipes/*/wikipedia-structured-contents/ # scratch growth +df -h # disk headroom ``` ## Regenerating specific docs ```bash -python -m scripts.pipeline.docs # all three (datasets.md + handlers.md + snapshot.json) -python -m scripts.pipeline.docs datasets # just datasets.md -python -m scripts.pipeline.docs handlers # just handlers.md (registry + manifest usage) -python -m scripts.pipeline.docs snapshot # just snapshot.json (per-slug schema + sizes) +python -m raincloud.pipeline.docs # all three (datasets.md + handlers.md + snapshot.json) +python -m raincloud.pipeline.docs datasets # just datasets.md +python -m raincloud.pipeline.docs handlers # just handlers.md (registry + manifest usage) +python -m raincloud.pipeline.docs snapshot # just snapshot.json (per-slug schema + sizes) ``` -Writes land in `docs/{datasets.md, handlers.md, snapshot.json}` (gitignored scratch). To promote, copy to the tracked `docs/v{schema_version}/`. +For the checkout catalog, writes land in `docs/{datasets.md, handlers.md, snapshot.json}` (gitignored scratch); inspect before promoting to current `docs/v2/`. Frozen `docs/v1/` remains unchanged. Installed, pinned and custom catalogs write under `/.raincloud/observations//`, outside both the installation and immutable bundle. -Regenerate **after** any of: build, convert run, in-place tightening, manifest edit that changes short_name / license / description / expect.rows. Skip if the change doesn't affect the catalog or the handler registry. +Regenerate **after** any of: build, export run, manifest edit that changes short_name / license / description / expect.rows. Skip if the change doesn't affect the catalog or the handler registry. **`snapshot.json` is the load-bearing fallback** — `datasets.md` regen reads it for any slug whose parquet isn't on disk locally (otherwise the row would dash out the row count, sizes, and column-derived "Data Kind" tag). The no-args form keeps snapshot + datasets in lockstep; if you do a partial regen with `docs.py datasets`, run `docs.py snapshot` first (or just use the no-args form) so the table doesn't drift. -The other catalog views (columns, coverage, vortex-skip, hydration candidates) are no longer markdown — query them via `python -m scripts.pipeline.list_datasets --columns / --coverage / --no-vortex / --hydrate` or interactively in the TUI (`python -m scripts.pipeline.browse`). +The other catalog views (columns, coverage, datasets without Vortex, hydrated datasets) are queryable rather than markdown — use `python -m raincloud.pipeline.list_datasets --columns / --coverage / --no-vortex / --hydrate` or interactively in the TUI (`python -m raincloud.pipeline.browse`). ## Removing a dataset -1. Remove the `DatasetSpec` entry from `sources.json` (Python load-edit-dump). -2. Delete the output parquet: `rm -rf outputs/v1//`. -3. Optionally delete the raw cache: `rm -rf outputs/raw_downloads//` (only if you're certain you won't re-add it). -4. Regenerate docs: `python -m scripts.pipeline.docs`. +The procedure is the `/raincloud-remove-dataset` skill. In short: + +1. **Check for dependents and resolve the paths** before editing the manifest. A `-hydrated` child (`list_datasets --hydrate --long`) goes with its parent, or is re-parented. `operation_lock` takes the store, raw and scratch locks while the paths are resolved, and releases them when the block ends: + + ```python + from raincloud.pipeline.lifecycle import operation_lock + from raincloud.pipeline.spec import outputs_root, raw_slug_dir, recipe_workdir_root + + slug = "my-dataset" + with operation_lock(resources=True) as ctx: + manifest = ctx.manifest + spec = next(s for s in manifest["datasets"] if s["slug"] == slug) + print(outputs_root() / slug) # built files, current schema_version + print(raw_slug_dir(slug)) # raw payloads, shared across versions + print(recipe_workdir_root(spec, manifest) / slug) # this recipe's scratch + ``` + +2. **Delete what the user asked for, while no build is running.** The output directory and the recipe scratch, and the raw payloads only if requested. When the raw path printed is `/` itself, delete its payload files and keep its `.recipes/` subdirectory, which holds other catalogs' generations. Never delete an older `outputs/v{n}/` (a frozen version; nothing regenerates it), a `.recipes/` generation other than the one printed, or through a symlink (unlink the link itself). +3. **Remove the `DatasetSpec`** from the checkout's `sources.json` (Python load-edit-dump), or package a new bundle for an installed catalog; never edit an installed revision in place. +4. **Regenerate and promote the docs:** `python -m raincloud.pipeline.docs`, then copy `docs/{snapshot.json,datasets.md,handlers.md}` into `docs/v2/` and review the diff. If a handler is now unused, delete its module and its `HANDLERS` entry in `raincloud/_registry.py`. Don't bother with backwards-compat shims — removed means removed. Git history is the fallback (`.archive/` is gitignored and only present on the maintainer's tree). diff --git a/clients/README.md b/clients/README.md new file mode 100644 index 0000000..cd412ac --- /dev/null +++ b/clients/README.md @@ -0,0 +1,223 @@ +# Prepared-data readers + +Raincloud 0.3 provides lazy dataset handles in Python, Rust, C, C++, and Java. +Metadata access never fetches artifact bytes. Resolving a path, reading a schema, +or opening batches can download the selected artifact. Reads do not build data. +Use `raincloud build SLUG`, or explicitly opt in with Python `load(..., build=True)`. +These sources are not yet published as native binary packages. + +There is one implementation of everything before the bytes: catalog selection, +settings, resolution, downloads and checksums all live in the Python package, +behind the `raincloud` command line tool. The Rust, C, C++ and +Java readers run `raincloud describe` and `raincloud load` (with `--json`) and +decode the file it names; they never parse a catalog themselves. Their options +are the same settings the TOML takes, passed through for the CLI to validate in +its environment (`RAINCLOUD_SETTINGS`), never on its command line, which every +account on the machine can read. They find the CLI through the `cli` option, +then `RAINCLOUD_CLI`, then `PATH`. + +Opening a handle, and each path, schema or batches call, runs one `raincloud` +process and blocks until it exits. The process inherits the caller's +environment, working directory (relative settings resolve against it) and +stderr, so its warnings reach the caller's terminal or log, and it may wait on +the store's download lock with no timeout. + +Settings resolve as API overrides > environment > TOML > native user +directories. `data_dir` can point at a mounted HDD; reads use valid files in +place before checking `cache_dir` and a mirror. Readers never refresh a catalog +implicitly. Use the `raincloud catalog` commands to pack/update/pin/rollback, or +select a bundle or pack directory directly. A handle stays on the catalog +generation it opened with, in every language: an installed revision or a pack +directory resolves to that same generation again, and a checkout, local +manifest or bundled catalog that has changed since the handle opened is refused +(a catalog error) rather than read. A handle's metadata names its +`catalog_source` and `catalog_revision`: select `catalog_source` (the `catalog` +setting) to reopen the same catalog, and compare `catalog_revision` to detect a +change. + +## Selection and integrity + +`auto` prefers Vortex, Parquet, then canonical Arrow IPC among advertised artifacts +the reader can decode: Python's installed readers, or the formats a native library +was built with (a build without Vortex never picks it). A dataset has one file per format; which writer made +it (`py`, `rs`, ...) is recorded in the catalog and shown in the dataset's metadata, +but is never something to ask for. Selection is deterministic from catalog metadata; +it does not probe remote files. An explicitly selected format never substitutes another. + +Mirrors use Python's transports (file, HTTP(S), and optional fsspec ones such +as S3) for every client. A mirror artifact is downloaded atomically before batch reading; these APIs do +not perform remote range scans. Offline mode never downloads or builds. +The catalog is the authority on each artifact's sha256 and byte size. A local +file at its key with the catalog's size is the artifact; one with another size +is refused, with the command that fixes it. Mirror bytes must match the +catalog's sha256 (its size when it records none) or they are refused with a +checksum mismatch. Serving a read-only local store needs no writes. + +The Python reader uses PyArrow/Vortex Python. The Rust, C, C++, and Java APIs share +the Rust reader core; Java imports native batches through Arrow's C stream JNI +bridge. The existing JVM and other conformance sidecars remain separate readers. +These clients do not run conformance tests during ordinary reads. Format support +does not promise support for every type or preservation of every extension +annotation: Vortex may infer a different physical Arrow representation, and +unsupported types fail in the selected reader. Build without Rust's default +`vortex` feature for an IPC/Parquet-only library: `auto` then never selects +Vortex, and an explicit Vortex handle resolves its path but refuses to decode it. +Column projection (`columns=`) is Python-only; the native APIs read every column. + +## Python + +The base Python install reads IPC and Parquet. Add `[vortex]` for Vortex; +`raincloud capabilities` reports installed reader modules. + +```python +import raincloud + +ds = raincloud.load("uci-seeds", format="parquet") +print(ds.catalog_revision, ds.artifacts) # metadata only +with ds.batches(batch_size=65536, columns=["area"]) as batches: + for batch in batches: + consume(batch) # PyArrow RecordBatch +# ds.to_arrow() explicitly materializes the entire table. +``` + +## Rust + +Build from `clients/rust` with Cargo (Rust 1.95 or newer). Reads need the +`raincloud` CLI installed. Use the library as a path dependency until it is published. + +```rust,no_run +use raincloud_reader::{Dataset, RecordBatchReader}; +use serde_json::json; + +let ds = raincloud_reader::load("uci-seeds")?; // defaults, automatic format +let ds = Dataset::load(&json!({"config": "/path/to/config.toml"}), "uci-seeds", "parquet")?; +let batches = ds.batches(65536)?; +println!("{:?}", batches.schema()); +for batch in batches { consume(batch?); } +``` + +The synchronous API owns its reader/runtime and drops them with the iterator. +Call it on a blocking thread when integrating with an async application. +Returned batches own their buffers. `batch_size` bounds returned rows, not the +size of an encoded IPC/Vortex batch that a decoder must decompress. + +## C and C++ + +```sh +cmake -S clients/c -B build/native -DCMAKE_INSTALL_PREFIX="$HOME/.local" +cmake --build build/native +cmake --install build/native +``` + +An installed CMake consumer can use: + +```cmake +find_package(raincloud 0.3 CONFIG REQUIRED) +target_link_libraries(my_reader PRIVATE raincloud::reader) +``` + +Pass `-DCMAKE_PREFIX_PATH=/path/to/install` when configuring the consumer. +`-DRAINCLOUD_VORTEX=OFF` builds only +IPC/Parquet support. Native binaries are specific to their OS/architecture. + +The C interface is `raincloud.h`, linked with `libraincloud_reader`. Pure C users +can include the vendored Apache Arrow ABI definitions in `raincloud_arrow_abi.h`; +no Arrow C++ dependency is needed. `raincloud_open` returns an opaque dataset, +`raincloud_metadata` returns JSON, and `raincloud_batches` fills an +`ArrowArrayStream`. Release every returned string, schema, array, stream, and +handle using its documented release function. A stream remains usable after the +dataset handle is closed. `raincloud_abi_version()` currently returns 1. ABI +changes are additive: the version rises when an entry point is added, so check +that it is at least the version that introduced the newest entry point you call +(`raincloud.h` states the rule). + +The shared library's SONAME is `libraincloud_reader.so` (on macOS its install +name is `@rpath/libraincloud_reader.dylib`), so a consumer records the bare name +and finds the library at run time, not at the path it was linked from. Give an +installed consumer a run path to the install's library directory +(`-DCMAKE_INSTALL_RPATH=/path/to/install/lib` or the target's `INSTALL_RPATH`, +or `-Wl,-rpath,...` when linking by hand), or set `LD_LIBRARY_PATH`; a +consumer run from its CMake build tree already has one. + +`raincloud.hpp` is a move-only RAII wrapper. Applications using Arrow C++ can +include `raincloud_arrow.hpp` to receive an Arrow `RecordBatchReader`: + +```cpp +raincloud::Dataset ds("uci-seeds", "parquet"); +ARROW_ASSIGN_OR_RAISE(auto reader, raincloud::batches(ds)); +while (true) { + ARROW_ASSIGN_OR_RAISE(auto batch, reader->Next()); + if (!batch) break; + consume(batch); +} +``` + +Raincloud exposes a C ABI; it does not link against the application's Arrow C++ +version. See `clients/c/tests/` for complete standalone C and C++ consumers. + +## Java + +Build the standalone Gradle library using the repository's wrapper: + +```sh +bash sidecars/java/gradlew -p clients/java installDist \ + -PraincloudNativeLibrary=/path/to/lib/libraincloud_reader.so +``` + +`clients/java/build/install/raincloud-reader/` contains `lib/` with the Java +runtime classpath and, when supplied, `native/` with the native library. Copy that +directory as a unit, then use `-cp "/path/to/distribution/lib/*"` and +`-Djna.library.path=/path/to/distribution/native`. The standalone example in +`clients/java/examples/Read.java` can be compiled against this classpath. +`jar` and `sourcesJar` remain available for applications managing their own deps. + +Alternatively, install the native library above and make its directory visible through +`-Djna.library.path=/path/to/lib`. Use JDK 17+ and +`--add-opens=java.base/java.nio=ALL-UNNAMED`. The library's JAR does not +bundle native binaries. Native library and JVM architecture must match. This integration is verified on Linux x86-64; other +platform binaries still need packaging and verification. Its runtime dependencies +are Arrow Java 19 (`arrow-vector`, `arrow-c-data`, `arrow-memory-netty`), JNA and +Jackson (`jackson-databind`); `bash sidecars/java/gradlew -p clients/java dependencies +--configuration runtimeClasspath` lists them with versions. + +```java +try (var allocator = new RootAllocator(); + var ds = Raincloud.load("uci-seeds", "parquet", Map.of()); + var reader = ds.batches(allocator, 65536)) { + while (reader.loadNextBatch()) { + consume(reader.getVectorSchemaRoot()); + } +} +``` + +Java vectors are valid until the next `loadNextBatch()` or reader close; retain +or copy explicitly to keep them longer. Close readers before their allocator. +Dataset close is independent of readers already opened from it. + +## Errors and verification + +C returns stable error codes and an owned diagnostic string. C++ exposes +`raincloud::Error` for handle and resolution operations, including resolving the +artifact inside `raincloud::batches`, and Arrow status for stream operations. +Rust exposes `ErrorKind`; Java exposes `RaincloudException.Kind`, whose `code` +is the C value. Missing revisions, unknown slugs, unsupported formats, offline +misses, absent artifacts, checksum mismatches, unreadable mirrors (transport), +corrupt artifacts and unsupported types are separate categories; `raincloud.h` +lists the codes and the rules for adding one. Stream callbacks/iterators also +expose the underlying Arrow decode error, and a decoder panic becomes such an +error rather than unwinding into the caller. Corrupt bytes and unsupported +physical types are never silently converted to another format. + +Run `python scripts/test_native_readers.py` in a dev/build Python environment +with Cargo, CMake, a C/C++ compiler, and JDKs 17 and 21 available (the Hardwood +lane builds on 21; Gradle's toolchain resolver provisions a missing JDK), after +`git submodule update --init --recursive`. It builds the native library (with and +without Vortex), generates one small fixture, and verifies Rust, Python/C ABI, the +installed CMake package with its C and C++ consumers (checking the library's +SONAME and the bare name its consumers record), and the Java library and +installed distribution against it. It also builds the Rust and Java sidecars and +runs the conformance suites that use them (`PYTEST_MODULES` in the script lists +the pytest modules). The C/C++ consumers run with an empty executable search path and the +CLI named by `RAINCLOUD_CLI`, so a reader that silently depended on `PATH` would +fail. The runner currently targets Linux; macOS/Windows native builds are not +release-verified. diff --git a/clients/c/CMakeLists.txt b/clients/c/CMakeLists.txt new file mode 100644 index 0000000..306bbc9 --- /dev/null +++ b/clients/c/CMakeLists.txt @@ -0,0 +1,56 @@ +# SPDX-FileCopyrightText: 2026 Raincloud Maintainers +# SPDX-License-Identifier: Apache-2.0 +cmake_minimum_required(VERSION 3.21) +# The release version has one authority; a copy here would let the package +# version drift from the wheel and crate built from the same tree. CMake's +# project(VERSION) takes numeric components only, so a pre-release such as +# 0.3.1rc1 gives the package version 0.3.1. +file(STRINGS "${CMAKE_CURRENT_LIST_DIR}/../../raincloud/__init__.py" RAINCLOUD_VERSION_LINE + REGEX "^__version__ = \"[0-9]+\\.[0-9]+\\.[0-9]+") +if(NOT RAINCLOUD_VERSION_LINE) + message(FATAL_ERROR "no __version__ = \"X.Y.Z...\" in raincloud/__init__.py") +endif() +string(REGEX REPLACE "^__version__ = \"([0-9]+\\.[0-9]+\\.[0-9]+).*$" "\\1" RAINCLOUD_VERSION "${RAINCLOUD_VERSION_LINE}") +project(raincloud VERSION ${RAINCLOUD_VERSION} LANGUAGES C CXX) +include(GNUInstallDirs) +include(CMakePackageConfigHelpers) +find_program(CARGO cargo REQUIRED) +set(RAINCLOUD_CARGO_TARGET "${CMAKE_CURRENT_BINARY_DIR}/cargo" CACHE PATH "Cargo target directory") +option(RAINCLOUD_VORTEX "Include the optional native Vortex reader" ON) +set(RAINCLOUD_FEATURES) +if(NOT RAINCLOUD_VORTEX) + list(APPEND RAINCLOUD_FEATURES --no-default-features) +endif() +if(CMAKE_BUILD_TYPE STREQUAL "Debug") + set(RAINCLOUD_PROFILE dev) + set(RAINCLOUD_PROFILE_DIR debug) +else() + set(RAINCLOUD_PROFILE release) + set(RAINCLOUD_PROFILE_DIR release) +endif() +set(RAINCLOUD_LIBRARY_NAME "${CMAKE_SHARED_LIBRARY_PREFIX}raincloud_reader${CMAKE_SHARED_LIBRARY_SUFFIX}") +set(RAINCLOUD_LIBRARY "${RAINCLOUD_CARGO_TARGET}/${RAINCLOUD_PROFILE_DIR}/${RAINCLOUD_LIBRARY_NAME}") +set(RAINCLOUD_RUNTIME_DIR "${CMAKE_INSTALL_LIBDIR}") +if(WIN32) + set(RAINCLOUD_LIBRARY_NAME "raincloud_reader.dll") + set(RAINCLOUD_LIBRARY "${RAINCLOUD_CARGO_TARGET}/${RAINCLOUD_PROFILE_DIR}/${RAINCLOUD_LIBRARY_NAME}") + set(RAINCLOUD_RUNTIME_DIR "${CMAKE_INSTALL_BINDIR}") + if(MSVC) + set(RAINCLOUD_IMPORT_NAME "raincloud_reader.dll.lib") + else() + set(RAINCLOUD_IMPORT_NAME "libraincloud_reader.dll.a") + endif() + install(FILES "${RAINCLOUD_CARGO_TARGET}/${RAINCLOUD_PROFILE_DIR}/${RAINCLOUD_IMPORT_NAME}" DESTINATION ${CMAKE_INSTALL_LIBDIR}) +endif() +add_custom_target(raincloud_native ALL + COMMAND ${CARGO} build --locked --profile ${RAINCLOUD_PROFILE} ${RAINCLOUD_FEATURES} --manifest-path ${CMAKE_CURRENT_SOURCE_DIR}/../rust/Cargo.toml --target-dir ${RAINCLOUD_CARGO_TARGET} + BYPRODUCTS "${RAINCLOUD_LIBRARY}" VERBATIM) +install(FILES "${RAINCLOUD_LIBRARY}" DESTINATION ${RAINCLOUD_RUNTIME_DIR}) +install(FILES include/raincloud.h include/raincloud_arrow_abi.h include/raincloud.hpp include/raincloud_arrow.hpp DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +configure_package_config_file(cmake/raincloudConfig.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/raincloudConfig.cmake" + INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/raincloud" + PATH_VARS CMAKE_INSTALL_INCLUDEDIR CMAKE_INSTALL_LIBDIR RAINCLOUD_RUNTIME_DIR) +write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/raincloudConfigVersion.cmake" + VERSION ${PROJECT_VERSION} COMPATIBILITY SameMinorVersion) +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/raincloudConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/raincloudConfigVersion.cmake" + DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/raincloud") diff --git a/clients/c/cmake/raincloudConfig.cmake.in b/clients/c/cmake/raincloudConfig.cmake.in new file mode 100644 index 0000000..dbbe6ad --- /dev/null +++ b/clients/c/cmake/raincloudConfig.cmake.in @@ -0,0 +1,12 @@ +@PACKAGE_INIT@ +if(NOT TARGET raincloud::reader) + add_library(raincloud::reader SHARED IMPORTED) + set_target_properties(raincloud::reader PROPERTIES + IMPORTED_LOCATION "@PACKAGE_RAINCLOUD_RUNTIME_DIR@/@RAINCLOUD_LIBRARY_NAME@" + INTERFACE_INCLUDE_DIRECTORIES "@PACKAGE_CMAKE_INSTALL_INCLUDEDIR@") + if(WIN32) + set_target_properties(raincloud::reader PROPERTIES + IMPORTED_IMPLIB "@PACKAGE_CMAKE_INSTALL_LIBDIR@/@RAINCLOUD_IMPORT_NAME@") + endif() +endif() +check_required_components(raincloud) diff --git a/clients/c/include/raincloud.h b/clients/c/include/raincloud.h new file mode 100644 index 0000000..94a3698 --- /dev/null +++ b/clients/c/include/raincloud.h @@ -0,0 +1,78 @@ +/* SPDX-License-Identifier: Apache-2.0 */ +#ifndef RAINCLOUD_H +#define RAINCLOUD_H +#include +#include +#ifdef __cplusplus +extern "C" { +#endif +struct ArrowArrayStream; +typedef struct raincloud_dataset raincloud_dataset; +typedef struct { int32_t code; char *message; } raincloud_error; +/* Error codes. The numbers are ABI: codes are only ever appended, never + * renumbered or reused, and a caller must treat a code it does not know as + * RAINCLOUD_INTERNAL. */ +enum raincloud_error_code { + RAINCLOUD_OK=0, RAINCLOUD_INVALID_ARGUMENT=1, RAINCLOUD_CATALOG=2, + RAINCLOUD_MISSING_REVISION=3, RAINCLOUD_UNKNOWN_SLUG=4, + RAINCLOUD_FORMAT_UNAVAILABLE=5, RAINCLOUD_OFFLINE_MISS=6, + RAINCLOUD_ARTIFACT_NOT_FOUND=7, RAINCLOUD_CHECKSUM_MISMATCH=8, + /* Producer-side (build/publish); a read never returns it. */ + RAINCLOUD_CATALOG_CONFLICT=9, + /* The mirror could not be read: unreachable, refused, or not a store. A + * mirror that answers "no such file" is ARTIFACT_NOT_FOUND. */ + RAINCLOUD_TRANSPORT=10, + /* The bytes are fine and this build cannot represent their type: ask for + * another format. */ + RAINCLOUD_UNSUPPORTED_TYPE=11, RAINCLOUD_IO=12, RAINCLOUD_INTERNAL=13, + /* Found but undecodable: truncated, damaged, or not the claimed format. + * Re-fetch or rebuild it; another format will not help. */ + RAINCLOUD_CORRUPT_ARTIFACT=14 +}; +/* ABI changes are additive. The version rises when an entry point is added, + * so a client that calls an entry point introduced at version N checks + * raincloud_abi_version() >= N. Appending an error code does not raise it + * (see above). An existing entry point, struct or code never changes meaning + * under this library name: an incompatible change would ship as a library + * with a new name, never as a higher version of this one. */ +uint32_t raincloud_abi_version(void); +/* Every open/path/batches call runs one `raincloud` process and blocks until + * it exits. The process inherits this one's environment, working directory + * (relative settings resolve against it) and stderr, and may wait on the + * store's download lock with no timeout. + * + * UTF-8 options JSON: Raincloud settings (the TOML keys, plus config and + * no_config), which override environment/TOML. NULL = {}. Catalog selection, + * resolution, downloads and verification run in the `raincloud` CLI: the + * "cli" option names it, else RAINCLOUD_CLI, else PATH. Settings reach it + * through its environment, never its command line. + * format: auto, arrow, parquet, or vortex; auto chooses among the formats + * this library was built to decode. + * open loads catalog metadata only. No artifact I/O or implicit builds. + * Outputs must be writable; errors must be zero-initialized and freed before + * reuse. A NULL error pointer discards details; return code always reports failure. + * Handles are immutable; do not close one while another thread is using it. + * A handle stays on the catalog generation it opened with: path and batches + * return RAINCLOUD_CATALOG if the selected catalog has changed since. */ +int32_t raincloud_open(const char *options, const char *slug, const char *format, + raincloud_dataset **out, raincloud_error *error); +/* Strings returned on success belong to caller; release with string_free. */ +int32_t raincloud_metadata(const raincloud_dataset *, char **out, raincloud_error *); +int32_t raincloud_path(const raincloud_dataset *, char **out, raincloud_error *); +/* out must be uninitialized/released ArrowArrayStream storage. Stream owns + * reader independently of dataset handle. Use standard Arrow stream callbacks; + * release every schema, array and stream exactly once. Consuming concurrently + * from the same stream is unsupported. batch_size > 0; encoded chunk sizes may + * exceed this output row limit. Stream callback errors use get_last_error(). + * Stream callbacks never unwind: a decoder panic (damaged bytes or a decoder + * bug; the two cannot be told apart) is an error from get_next, after which + * the stream is at its end. */ +int32_t raincloud_batches(const raincloud_dataset *, size_t batch_size, + struct ArrowArrayStream *out, raincloud_error *); +void raincloud_close(raincloud_dataset *); +void raincloud_string_free(char *); +void raincloud_error_free(raincloud_error *); +#ifdef __cplusplus +} +#endif +#endif diff --git a/clients/c/include/raincloud.hpp b/clients/c/include/raincloud.hpp new file mode 100644 index 0000000..bdf61f6 --- /dev/null +++ b/clients/c/include/raincloud.hpp @@ -0,0 +1,40 @@ +// SPDX-License-Identifier: Apache-2.0 +#ifndef RAINCLOUD_HPP +#define RAINCLOUD_HPP +#include "raincloud.h" +#include +#include +#include +namespace raincloud { +class Error : public std::runtime_error { + public: + const int code; + Error(int code, const std::string& message) : std::runtime_error(message), code(code) {} +}; +inline void check(int code, raincloud_error& error) { + std::unique_ptr cleanup(&error, raincloud_error_free); + if (code) throw Error(code, error.message ? error.message : "Raincloud error"); +} +class Dataset { + std::unique_ptr handle_{nullptr, raincloud_close}; + public: + explicit Dataset(const std::string& slug, const std::string& format="auto", const std::string& options="{}") { + raincloud_error error{}; raincloud_dataset* out=nullptr; + int code=raincloud_open(options.c_str(), slug.c_str(), format.c_str(), &out, &error); + handle_.reset(out); check(code,error); + } + Dataset(Dataset&&) noexcept=default; + Dataset& operator=(Dataset&&) noexcept=default; + raincloud_dataset* get() const noexcept { return handle_.get(); } + std::string metadata() const { return string_call(raincloud_metadata); } + std::string path() const { return string_call(raincloud_path); } + private: + std::string string_call(int32_t (*fn)(const raincloud_dataset*,char**,raincloud_error*)) const { + raincloud_error error{}; char* out=nullptr; + int code=fn(get(),&out,&error); + std::unique_ptr owned(out,raincloud_string_free); + check(code,error); return owned.get(); + } +}; +} +#endif diff --git a/clients/c/include/raincloud_arrow.hpp b/clients/c/include/raincloud_arrow.hpp new file mode 100644 index 0000000..8474da3 --- /dev/null +++ b/clients/c/include/raincloud_arrow.hpp @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: Apache-2.0 +#ifndef RAINCLOUD_ARROW_HPP +#define RAINCLOUD_ARROW_HPP +#include "raincloud.hpp" +#include +namespace raincloud { +/* Requires Arrow C++ only in the consuming application; Raincloud's shared + * library exposes a C ABI and does not link against that Arrow C++ version. + * Resolving the artifact (an offline miss, a checksum mismatch, ...) throws + * raincloud::Error with its code, as the handle operations do; the returned + * Result and reader->Next() carry Arrow's own status for the stream. */ +inline arrow::Result> batches(const Dataset& ds, size_t batch_size=65536) { + ArrowArrayStream stream{}; raincloud_error error{}; + check(raincloud_batches(ds.get(),batch_size,&stream,&error),error); + auto reader=arrow::ImportRecordBatchReader(&stream); + if(stream.release) stream.release(&stream); + return reader; +} +} +#endif diff --git a/clients/c/include/raincloud_arrow_abi.h b/clients/c/include/raincloud_arrow_abi.h new file mode 100644 index 0000000..b928a26 --- /dev/null +++ b/clients/c/include/raincloud_arrow_abi.h @@ -0,0 +1,464 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +/// \file abi.h Arrow C Data Interface +/// +/// Vendored from Apache Arrow 24.0.0, cpp/src/arrow/c/abi.h (identical to the +/// copy pyarrow 24.0.0 installs but for this note). Raincloud uses only ArrowSchema, ArrowArray +/// and ArrowArrayStream; the device and async structs come with the file. +/// +/// The Arrow C Data interface defines a very small, stable set +/// of C definitions which can be easily copied into any project's +/// source code and vendored to be used for columnar data interchange +/// in the Arrow format. For non-C/C++ languages and runtimes, +/// it should be almost as easy to translate the C definitions into +/// the corresponding C FFI declarations. +/// +/// Applications and libraries can therefore work with Arrow memory +/// without necessarily using the Arrow libraries or reinventing +/// the wheel. Developers can choose between tight integration +/// with the Arrow software project or minimal integration with +/// the Arrow format only. + +#pragma once + +#include + +// Spec and documentation: https://arrow.apache.org/docs/format/CDataInterface.html + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef ARROW_C_DATA_INTERFACE +# define ARROW_C_DATA_INTERFACE + +# define ARROW_FLAG_DICTIONARY_ORDERED 1 +# define ARROW_FLAG_NULLABLE 2 +# define ARROW_FLAG_MAP_KEYS_SORTED 4 + +struct ArrowSchema { + // Array type description + const char* format; + const char* name; + const char* metadata; + int64_t flags; + int64_t n_children; + struct ArrowSchema** children; + struct ArrowSchema* dictionary; + + // Release callback + void (*release)(struct ArrowSchema*); + // Opaque producer-specific data + void* private_data; +}; + +struct ArrowArray { + // Array data description + int64_t length; + int64_t null_count; + int64_t offset; + int64_t n_buffers; + int64_t n_children; + const void** buffers; + struct ArrowArray** children; + struct ArrowArray* dictionary; + + // Release callback + void (*release)(struct ArrowArray*); + // Opaque producer-specific data + void* private_data; +}; + +# define ARROW_STATISTICS_KEY_AVERAGE_BYTE_WIDTH_EXACT "ARROW:average_byte_width:exact" +# define ARROW_STATISTICS_KEY_AVERAGE_BYTE_WIDTH_APPROXIMATE \ + "ARROW:average_byte_width:approximate" +# define ARROW_STATISTICS_KEY_DISTINCT_COUNT_EXACT "ARROW:distinct_count:exact" +# define ARROW_STATISTICS_KEY_DISTINCT_COUNT_APPROXIMATE \ + "ARROW:distinct_count:approximate" +# define ARROW_STATISTICS_KEY_MAX_BYTE_WIDTH_EXACT "ARROW:max_byte_width:exact" +# define ARROW_STATISTICS_KEY_MAX_BYTE_WIDTH_APPROXIMATE \ + "ARROW:max_byte_width:approximate" +# define ARROW_STATISTICS_KEY_MAX_VALUE_EXACT "ARROW:max_value:exact" +# define ARROW_STATISTICS_KEY_MAX_VALUE_APPROXIMATE "ARROW:max_value:approximate" +# define ARROW_STATISTICS_KEY_MIN_VALUE_EXACT "ARROW:min_value:exact" +# define ARROW_STATISTICS_KEY_MIN_VALUE_APPROXIMATE "ARROW:min_value:approximate" +# define ARROW_STATISTICS_KEY_NULL_COUNT_EXACT "ARROW:null_count:exact" +# define ARROW_STATISTICS_KEY_NULL_COUNT_APPROXIMATE "ARROW:null_count:approximate" +# define ARROW_STATISTICS_KEY_ROW_COUNT_EXACT "ARROW:row_count:exact" +# define ARROW_STATISTICS_KEY_ROW_COUNT_APPROXIMATE "ARROW:row_count:approximate" + +#endif // ARROW_C_DATA_INTERFACE + +#ifndef ARROW_C_DEVICE_DATA_INTERFACE +# define ARROW_C_DEVICE_DATA_INTERFACE + +// Spec and Documentation: https://arrow.apache.org/docs/format/CDeviceDataInterface.html + +// DeviceType for the allocated memory +typedef int32_t ArrowDeviceType; + +// CPU device, same as using ArrowArray directly +# define ARROW_DEVICE_CPU 1 +// CUDA GPU Device +# define ARROW_DEVICE_CUDA 2 +// Pinned CUDA CPU memory by cudaMallocHost +# define ARROW_DEVICE_CUDA_HOST 3 +// OpenCL Device +# define ARROW_DEVICE_OPENCL 4 +// Vulkan buffer for next-gen graphics +# define ARROW_DEVICE_VULKAN 7 +// Metal for Apple GPU +# define ARROW_DEVICE_METAL 8 +// Verilog simulator buffer +# define ARROW_DEVICE_VPI 9 +// ROCm GPUs for AMD GPUs +# define ARROW_DEVICE_ROCM 10 +// Pinned ROCm CPU memory allocated by hipMallocHost +# define ARROW_DEVICE_ROCM_HOST 11 +// Reserved for extension +# define ARROW_DEVICE_EXT_DEV 12 +// CUDA managed/unified memory allocated by cudaMallocManaged +# define ARROW_DEVICE_CUDA_MANAGED 13 +// unified shared memory allocated on a oneAPI non-partitioned device. +# define ARROW_DEVICE_ONEAPI 14 +// GPU support for next-gen WebGPU standard +# define ARROW_DEVICE_WEBGPU 15 +// Qualcomm Hexagon DSP +# define ARROW_DEVICE_HEXAGON 16 + +struct ArrowDeviceArray { + // the Allocated Array + // + // the buffers in the array (along with the buffers of any + // children) are what is allocated on the device. + struct ArrowArray array; + // The device id to identify a specific device + int64_t device_id; + // The type of device which can access this memory. + ArrowDeviceType device_type; + // An event-like object to synchronize on if needed. + void* sync_event; + // Reserved bytes for future expansion. + int64_t reserved[3]; +}; + +#endif // ARROW_C_DEVICE_DATA_INTERFACE + +#ifndef ARROW_C_STREAM_INTERFACE +# define ARROW_C_STREAM_INTERFACE + +struct ArrowArrayStream { + // Callback to get the stream type + // (will be the same for all arrays in the stream). + // + // Return value: 0 if successful, an `errno`-compatible error code otherwise. + // + // If successful, the ArrowSchema must be released independently from the stream. + int (*get_schema)(struct ArrowArrayStream*, struct ArrowSchema* out); + + // Callback to get the next array + // (if no error and the array is released, the stream has ended) + // + // Return value: 0 if successful, an `errno`-compatible error code otherwise. + // + // If successful, the ArrowArray must be released independently from the stream. + int (*get_next)(struct ArrowArrayStream*, struct ArrowArray* out); + + // Callback to get optional detailed error information. + // This must only be called if the last stream operation failed + // with a non-0 return code. + // + // Return value: pointer to a null-terminated character array describing + // the last error, or NULL if no description is available. + // + // The returned pointer is only valid until the next operation on this stream + // (including release). + const char* (*get_last_error)(struct ArrowArrayStream*); + + // Release callback: release the stream's own resources. + // Note that arrays returned by `get_next` must be individually released. + void (*release)(struct ArrowArrayStream*); + + // Opaque producer-specific data + void* private_data; +}; + +#endif // ARROW_C_STREAM_INTERFACE + +#ifndef ARROW_C_DEVICE_STREAM_INTERFACE +# define ARROW_C_DEVICE_STREAM_INTERFACE + +// Equivalent to ArrowArrayStream, but for ArrowDeviceArrays. +// +// This stream is intended to provide a stream of data on a single +// device, if a producer wants data to be produced on multiple devices +// then multiple streams should be provided. One per device. +struct ArrowDeviceArrayStream { + // The device that this stream produces data on. + ArrowDeviceType device_type; + + // Callback to get the stream schema + // (will be the same for all arrays in the stream). + // + // Return value 0 if successful, an `errno`-compatible error code otherwise. + // + // If successful, the ArrowSchema must be released independently from the stream. + // The schema should be accessible via CPU memory. + int (*get_schema)(struct ArrowDeviceArrayStream* self, struct ArrowSchema* out); + + // Callback to get the next array + // (if no error and the array is released, the stream has ended) + // + // Return value: 0 if successful, an `errno`-compatible error code otherwise. + // + // If successful, the ArrowDeviceArray must be released independently from the stream. + int (*get_next)(struct ArrowDeviceArrayStream* self, struct ArrowDeviceArray* out); + + // Callback to get optional detailed error information. + // This must only be called if the last stream operation failed + // with a non-0 return code. + // + // Return value: pointer to a null-terminated character array describing + // the last error, or NULL if no description is available. + // + // The returned pointer is only valid until the next operation on this stream + // (including release). + const char* (*get_last_error)(struct ArrowDeviceArrayStream* self); + + // Release callback: release the stream's own resources. + // Note that arrays returned by `get_next` must be individually released. + void (*release)(struct ArrowDeviceArrayStream* self); + + // Opaque producer-specific data + void* private_data; +}; + +#endif // ARROW_C_DEVICE_STREAM_INTERFACE + +#ifndef ARROW_C_ASYNC_STREAM_INTERFACE +# define ARROW_C_ASYNC_STREAM_INTERFACE + +// EXPERIMENTAL: ArrowAsyncTask represents available data from a producer that was passed +// to an invocation of `on_next_task` on the ArrowAsyncDeviceStreamHandler. +// +// The reason for this Task approach instead of the Async interface returning +// the Array directly is to allow for more complex thread handling and reducing +// context switching and data transfers between CPU cores (e.g. from one L1/L2 +// cache to another) if desired. +// +// For example, the `on_next_task` callback can be called when data is ready, while +// the producer puts potential "decoding" logic in the `ArrowAsyncTask` object. This +// allows for the producer to manage the I/O on one thread which calls `on_next_task` +// and the consumer can determine when the decoding (producer logic in the `extract_data` +// callback of the task) occurs and on which thread, to avoid a CPU core transfer +// (data staying in the L2 cache). +struct ArrowAsyncTask { + // This callback should populate the ArrowDeviceArray associated with this task. + // The order of ArrowAsyncTasks provided by the producer enables a consumer to + // ensure the order of data to process. + // + // This function is expected to be synchronous, but should not perform any blocking + // I/O. Ideally it should be as cheap as possible so as to not tie up the consumer + // thread unnecessarily. + // + // Returns: 0 if successful, errno-compatible error otherwise. + // + // If a non-0 value is returned then it should be followed by a call to `on_error` + // on the appropriate ArrowAsyncDeviceStreamHandler. This is because it's highly + // likely that whatever is calling this function may be entirely disconnected from + // the current control flow. Indicating an error here with a non-zero return allows + // the current flow to be aware of the error occurring, while still allowing any + // logging or error handling to still be centralized in the `on_error` callback of + // the original Async handler. + // + // Rather than a release callback, any required cleanup should be performed as part + // of the invocation of `extract_data`. Ownership of the Array is passed to the consumer + // calling this, and so it must be released separately. + // + // It is only valid to call this method exactly once. + int (*extract_data)(struct ArrowAsyncTask* self, struct ArrowDeviceArray* out); + + // opaque task-specific data + void* private_data; +}; + +// EXPERIMENTAL: ArrowAsyncProducer represents a 1-to-1 relationship between an async +// producer and consumer. This object allows the consumer to perform backpressure and flow +// control on the asynchronous stream processing. This object must be owned by the +// producer who creates it, and thus is responsible for cleaning it up. +struct ArrowAsyncProducer { + // The device type that this stream produces data on. + ArrowDeviceType device_type; + + // A consumer must call this function to start receiving on_next_task calls. + // + // It *must* be valid to call this synchronously from within `on_next_task` or + // `on_schema`, but this function *must not* immediately call `on_next_task` so as + // to avoid recursion and reentrant callbacks. + // + // After cancel has been called, additional calls to this function must be NOPs, + // but allowed. While not cancelled, calling this function must register the + // given number of additional arrays/batches to be produced with the producer. + // The producer should only call `on_next_task` at most the registered number + // of arrays before propagating backpressure. + // + // Any error encountered by calling request must be propagated by calling the `on_error` + // callback of the ArrowAsyncDeviceStreamHandler. + // + // While not cancelled, any subsequent calls to `on_next_task`, `on_error` or + // `release` should be scheduled by the producer to be called later. + // + // It is invalid for a consumer to call this with a value of n <= 0, producers should + // error if given such a value. + void (*request)(struct ArrowAsyncProducer* self, int64_t n); + + // This cancel callback signals a producer that it must eventually stop making calls + // to on_next_task. It must be idempotent and thread-safe. After calling cancel once, + // subsequent calls must be NOPs. This must not call any consumer-side handlers other + // than `on_error`. + // + // It is not required that calling cancel affect the producer immediately, only that it + // must eventually stop calling on_next_task and subsequently call release on the + // async handler. As such, a consumer must be prepared to receive one or more calls to + // `on_next_task` even after calling cancel if there are still requested arrays pending. + // + // Successful cancellation should *not* result in the producer calling `on_error`, it + // should finish out any remaining tasks and eventually call `release`. + // + // Any error encountered during handling a call to cancel must be reported via the + // on_error callback on the async stream handler. + void (*cancel)(struct ArrowAsyncProducer* self); + + // Any additional metadata tied to a specific stream of data. This must either be NULL + // or a valid pointer to metadata which is encoded in the same way schema metadata + // would be. Non-null metadata must be valid for the lifetime of this object. As an + // example a producer could use this to provide the total number of rows and/or batches + // in the stream if known. + const char* additional_metadata; + + // producer-specific opaque data. + void* private_data; +}; + +// EXPERIMENTAL: Similar to ArrowDeviceArrayStream, except designed for an asynchronous +// style of interaction. While ArrowDeviceArrayStream provides producer +// defined callbacks, this is intended to be created by the consumer instead. +// The consumer passes this handler to the producer, which in turn uses the +// callbacks to inform the consumer of events in the stream. +struct ArrowAsyncDeviceStreamHandler { + // Handler for receiving a schema. The passed in stream_schema must be + // released or moved by the handler (producer is giving ownership of the schema to + // the handler, but not ownership of the top level object itself). + // + // With the exception of an error occurring (on_error), this must be the first + // callback function which is called by a producer and must only be called exactly + // once. As such, the producer should provide a valid ArrowAsyncProducer instance + // so the consumer can control the flow. See the documentation on ArrowAsyncProducer + // for how it works. The ArrowAsyncProducer is owned by the producer who calls this + // function and thus the producer is responsible for cleaning it up when calling + // the release callback of this handler. + // + // If there is any additional metadata tied to this stream, it will be provided as + // a non-null value for the `additional_metadata` field of the ArrowAsyncProducer + // which will be valid at least until the release callback is called. + // + // Return value: 0 if successful, `errno`-compatible error otherwise + // + // A producer that receives a non-zero return here should stop producing and eventually + // call release instead. + int (*on_schema)(struct ArrowAsyncDeviceStreamHandler* self, + struct ArrowSchema* stream_schema); + + // Handler for receiving data. This is called when data is available providing an + // ArrowAsyncTask struct to signify it. The producer indicates the end of the stream + // by passing NULL as the value for the task rather than a valid pointer to a task. + // The task object is only valid for the lifetime of this function call, if a consumer + // wants to utilize it after this function returns, it must copy or move the contents + // of it to a new ArrowAsyncTask object. + // + // The `request` callback of a provided ArrowAsyncProducer must be called in order + // to start receiving calls to this handler. + // + // The metadata argument can be null or can be used by a producer + // to pass arbitrary extra information to the consumer (such as total number + // of rows, context info, or otherwise). The data should be passed using the same + // encoding as the metadata within the ArrowSchema struct itself (defined in + // the spec at + // https://arrow.apache.org/docs/format/CDataInterface.html#c.ArrowSchema.metadata) + // + // If metadata is non-null then it only needs to exist for the lifetime of this call, + // a consumer who wants it to live after that must copy it to ensure lifetime. + // + // A producer *must not* call this concurrently from multiple different threads. + // + // A consumer must be prepared to receive one or more calls to this callback even + // after calling cancel on the corresponding ArrowAsyncProducer, as cancel does not + // guarantee it happens immediately. + // + // Return value: 0 if successful, `errno`-compatible error otherwise. + // + // If the consumer returns a non-zero return from this method, that indicates to the + // producer that it should stop propagating data as an error occurred. After receiving + // such a return, the only interaction with this object is for the producer to call + // the `release` callback. + int (*on_next_task)(struct ArrowAsyncDeviceStreamHandler* self, + struct ArrowAsyncTask* task, const char* metadata); + + // Handler for encountering an error. The producer should call release after + // this returns to clean up any resources. The `code` passed in can be any error + // code that a producer wants, but should be errno-compatible for consistency. + // + // If the message or metadata are non-null, they will only last as long as this + // function call. The consumer would need to perform a copy of the data if it is + // necessary for them to live past the lifetime of this call. + // + // Error metadata should be encoded as with metadata in ArrowSchema, defined in + // the spec at + // https://arrow.apache.org/docs/format/CDataInterface.html#c.ArrowSchema.metadata + // + // It is valid for this to be called by a producer with or without a preceding call + // to ArrowAsyncProducer.request. + // + // This callback must not call any methods of an ArrowAsyncProducer object. + void (*on_error)(struct ArrowAsyncDeviceStreamHandler* self, int code, + const char* message, const char* metadata); + + // Release callback to release any resources for the handler. Should always be + // called by a producer when it is done utilizing a handler. No callbacks should + // be called after this is called. + // + // It is valid for the release callback to be called by a producer with or without + // a preceding call to ArrowAsyncProducer.request. + // + // The release callback must not call any methods of an ArrowAsyncProducer object. + void (*release)(struct ArrowAsyncDeviceStreamHandler* self); + + // MUST be populated by the producer BEFORE calling any callbacks other than release. + // This provides the connection between a handler and its producer, and must exist until + // the release callback is called. + struct ArrowAsyncProducer* producer; + + // Opaque handler-specific data + void* private_data; +}; + +#endif // ARROW_C_ASYNC_STREAM_INTERFACE + +#ifdef __cplusplus +} +#endif diff --git a/clients/c/tests/CMakeLists.txt b/clients/c/tests/CMakeLists.txt new file mode 100644 index 0000000..b1f3336 --- /dev/null +++ b/clients/c/tests/CMakeLists.txt @@ -0,0 +1,21 @@ +# SPDX-FileCopyrightText: 2026 Raincloud Maintainers +# SPDX-License-Identifier: Apache-2.0 +cmake_minimum_required(VERSION 3.21) +project(raincloud_installed_consumer LANGUAGES C CXX) +# The runner passes the version it is testing (from raincloud/__init__.py). +if(NOT RAINCLOUD_EXPECTED_VERSION) + message(FATAL_ERROR "pass -DRAINCLOUD_EXPECTED_VERSION=X.Y.Z") +endif() +find_package(raincloud ${RAINCLOUD_EXPECTED_VERSION} CONFIG REQUIRED) +add_executable(read-c read.c) +target_link_libraries(read-c PRIVATE raincloud::reader) +# The Arrow C++ bridge uses the consumer's Arrow installation. +if(ARROW_INCLUDE AND ARROW_LIBRARY) + add_library(consumer_arrow SHARED IMPORTED) + set_target_properties(consumer_arrow PROPERTIES + IMPORTED_LOCATION "${ARROW_LIBRARY}" + INTERFACE_INCLUDE_DIRECTORIES "${ARROW_INCLUDE}") + add_executable(read-cpp read.cpp) + target_compile_features(read-cpp PRIVATE cxx_std_17) + target_link_libraries(read-cpp PRIVATE raincloud::reader consumer_arrow) +endif() diff --git a/clients/c/tests/read.c b/clients/c/tests/read.c new file mode 100644 index 0000000..e94b464 --- /dev/null +++ b/clients/c/tests/read.c @@ -0,0 +1,69 @@ +/* SPDX-License-Identifier: Apache-2.0 */ +/* Usage: read-c OPTIONS.json MISSING.json [no-vortex] + * MISSING.json selects the same catalog with an empty data_dir (offline); + * no-vortex expects a library built without the Vortex reader. */ +#include "raincloud.h" +#include "raincloud_arrow_abi.h" +#include +#include +#include +/* Always on, unlike assert(): every call below has side effects, and a + * Release (NDEBUG) build of this consumer must still make and check them. */ +#define CHECK(cond) do { if(!(cond)) { \ + fprintf(stderr,"%s:%d: check failed: %s\n",__FILE__,__LINE__,#cond); exit(1); } } while(0) +static char *slurp(const char *path) { + FILE *f=fopen(path,"rb"); CHECK(f); + CHECK(fseek(f,0,SEEK_END)==0); long size=ftell(f); CHECK(size>=0); rewind(f); + char *text=calloc((size_t)size+1,1); CHECK(text); + size_t got=fread(text,1,(size_t)size,f); CHECK(got==(size_t)size); fclose(f); + return text; +} +static raincloud_dataset *open_or_die(const char *options,const char *format) { + raincloud_dataset *ds=NULL; raincloud_error error={0}; + int code=raincloud_open(options,"tiny",format,&ds,&error); + if(code){fprintf(stderr,"open %s: %d %s\n",format,code,error.message?error.message:"(no message)");exit(1);} + return ds; +} +int main(int argc,char **argv) { + CHECK(argc==3||argc==4); + int no_vortex=argc==4&&strcmp(argv[3],"no-vortex")==0; + char *options=slurp(argv[1]), *missing=slurp(argv[2]); + const char *formats[]={"arrow","parquet","vortex"}; + for(int i=0;i<3;++i) { + raincloud_dataset *ds=open_or_die(options,formats[i]); + struct ArrowArrayStream stream={0}; raincloud_error error={0}; + int code=raincloud_batches(ds,2,&stream,&error); + raincloud_close(ds); + if(no_vortex&&i==2) { + CHECK(code==RAINCLOUD_FORMAT_UNAVAILABLE); CHECK(!stream.release); + raincloud_error_free(&error); continue; + } + if(code){fprintf(stderr,"batches %s: %d %s\n",formats[i],code,error.message?error.message:"(no message)");return 1;} + struct ArrowSchema schema={0}; CHECK(stream.get_schema(&stream,&schema)==0); + CHECK(schema.n_children==4); schema.release(&schema); + int64_t rows=0; + while(1) { + struct ArrowArray batch={0}; + if(stream.get_next(&stream,&batch)!=0){fprintf(stderr,"%s\n",stream.get_last_error(&stream));return 1;} + if(!batch.release)break; + CHECK(batch.length<=2); + struct ArrowArray *id=batch.children[0]; + for(int64_t j=0;jbuffers[1])[id->offset+j]==expected); + } + rows+=batch.length; batch.release(&batch); + } + CHECK(rows==8); stream.release(&stream); + } + /* A resolution failure keeps its code. */ + raincloud_dataset *ds=open_or_die(missing,"arrow"); + char *path=NULL; raincloud_error error={0}; + CHECK(raincloud_path(ds,&path,&error)==RAINCLOUD_OFFLINE_MISS); CHECK(!path); + CHECK(error.code==RAINCLOUD_OFFLINE_MISS&&error.message); + raincloud_error_free(&error); raincloud_close(ds); + free(options); free(missing); + puts(no_vortex ? "C: IPC and Parquet, eight rows, Vortex refused, typed offline miss" + : "C: three formats, eight rows, independent stream lifetime, typed offline miss"); + return 0; +} diff --git a/clients/c/tests/read.cpp b/clients/c/tests/read.cpp new file mode 100644 index 0000000..330afbb --- /dev/null +++ b/clients/c/tests/read.cpp @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: Apache-2.0 +// Usage: read-cpp OPTIONS.json MISSING.json [no-vortex] (see read.c) +#include "raincloud_arrow.hpp" +#include +#include +#include +#include +#include +// Always on, unlike assert(): the calls it wraps must run in a Release build. +#define CHECK(cond) do { if(!(cond)) { \ + std::cerr<<__FILE__<<":"<<__LINE__<<": check failed: "<<#cond<<"\n"; std::exit(1); } } while(0) +static std::string slurp(const char* path) { + std::ifstream file(path); CHECK(file.good()); + return std::string((std::istreambuf_iterator(file)),std::istreambuf_iterator()); +} +int main(int argc,char** argv) { + CHECK(argc==3||argc==4); + const bool no_vortex=argc==4&&std::string(argv[3])=="no-vortex"; + const std::string options=slurp(argv[1]), missing=slurp(argv[2]); + for(const std::string format:{"arrow","parquet","vortex"}) { + std::shared_ptr reader; + { + raincloud::Dataset ds("tiny",format,options); + CHECK(ds.metadata().find("reader-fixture")!=std::string::npos); + if(no_vortex&&format=="vortex") { + try { (void)raincloud::batches(ds,2); CHECK(false); } + catch(const raincloud::Error& e) { CHECK(e.code==RAINCLOUD_FORMAT_UNAVAILABLE); } + continue; + } + auto result=raincloud::batches(ds,2); + if(!result.ok()) { std::cerr<Next(); + if(!result.ok()) { std::cerr<num_rows()<=2); rows+=batch->num_rows(); + } + CHECK(rows==8); + } + // Resolution failures keep their Raincloud code through the Arrow helper. + raincloud::Dataset offline("tiny","arrow",missing); + try { (void)raincloud::batches(offline,2); CHECK(false); } + catch(const raincloud::Error& e) { CHECK(e.code==RAINCLOUD_OFFLINE_MISS); } + std::cout<<(no_vortex ? "C++: IPC and Parquet readers, Vortex refused, typed offline miss\n" + : "C++: Arrow RecordBatchReader across three formats, typed offline miss\n"); +} diff --git a/clients/java/build.gradle.kts b/clients/java/build.gradle.kts new file mode 100644 index 0000000..9fdc0a3 --- /dev/null +++ b/clients/java/build.gradle.kts @@ -0,0 +1,50 @@ +// SPDX-FileCopyrightText: 2026 Raincloud Maintainers +// SPDX-License-Identifier: Apache-2.0 +plugins { `java-library`; distribution } +repositories { mavenCentral() } +group = "dev.raincloud" +// Derived, not declared: the release version has one authority, and a stale +// copy here would ship a jar whose name disagrees with the wheel beside it. +version = rootDir.resolve("../../raincloud/__init__.py").readLines() + .firstNotNullOfOrNull { Regex("""^__version__ = "(.+)"$""").find(it)?.groupValues?.get(1) } + ?: error("no __version__ in raincloud/__init__.py") +java { toolchain { languageVersion.set(JavaLanguageVersion.of(17)) }; withSourcesJar() } +// This library's own pins, deliberately not read from sidecars/java/gradle.properties: +// Arrow here is the client's public API (vectors imported over the C stream), while the +// sidecars' Arrow must match the one vortex-jni ships against. The two may move apart. +val arrowVersion = "19.0.0" +dependencies { + api("org.apache.arrow:arrow-vector:$arrowVersion") + implementation("org.apache.arrow:arrow-c-data:$arrowVersion") + implementation("net.java.dev.jna:jna:5.17.0") + implementation("com.fasterxml.jackson.core:jackson-databind:2.21.0") + runtimeOnly("org.apache.arrow:arrow-memory-netty:$arrowVersion") + testImplementation(platform("org.junit:junit-bom:5.10.2")) + testImplementation("org.junit.jupiter:junit-jupiter") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") + testRuntimeOnly("org.slf4j:slf4j-nop:2.0.18") +} +tasks.test { + useJUnitPlatform() + testLogging { showStandardStreams = true } + jvmArgs("--add-opens=java.base/java.nio=ALL-UNNAMED") + systemProperty("jna.library.path", System.getProperty("raincloud.native.path", "")) + systemProperty("raincloud.fixture", System.getProperty("raincloud.fixture", "")) +} + +// A local install carries the runtime classpath; no Maven publication required. +val nativeLibrary = providers.gradleProperty("raincloudNativeLibrary") +distributions { + main { + contents { + into("lib") { + from(tasks.jar) + from(configurations.runtimeClasspath) + } + into("native") { + if (nativeLibrary.isPresent) from(file(nativeLibrary.get())) + } + from("../../LICENSE") + } + } +} diff --git a/clients/java/examples/Read.java b/clients/java/examples/Read.java new file mode 100644 index 0000000..e3f6633 --- /dev/null +++ b/clients/java/examples/Read.java @@ -0,0 +1,31 @@ +// SPDX-FileCopyrightText: 2026 Raincloud Maintainers +// SPDX-License-Identifier: Apache-2.0 +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import dev.raincloud.Raincloud; +import org.apache.arrow.memory.RootAllocator; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.Map; + +/** Standalone consumer of the installed runtime distribution. */ +public class Read { + public static void main(String[] args) throws Exception { + Map options = new ObjectMapper().readValue( + Files.readString(Path.of(args[0])), new TypeReference>() {}); + String slug = args.length > 1 ? args[1] : "tiny"; + long expected = args.length > 2 ? Long.parseLong(args[2]) : 8; + List formats = List.of("arrow", "parquet", "vortex"); + for (String format : formats) { + long rows = 0; + try (var allocator = new RootAllocator(); + var ds = Raincloud.load(slug, format, options); + var reader = ds.batches(allocator, 2)) { + while (reader.loadNextBatch()) rows += reader.getVectorSchemaRoot().getRowCount(); + } + if (rows != expected) throw new AssertionError(format + ": " + rows); + } + System.out.println("Java installed consumer: " + formats.size() + " formats"); + } +} diff --git a/clients/java/settings.gradle.kts b/clients/java/settings.gradle.kts new file mode 100644 index 0000000..0168bf8 --- /dev/null +++ b/clients/java/settings.gradle.kts @@ -0,0 +1,3 @@ +// SPDX-FileCopyrightText: 2026 Raincloud Maintainers +// SPDX-License-Identifier: Apache-2.0 +rootProject.name = "raincloud-reader" diff --git a/clients/java/src/main/java/dev/raincloud/Dataset.java b/clients/java/src/main/java/dev/raincloud/Dataset.java new file mode 100644 index 0000000..c9c150d --- /dev/null +++ b/clients/java/src/main/java/dev/raincloud/Dataset.java @@ -0,0 +1,100 @@ +// SPDX-FileCopyrightText: 2026 Raincloud Maintainers +// SPDX-License-Identifier: Apache-2.0 +package dev.raincloud; + +import java.io.IOException; +import java.nio.file.Path; +import java.util.Map; +import java.util.concurrent.locks.ReadWriteLock; +import java.util.concurrent.locks.ReentrantReadWriteLock; +import com.fasterxml.jackson.core.type.TypeReference; +import com.sun.jna.Pointer; +import com.sun.jna.ptr.PointerByReference; +import org.apache.arrow.c.ArrowArrayStream; +import org.apache.arrow.c.Data; +import org.apache.arrow.memory.BufferAllocator; +import org.apache.arrow.vector.ipc.ArrowReader; +import org.apache.arrow.vector.types.pojo.Schema; + +/** + * Immutable catalog selection with explicit native lifetime. Use try-with-resources. + * Creating a handle loads metadata only. path/schema/batches may download bytes. + * Each batch reader owns its stream independently of this handle. Its vectors are + * valid until the next loadNextBatch() or close(); retain/copy them explicitly if needed. + * + *

Resolution runs in the raincloud CLI; reads use Raincloud's Rust engine through + * Arrow's C stream JNI bridge. Creating a handle and each path/schema/batches call + * run one {@code raincloud} process and block until it exits; it inherits this JVM's + * environment, working directory (relative settings resolve against it) and stderr, + * and may wait on the store's download lock with no timeout. Calls on one handle may + * run concurrently; {@link #close()} waits for the ones in flight. + */ +public final class Dataset implements AutoCloseable { + /** + * Lowest native ABI this client can drive: the version that introduced the newest + * entry point it calls. Native ABI changes are additive (see raincloud.h), so any + * library at this version or newer satisfies this client. + */ + private static final int REQUIRED_ABI = 1; + + private final ReadWriteLock lock = new ReentrantReadWriteLock(); + /** Volatile so a handle published to another thread without a lock is still seen. */ + private volatile Pointer handle; + Dataset(String slug, String format, String options) { + int abi = NativeApi.INSTANCE.raincloud_abi_version(); + if (abi < REQUIRED_ABI) { + throw new IllegalStateException( + "Raincloud native ABI " + abi + " is older than the required " + REQUIRED_ABI); + } + var out = new PointerByReference(); var error = new NativeApi.Failure(); + NativeApi.check(NativeApi.INSTANCE.raincloud_open(options, slug, format, out, error), error); + handle = out.getValue(); + } + /** The open handle, under the read lock the caller holds. */ + private Pointer open() { if (handle == null) throw new IllegalStateException("dataset is closed"); return handle; } + public Map metadata() { + lock.readLock().lock(); + try { + var out = new PointerByReference(); var error = new NativeApi.Failure(); + NativeApi.check(NativeApi.INSTANCE.raincloud_metadata(open(), out, error), error); + try { return Raincloud.JSON.readValue(out.getValue().getString(0,"UTF-8"), new TypeReference<>() {}); } + catch (IOException e) { throw new IllegalStateException("invalid native metadata", e); } + finally { NativeApi.INSTANCE.raincloud_string_free(out.getValue()); } + } finally { lock.readLock().unlock(); } + } + /** The selected representation, e.g. {@code vortex}. */ + public String format() { return (String) metadata().get("format"); } + public Path path() { + lock.readLock().lock(); + try { + var out = new PointerByReference(); var error = new NativeApi.Failure(); + NativeApi.check(NativeApi.INSTANCE.raincloud_path(open(), out, error), error); + try { return Path.of(out.getValue().getString(0,"UTF-8")); } + finally { NativeApi.INSTANCE.raincloud_string_free(out.getValue()); } + } finally { lock.readLock().unlock(); } + } + public ArrowReader batches(BufferAllocator allocator) { return batches(allocator, 65536); } + public ArrowReader batches(BufferAllocator allocator, int batchSize) { + if (batchSize <= 0) throw new IllegalArgumentException("batchSize must be positive"); + lock.readLock().lock(); + try (ArrowArrayStream stream = ArrowArrayStream.allocateNew(allocator)) { + var error = new NativeApi.Failure(); + NativeApi.check(NativeApi.INSTANCE.raincloud_batches(open(), new NativeApi.Size(batchSize), new Pointer(stream.memoryAddress()), error), error); + try { return Data.importArrayStream(allocator, stream, false); } + finally { + // A successful import takes the stream and clears its release callback, and a + // native error leaves the stream empty (no callback). Only a failed import + // leaves a live stream behind, which must be released here. + if (stream.snapshot().release != 0) stream.release(); + } + } finally { lock.readLock().unlock(); } + } + public Schema schema(BufferAllocator allocator) throws IOException { + try (ArrowReader reader = batches(allocator)) { return reader.getVectorSchemaRoot().getSchema(); } + } + @Override public void close() { + lock.writeLock().lock(); + try { if (handle != null) { NativeApi.INSTANCE.raincloud_close(handle); handle = null; } } + finally { lock.writeLock().unlock(); } + } +} diff --git a/clients/java/src/main/java/dev/raincloud/NativeApi.java b/clients/java/src/main/java/dev/raincloud/NativeApi.java new file mode 100644 index 0000000..746e619 --- /dev/null +++ b/clients/java/src/main/java/dev/raincloud/NativeApi.java @@ -0,0 +1,33 @@ +// SPDX-FileCopyrightText: 2026 Raincloud Maintainers +// SPDX-License-Identifier: Apache-2.0 +package dev.raincloud; + +import java.util.Map; +import com.sun.jna.*; +import com.sun.jna.ptr.PointerByReference; + +interface NativeApi extends Library { + NativeApi INSTANCE = Native.load("raincloud_reader", NativeApi.class, Map.of(Library.OPTION_STRING_ENCODING, "UTF-8")); + @Structure.FieldOrder({"code", "message"}) + class Failure extends Structure { + public int code; + public Pointer message; + } + // size_t follows pointer width, including Windows LLP64. + class Size extends IntegerType { public Size() { this(0); } public Size(long value) { super(Native.SIZE_T_SIZE, value, true); } } + int raincloud_abi_version(); + int raincloud_open(String options, String slug, String format, PointerByReference out, Failure error); + int raincloud_metadata(Pointer handle, PointerByReference out, Failure error); + int raincloud_path(Pointer handle, PointerByReference out, Failure error); + int raincloud_batches(Pointer handle, Size batchSize, Pointer out, Failure error); + void raincloud_close(Pointer handle); + void raincloud_string_free(Pointer value); + void raincloud_error_free(Failure error); + + static void check(int code, Failure error) { + try { + if (code != 0) throw new RaincloudException(code, + error.message == null ? "Raincloud error" : error.message.getString(0, "UTF-8")); + } finally { INSTANCE.raincloud_error_free(error); } + } +} diff --git a/clients/java/src/main/java/dev/raincloud/Raincloud.java b/clients/java/src/main/java/dev/raincloud/Raincloud.java new file mode 100644 index 0000000..cd2b383 --- /dev/null +++ b/clients/java/src/main/java/dev/raincloud/Raincloud.java @@ -0,0 +1,18 @@ +// SPDX-FileCopyrightText: 2026 Raincloud Maintainers +// SPDX-License-Identifier: Apache-2.0 +package dev.raincloud; + +import java.util.Map; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +/** Datasets-style prepared-data access. Artifact reads never invoke a builder. */ +public final class Raincloud { + static final ObjectMapper JSON = new ObjectMapper(); + private Raincloud() {} + public static Dataset load(String slug) { return load(slug, "auto", Map.of()); } + public static Dataset load(String slug, String format, Map settings) { + try { return new Dataset(slug, format, JSON.writeValueAsString(settings)); } + catch (JsonProcessingException e) { throw new IllegalArgumentException("invalid settings", e); } + } +} diff --git a/clients/java/src/main/java/dev/raincloud/RaincloudException.java b/clients/java/src/main/java/dev/raincloud/RaincloudException.java new file mode 100644 index 0000000..52037e8 --- /dev/null +++ b/clients/java/src/main/java/dev/raincloud/RaincloudException.java @@ -0,0 +1,26 @@ +// SPDX-FileCopyrightText: 2026 Raincloud Maintainers +// SPDX-License-Identifier: Apache-2.0 +package dev.raincloud; + +/** Stable native error categories; batch-time decoding can also throw IOException. */ +public final class RaincloudException extends RuntimeException { + /** Each kind carries its C ABI code (raincloud.h), which never changes. */ + public enum Kind { + INVALID_ARGUMENT(1), CATALOG(2), MISSING_REVISION(3), UNKNOWN_SLUG(4), FORMAT_UNAVAILABLE(5), + OFFLINE_MISS(6), ARTIFACT_NOT_FOUND(7), CHECKSUM_MISMATCH(8), CATALOG_CONFLICT(9), + TRANSPORT(10), UNSUPPORTED_TYPE(11), IO(12), INTERNAL(13), CORRUPT_ARTIFACT(14); + + public final int code; + Kind(int code) { this.code = code; } + + /** A code this client does not know (from a newer library) is INTERNAL. */ + public static Kind of(int code) { + for (Kind kind : values()) if (kind.code == code) return kind; + return INTERNAL; + } + } + private final int code; + RaincloudException(int code, String message) { super(message); this.code = code; } + public int code() { return code; } + public Kind kind() { return Kind.of(code); } +} diff --git a/clients/java/src/test/java/dev/raincloud/ReaderTest.java b/clients/java/src/test/java/dev/raincloud/ReaderTest.java new file mode 100644 index 0000000..83e1541 --- /dev/null +++ b/clients/java/src/test/java/dev/raincloud/ReaderTest.java @@ -0,0 +1,143 @@ +// SPDX-FileCopyrightText: 2026 Raincloud Maintainers +// SPDX-License-Identifier: Apache-2.0 +package dev.raincloud; + +import java.nio.file.*; +import java.util.*; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicBoolean; +import com.fasterxml.jackson.core.type.TypeReference; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import org.apache.arrow.memory.RootAllocator; +import org.apache.arrow.vector.UInt8Vector; +import static org.junit.jupiter.api.Assertions.*; + +/** Reads the shared fixture written by tests/reader_fixture.py. */ +class ReaderTest { + static final List FORMATS = List.of("arrow", "parquet", "vortex"); + static final int ROWS = 8; + /** Row 7's uint64 id is 2**64-1; every other id equals its row number. */ + static final int MAX_ID_ROW = 7; + static final String MAX_ID = "18446744073709551615"; + /** Row 1 holds a null text and the double -0.0, whose raw bits are Long.MIN_VALUE. */ + static final int NULL_AND_NEGATIVE_ZERO_ROW = 1; + static final long NEGATIVE_ZERO_BITS = Double.doubleToRawLongBits(-0.0); + static final int ACCENTED_ROW = 2; + + Map options() throws Exception { + String fixture=System.getProperty("raincloud.fixture"); + assertFalse(fixture.isEmpty(), "pass -Draincloud.fixture=path to shared fixture"); + return Raincloud.JSON.readValue(Files.readString(Path.of(fixture,"options.json")), new TypeReference>() {}); + } + @Test void streamAllFormatsAndReleaseEarly() throws Exception { + for(String format:FORMATS) { + try(var allocator=new RootAllocator()) { + var ds=Raincloud.load("tiny",format,options()); + try(var reader=ds.batches(allocator,2)) { + assertEquals("reader-fixture",ds.metadata().get("catalog_id")); + assertEquals(format,ds.format()); + assertEquals(4,ds.schema(allocator).getFields().size()); + ds.close(); // closed early on purpose: the stream owns its source + int rows=0; + while(reader.loadNextBatch()) { + var root=reader.getVectorSchemaRoot(); + assertTrue(root.getRowCount()<=2); + assertEquals("id",root.getSchema().getFields().get(0).getName()); + for (int i=0; iRaincloud.load("tiny","parquet@rs",opts)).kind()); + opts.put("data_dir",Path.of(System.getProperty("raincloud.fixture"),"missing").toString()); + try(var ds=Raincloud.load("tiny","arrow",opts)) { + assertEquals(ROWS,ds.metadata().get("rows")); + assertEquals(RaincloudException.Kind.OFFLINE_MISS,assertThrows(RaincloudException.class,ds::path).kind()); + } + } + /** Same-size damage passes the catalog's size check and must fail to decode as CORRUPT_ARTIFACT. */ + @Test void damagedBytesAreCorruptArtifacts(@TempDir Path temp) throws Exception { + var opts=options(); + Path source=Path.of((String)opts.get("data_dir")); + try(var files=Files.walk(source)) { + for(Path file:(Iterable)files::iterator) { + Path copy=temp.resolve(source.relativize(file).toString()); + if(Files.isDirectory(file)) Files.createDirectories(copy); + else Files.write(copy, new byte[(int)Files.size(file)]); + } + } + opts.put("data_dir",temp.toString()); + for(String format:FORMATS) { + try(var allocator=new RootAllocator(); var ds=Raincloud.load("tiny",format,opts)) { + var error=assertThrows(RaincloudException.class,()->ds.batches(allocator,2)); + assertEquals(RaincloudException.Kind.CORRUPT_ARTIFACT,error.kind(),format+": "+error.getMessage()); + } + } + } + /** Calls on one handle run concurrently, and close() waits for the ones in flight. */ + @Test void closeWaitsForConcurrentCalls(@TempDir Path temp) throws Exception { + // A CLI that announces each run, then takes its time. + Path started=temp.resolve("started"), slow=temp.resolve("slow-raincloud"); + String cli=Optional.ofNullable(System.getenv("RAINCLOUD_CLI")).orElse("raincloud"); + Files.writeString(slow,"#!/bin/sh\necho run >> '"+started+"'\nsleep 3\nexec '"+cli+"' \"$@\"\n"); + assertTrue(slow.toFile().setExecutable(true)); + var opts=options(); opts.put("cli",slow.toString()); + var ds=Raincloud.load("tiny","parquet",opts); // the first run + var pool=Executors.newFixedThreadPool(2); + try(var allocator=new RootAllocator()) { + var batchesReturned=new AtomicBoolean(); + Future path=pool.submit(ds::path); + Future rows=pool.submit(()->{ + try(var reader=ds.batches(allocator,3)) { + batchesReturned.set(true); + int n=0; + while(reader.loadNextBatch()) n+=reader.getVectorSchemaRoot().getRowCount(); + return n; + } + }); + long deadline=System.nanoTime()+TimeUnit.SECONDS.toNanos(60); + while(!Files.exists(started)||Files.readAllLines(started).size()<3) { + assertTrue(System.nanoTime()=1000,"close() returned after "+waited+" ms, while both calls were in flight"); + assertTrue(path.get(60,TimeUnit.SECONDS).toString().endsWith(".parquet")); + assertEquals(ROWS,rows.get(60,TimeUnit.SECONDS)); + } finally { pool.shutdownNow(); } + assertThrows(IllegalStateException.class,ds::path); + assertThrows(IllegalStateException.class,ds::metadata); + try(var allocator=new RootAllocator()) { + assertThrows(IllegalStateException.class,()->ds.batches(allocator,2)); + } + } + @Test void kindsCarryTheirAbiCodes() { + for(var kind:RaincloudException.Kind.values()) assertEquals(kind,RaincloudException.Kind.of(kind.code)); + assertEquals(RaincloudException.Kind.INTERNAL,RaincloudException.Kind.of(99)); + assertEquals(14,RaincloudException.Kind.CORRUPT_ARTIFACT.code); + } +} diff --git a/clients/rust/Cargo.lock b/clients/rust/Cargo.lock new file mode 100644 index 0000000..ba840b9 --- /dev/null +++ b/clients/rust/Cargo.lock @@ -0,0 +1,3499 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "const-random", + "getrandom 0.3.4", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e76a019e91224d279006ff972f1e984179a6e9feb050adba6ce8274aef23195" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "alp" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b23203d5e87df8d8393c8021b53f9193b697ba13fc4ef653911dc1235e87bfd7" +dependencies = [ + "fastlanes 0.6.1", + "itertools 0.15.0", + "num-traits", +] + +[[package]] +name = "android_system_properties" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "arc-swap" +version = "1.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c049c0be4daef0b145cb3555416b3b8ef5b7888a38aea1a3a155801fe7b0810b" +dependencies = [ + "rustversion", +] + +[[package]] +name = "arcref" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28f6098a1e8ab66ff91324cce8fea6643101882cf7d09c85acdb1485ecf61e29" + +[[package]] +name = "arrow" +version = "59.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61d285d16bce7d0be61912f7928342b673067b6b7d7ef6cc179258ba7de1fecf" +dependencies = [ + "arrow-arith", + "arrow-array", + "arrow-buffer", + "arrow-cast", + "arrow-data", + "arrow-ord", + "arrow-row", + "arrow-schema", + "arrow-select", + "arrow-string", +] + +[[package]] +name = "arrow-arith" +version = "59.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "757ef1836251e88222542a7da2623bc1c9cb9e20afefa6db2c41e79991cd91d4" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "chrono", + "num-traits", +] + +[[package]] +name = "arrow-array" +version = "59.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc9a4a4b2b5ecd0e04df03471661cb61f28bed3c7fd50994715129b01b2edb97" +dependencies = [ + "ahash", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "chrono", + "half", + "hashbrown 0.17.1", + "libc", + "num-complex", + "num-integer", + "num-traits", +] + +[[package]] +name = "arrow-buffer" +version = "59.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "097d193003ce7995d5d087089069ec2a6e0187faf5a6f8c9f38af2645d987182" +dependencies = [ + "bytes", + "half", + "num-bigint", + "num-traits", +] + +[[package]] +name = "arrow-cast" +version = "59.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68338a9096a5dc9bc11927c58c43a8526d96bf6abd2012ef6c0c9f505991cc79" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-ord", + "arrow-schema", + "arrow-select", + "atoi", + "base64", + "chrono", + "half", + "lexical-core", + "num-traits", + "ryu", +] + +[[package]] +name = "arrow-data" +version = "59.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "723fe4aeed7604e00b9883a465af4ff0a0e6c44c03e41a68c3d1cbc403e0e44d" +dependencies = [ + "arrow-buffer", + "arrow-schema", + "half", + "num-integer", + "num-traits", +] + +[[package]] +name = "arrow-ipc" +version = "59.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "149437b14371f5b9ec60f5ddc751483ae99d7a7072653c0075e5e469156eea7b" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "arrow-select", + "flatbuffers", + "zstd", +] + +[[package]] +name = "arrow-ord" +version = "59.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c08dff0686cf23ca4f562803f191ccbeb726dbae6309cd4b4aaf65e0f2c979" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "arrow-select", +] + +[[package]] +name = "arrow-row" +version = "59.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbec439386df71ad570e6758a946111322b9e9dc8db83b5527321f0b4c9119c2" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "half", +] + +[[package]] +name = "arrow-schema" +version = "59.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6fed2ca0d1eade57e811cbe73b98ad50cc08a1183e13b2d2aa43a7df593f40e" +dependencies = [ + "bitflags 2.13.2", + "serde_core", + "serde_json", +] + +[[package]] +name = "arrow-select" +version = "59.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "466b19cf75130b891dc1b23a84b343c714c62c64c9c62e365c76aa0ff90a53fb" +dependencies = [ + "ahash", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "num-traits", +] + +[[package]] +name = "arrow-string" +version = "59.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c838a25bb3691e919e0f617616ac51a4ff8517a952e29ca133cf0c22b2ce65b1" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-schema", + "arrow-select", + "memchr", + "num-traits", + "regex", + "regex-syntax", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-fs" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5" +dependencies = [ + "async-lock", + "blocking", + "futures-lite", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "windows-sys", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-net" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" +dependencies = [ + "async-io", + "blocking", + "futures-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix", +] + +[[package]] +name = "async-signal" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys", +] + +[[package]] +name = "async-stream" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "base64" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" + +[[package]] +name = "better_io" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef0a3155e943e341e557863e69a708999c94ede624e37865c8e2a91b94efa78f" + +[[package]] +name = "bindgen" +version = "0.72.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" +dependencies = [ + "bitflags 2.13.2", + "cexpr", + "clang-sys", + "itertools 0.13.0", + "proc-macro2", + "quote", + "regex", + "rustc-hash", + "shlex 1.3.0", + "syn 2.0.119", +] + +[[package]] +name = "bit-vec" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71798fca2c1fe1086445a7258a4bc81e6e49dcd24c8d0dd9a1e57395b603f51" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" + +[[package]] +name = "bitvec" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blocking" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a70e4329df6cb94385eed412ec92375c3cdd8a6e502493d1229b6414e4036dfa" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "brotli" +version = "8.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc91aac060a7a1e25823bdccbfb6af1875b88f17c6daac97894eed8207166b3" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a32acac15fe1967bc3986b2a6347dffc965602354ea6f450ad07e8bfd253583" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytemuck" +version = "1.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[package]] +name = "cc" +version = "1.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3eb0f42d6c360dc3f8a821f6bf2fdea7f72bfd36b3076eb0e6d1e9e0752fff4" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex 2.0.1", +] + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom", +] + +[[package]] +name = "cfg-if" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" + +[[package]] +name = "chacha20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06" +dependencies = [ + "cfg-if", + "cpufeatures", + "rand_core 0.10.1", +] + +[[package]] +name = "chrono" +version = "0.4.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "clang-sys" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "157a8ba7b480713b56f4c09fd13fc3e0a22a5dfab8097ba61cbc5feef950788a" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom 0.2.17", + "once_cell", + "tiny-keccak", +] + +[[package]] +name = "const_for" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "988d3bd6bf67b6d7ae2b519c55296fa57411c27c312575e47b2975f8d1d8590b" + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" +dependencies = [ + "libc", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98b0cc327b5bc766e7fda9c9260cc0fa81b43a8e240440422dff70788e3f9ef1" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc74980687109a3b14c72fd458107bf0baa1da1a1a805e178d15501ba9b86d9d" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "custom-labels" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4121f4f539659ad975da5bc6702b7d7d6de59ff1bbaec328dfe7dd5058052ef2" +dependencies = [ + "bindgen", + "cc", + "libc", + "pin-project-lite", +] + +[[package]] +name = "dashmap" +version = "6.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6361d5c062261c78a176addb82d4c821ae42bed6089de0e12603cd25de2059c" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "defmt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8" +dependencies = [ + "defmt-parser", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror", +] + +[[package]] +name = "displaydoc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "dtype_dispatch" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab23e69df104e2fd85ee63a533a22d2132ef5975dc6b36f9f3e5a7305e4a8ed7" + +[[package]] +name = "either" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" + +[[package]] +name = "enum-iterator" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4549325971814bda7a44061bf3fe7e487d447cba01e4220a4b454d630d7a016" +dependencies = [ + "enum-iterator-derive", +] + +[[package]] +name = "enum-iterator-derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685adfa4d6f3d765a26bc5dbc936577de9abf756c1feeb3089b01dd395034842" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys", +] + +[[package]] +name = "event-listener" +version = "5.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" +dependencies = [ + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + +[[package]] +name = "ext-trait" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d772df1c1a777963712fb68e014235e80863d6a91a85c4e06ba2d16243a310e5" +dependencies = [ + "ext-trait-proc_macros", +] + +[[package]] +name = "ext-trait-proc_macros" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ab7934152eaf26aa5aa9f7371408ad5af4c31357073c9e84c3b9d7f11ad639a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "extension-traits" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a296e5a895621edf9fa8329c83aa1cb69a964643e36cf54d8d7a69b789089537" +dependencies = [ + "ext-trait", +] + +[[package]] +name = "fastlanes" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a516528425408429de7661e7101f7e7ad54f7d3fab859a3a6de239f508d17e2" +dependencies = [ + "const_for", + "num-traits", + "pastey", + "seq-macro", +] + +[[package]] +name = "fastlanes" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fcb34a73abd2872401096bf65d13e8d26e0c9ca6166d5e2b11a314ba017cdef" +dependencies = [ + "const_for", + "num-traits", + "pastey", + "seq-macro", +] + +[[package]] +name = "fastrand" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "find-msvc-tools" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e0f1c7c3a72c66fd80abe965175f7523475c0489a87d3ff9d6e8c87d87a9d2d" + +[[package]] +name = "flatbuffers" +version = "25.12.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35f6839d7b3b98adde531effaf34f0c2badc6f4735d26fe74709d8e513a96ef3" +dependencies = [ + "bitflags 2.13.2", + "rustc_version", +] + +[[package]] +name = "flate2" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb" +dependencies = [ + "zlib-rs", +] + +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fsst-rs" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03b614a2a7f2efc50d76c1e47d64b57c55acf6e0e718b0cae78236d147c487d0" +dependencies = [ + "rustc-hash", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a31d2a3fbaaeb2af2368bbdd904aa8e812d3c04a1ee10d3171f52d556e5d0a3" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-executor" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "futures-sink" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "slab", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "libc", + "r-efi 6.0.0", + "rand_core 0.10.1", +] + +[[package]] +name = "glob" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "num-traits", + "zerocopy", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", +] + +[[package]] +name = "hermit-abi" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17592d60ebacc7d5e169f4663c5f84f9161cc90328abcfe8456f41e4dfcb284" + +[[package]] +name = "humansize" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cb51c9a029ddc91b07a787f1d86b53ccfa49b0e86688c946ebe8d3555685dd7" +dependencies = [ + "libm", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.65" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0" + +[[package]] +name = "icu_properties" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa" + +[[package]] +name = "icu_provider" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d27bbb9d3abbefac45d55f647c9de1d44aafcd1186eb91879afef17c396c3e73" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", +] + +[[package]] +name = "inventory" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b" +dependencies = [ + "rustversion", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jiff" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab1baf72f08796de0260609515130699b890ac25f30e610ad894bc5856cafdb" +dependencies = [ + "defmt", + "jiff-core", + "jiff-static", + "jiff-tzdb-platform", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", + "windows-link", +] + +[[package]] +name = "jiff-core" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e52fe76043ccecc9005d2305ebaadf7d7fc0cc89ca6baa10a94d6bc68c7128c" +dependencies = [ + "defmt", + "log", +] + +[[package]] +name = "jiff-static" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "378268a1116ad67ae6228701118ac9f491d78fda38a40a1f1a9e1348de6f7212" +dependencies = [ + "jiff-core", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "jiff-tzdb" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "142bd39932ad231f10513df9ab62661fead8719872150b7ad02a2df79f4e141e" + +[[package]] +name = "jiff-tzdb-platform" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "875a5a69ac2bab1a891711cf5eccbec1ce0341ea805560dcd90b7a2e925132e8" +dependencies = [ + "jiff-tzdb", +] + +[[package]] +name = "jobserver" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +dependencies = [ + "getrandom 0.4.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce57d20d1ea864ce2ac172ab472d409214f4fd359f0b2a2775abdf522e2af99e" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "kanal" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3953adf0cd667798b396c2fa13552d6d9b3269d7dd1154c4c416442d1ff574" +dependencies = [ + "futures-core", + "lock_api", +] + +[[package]] +name = "lasso" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e14eda50a3494b3bf7b9ce51c52434a761e383d7238ce1dd5dcec2fbc13e9fb" +dependencies = [ + "dashmap", + "hashbrown 0.14.5", +] + +[[package]] +name = "lending-iterator" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc07588c853b50689205fb5c00498aa681d89828e0ce8cbd965ebc7a5d8ae260" +dependencies = [ + "extension-traits", + "lending-iterator-proc_macros", + "macro_rules_attribute", + "never-say-never", + "nougat", + "polonius-the-crab", +] + +[[package]] +name = "lending-iterator-proc_macros" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5445dd1c0deb1e97b8a16561d17fc686ca83e8411128fb036e9668a72d51b1d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "lexical-core" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d8d125a277f807e55a77304455eb7b1cb52f2b18c143b60e766c120bd64a594" +dependencies = [ + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", +] + +[[package]] +name = "lexical-parse-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52a9f232fbd6f550bc0137dcb5f99ab674071ac2d690ac69704593cb4abbea56" +dependencies = [ + "lexical-parse-integer", + "lexical-util", +] + +[[package]] +name = "lexical-parse-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a7a039f8fb9c19c996cd7b2fcce303c1b2874fe1aca544edc85c4a5f8489b34" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "lexical-util" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2604dd126bb14f13fb5d1bd6a66155079cb9fa655b37f875b3a742c705dbed17" + +[[package]] +name = "lexical-write-float" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c438c87c013188d415fbabbb1dceb44249ab81664efbd31b14ae55dabb6361" +dependencies = [ + "lexical-util", + "lexical-write-integer", +] + +[[package]] +name = "lexical-write-integer" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "409851a618475d2d5796377cad353802345cba92c867d9fbcde9cf4eac4e14df" +dependencies = [ + "lexical-util", +] + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link", +] + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" + +[[package]] +name = "lz4_flex" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecbdfe44b1bd960b68170b417450a628c43f7cf56bb3c5317e61cb230ee7f226" +dependencies = [ + "twox-hash", +] + +[[package]] +name = "macro_rules_attribute" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf0c9b980bf4f3a37fd7b1c066941dd1b1d0152ce6ee6e8fe8c49b9f6810d862" +dependencies = [ + "macro_rules_attribute-proc_macro", + "paste", +] + +[[package]] +name = "macro_rules_attribute-proc_macro" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58093314a45e00c77d5c508f76e77c3396afbbc0d01506e7fae47b018bac2b1d" + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "moka" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4293f18e7567a1caf3c584855554377025c65e0aa445344d04171f5ad63d19b9" +dependencies = [ + "async-lock", + "crossbeam-channel", + "crossbeam-epoch", + "crossbeam-utils", + "equivalent", + "event-listener", + "futures-util", + "parking_lot", + "portable-atomic", + "smallvec", + "tagptr", + "uuid", +] + +[[package]] +name = "never-say-never" +version = "6.6.666" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf5a574dadd7941adeaa71823ecba5e28331b8313fb2e1c6a5c7e5981ea53ad6" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nougat" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b57b9ced431322f054fc673f1d3c7fa52d80efd9df74ad2fc759f044742510" +dependencies = [ + "macro_rules_attribute", + "nougat-proc_macros", +] + +[[package]] +name = "nougat-proc_macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c84f77a45e99a2f9b492695d99e1c23844619caa5f3e57647cffacad773ca257" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "num-bigint" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93e7820bc0a80a0238e650327316f929ba18d5be054b647490a3a6a339f3e7c0" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_enum" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" +dependencies = [ + "parking_lot_core", +] + +[[package]] +name = "onpair" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34272d1ea63266148a9a5b2b96db80a45245d034862302735f2f93413a6f9172" +dependencies = [ + "hashbrown 0.16.1", + "rand 0.9.5", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + +[[package]] +name = "parquet" +version = "59.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7065842956a20c2a536924ce8e4d9955f7422451511b9eb7500d7bfe5077e59c" +dependencies = [ + "ahash", + "arrow-array", + "arrow-buffer", + "arrow-data", + "arrow-ipc", + "arrow-schema", + "arrow-select", + "base64", + "brotli", + "bytes", + "chrono", + "flate2", + "half", + "hashbrown 0.17.1", + "lz4_flex", + "num-bigint", + "num-integer", + "num-traits", + "seq-macro", + "simdutf8", + "snap", + "twox-hash", + "zstd", +] + +[[package]] +name = "parquet-variant" +version = "59.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f7e5fff3ed0c07514a7fb8bee3f2ea5a53f36939410ecac4a466620213539a8" +dependencies = [ + "arrow", + "arrow-schema", + "chrono", + "half", + "indexmap", + "num-traits", + "simdutf8", + "uuid", +] + +[[package]] +name = "parquet-variant-compute" +version = "59.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba4d3de89dab8d1aaaf601ae8d71bd07ea88cfca9efc1df5815b982c30f631e1" +dependencies = [ + "arrow", + "arrow-schema", + "chrono", + "half", + "indexmap", + "parquet-variant", + "parquet-variant-json", + "serde_json", + "uuid", +] + +[[package]] +name = "parquet-variant-json" +version = "59.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb19dfe1bd24c17addd761ba4f7000f615e2fa12525871c7baa835dbb3d7f147" +dependencies = [ + "arrow-schema", + "base64", + "chrono", + "parquet-variant", + "serde_json", + "uuid", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pastey" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ee67f1008b1ba2321834326597b8e186293b049a023cdef258527550b9935b4" + +[[package]] +name = "pco" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "386342cad4c6e97f081568e5d910ea7d871314c843aa8fc564f2a6b64cab9456" +dependencies = [ + "better_io", + "dtype_dispatch", + "half", + "rand_xoshiro", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[package]] +name = "piper" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkg-config" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "windows-sys", +] + +[[package]] +name = "polonius-the-crab" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a69ee997a6282f8462abf1e0d8c38c965e968799e912b3bed8c9e8a28c2f9f" + +[[package]] +name = "portable-atomic" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" + +[[package]] +name = "portable-atomic-util" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10ab3eb7f3becc3a1cbc4f2c6f20267996cfc1a6467a873763411b136a122715" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "potential_utf" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" +dependencies = [ + "zerovec", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prost" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "528ac67416ff8646872a3c02cad9cc4ee5dc9f9540c9b10771855c95cb2e5ae1" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-derive" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf" +dependencies = [ + "anyhow", + "itertools 0.14.0", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "prost-types" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f94967dc7688f3054c7fac87473ffae4cc4c3904800e2d9f5b857246d8963b0a" +dependencies = [ + "prost", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "raincloud-reader" +version = "0.3.0" +dependencies = [ + "arrow-array", + "arrow-ipc", + "arrow-schema", + "parquet", + "serde_json", + "tokio", + "vortex", +] + +[[package]] +name = "rand" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" +dependencies = [ + "rand_chacha", + "rand_core 0.9.5", +] + +[[package]] +name = "rand" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80" +dependencies = [ + "chacha20", + "getrandom 0.4.3", + "rand_core 0.10.1", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "rand_xoshiro" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.13.2", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "roaring" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18bd8a37d17a58532776dcdf6041ce64929adca78e8489d5cacbafe99229d3e1" +dependencies = [ + "bytemuck", + "byteorder", +] + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d" +dependencies = [ + "bitflags 2.13.2", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + +[[package]] +name = "seq-macro" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "sketches-ddsketch" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "513c3f5f732bfd6fbb187619c2dfe9d2f25f1a2976f01d575f0fd329d565df56" + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba467056f1b547ed52077911161fc86985becbc60e8e1857c8a144dab0def891" + +[[package]] +name = "smol" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33bd3e260892199c3ccfc487c88b2da2265080acb316cd920da72fdfd7c599f" +dependencies = [ + "async-channel", + "async-executor", + "async-fs", + "async-io", + "async-lock", + "async-net", + "async-process", + "blocking", + "futures-lite", +] + +[[package]] +name = "snap" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "199905e6153d6405f9728fe44daace35f8f837bbf830bb6e85fbd5828709a886" + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "tagptr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "termtree" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4d1330fe7f7f872cd05165130b10602d667b205fd85be09be2814b115d4ced9" + +[[package]] +name = "thiserror" +version = "2.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinystr" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "1.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" +dependencies = [ + "bytes", + "pin-project-lite", +] + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "twox-hash" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5283634e518fe9e82c7b20520bb4bc209009fd16c82077c802f8111ecbb0117a" +dependencies = [ + "rand 0.10.2", +] + +[[package]] +name = "unicode-ident" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ef6dac1e96601b4fb3acccccff2139741fcb757cb9a36089bf5be91cfb285ce" +dependencies = [ + "getrandom 0.4.3", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vortex" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e6da071d96539f6061b6455379fd9db6535e76027cb473b102a9d45e40526e7" +dependencies = [ + "vortex-alp", + "vortex-array", + "vortex-arrow", + "vortex-btrblocks", + "vortex-buffer", + "vortex-bytebool", + "vortex-datetime-parts", + "vortex-decimal-byte-parts", + "vortex-edition", + "vortex-error", + "vortex-fastlanes", + "vortex-file", + "vortex-flatbuffers", + "vortex-fsst", + "vortex-io", + "vortex-ipc", + "vortex-layout", + "vortex-mask", + "vortex-metrics", + "vortex-parquet-variant", + "vortex-pco", + "vortex-proto", + "vortex-runend", + "vortex-scan", + "vortex-sequence", + "vortex-session", + "vortex-sparse", + "vortex-utils", + "vortex-zigzag", + "vortex-zstd", +] + +[[package]] +name = "vortex-alp" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "459bd99fb5f1489003f0e5995df7229f551a7f6ed4a3a3c9887587dc79b933e8" +dependencies = [ + "alp", + "itertools 0.14.0", + "num-traits", + "prost", + "vortex-array", + "vortex-buffer", + "vortex-error", + "vortex-fastlanes", + "vortex-mask", + "vortex-session", +] + +[[package]] +name = "vortex-array" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51f9cad02aa398673d382d5d13496c6c46af46f9fc0dff68db11195a5155e3ec" +dependencies = [ + "arc-swap", + "arcref", + "arrow-buffer", + "async-lock", + "bytes", + "cfg-if", + "enum-iterator", + "flatbuffers", + "futures", + "half", + "humansize", + "inventory", + "itertools 0.14.0", + "jiff", + "memchr", + "num-traits", + "num_enum", + "parking_lot", + "paste", + "pin-project-lite", + "prost", + "rand 0.10.2", + "regex", + "regex-syntax", + "rustc-hash", + "simdutf8", + "smallvec", + "static_assertions", + "tracing", + "uuid", + "vortex-array-macros", + "vortex-buffer", + "vortex-compute", + "vortex-error", + "vortex-flatbuffers", + "vortex-mask", + "vortex-proto", + "vortex-session", + "vortex-utils", +] + +[[package]] +name = "vortex-array-macros" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a684e4ad14145c3c933caf6fa34af71eaebfd7531542491540772133ca10e6d4" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "vortex-arrow" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f72d6dcff160e4fb47cd0a6dcd031be408fa7ff7605ae0cb3d80fa9f2e11d27" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-cast", + "arrow-data", + "arrow-schema", + "arrow-select", + "itertools 0.14.0", + "num-traits", + "simdutf8", + "tracing", + "vortex-array", + "vortex-buffer", + "vortex-error", + "vortex-mask", + "vortex-runend", + "vortex-session", +] + +[[package]] +name = "vortex-btrblocks" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bc6df7630ea9f409914c351c04aca9e78122ab0db076fbc54b0dfcaf5b84737" +dependencies = [ + "itertools 0.14.0", + "pco", + "rand 0.10.2", + "vortex-alp", + "vortex-array", + "vortex-buffer", + "vortex-compressor", + "vortex-datetime-parts", + "vortex-decimal-byte-parts", + "vortex-error", + "vortex-fastlanes", + "vortex-fsst", + "vortex-onpair", + "vortex-pco", + "vortex-runend", + "vortex-sequence", + "vortex-sparse", + "vortex-utils", + "vortex-zigzag", + "vortex-zstd", +] + +[[package]] +name = "vortex-buffer" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a44f459872c724b453e927497d0e3da2b6902bdb1c41b380344377c9463fd38" +dependencies = [ + "allocator-api2", + "arrow-buffer", + "bitvec", + "bytes", + "itertools 0.14.0", + "simdutf8", + "vortex-error", +] + +[[package]] +name = "vortex-bytebool" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6156ce4fe5a5029db324fe812a999db87b88f0e653a11e440a26fc455e633732" +dependencies = [ + "num-traits", + "vortex-array", + "vortex-buffer", + "vortex-error", + "vortex-session", +] + +[[package]] +name = "vortex-compressor" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "465f796c789a7b0630130cba602ff2d672cb71883fb2ea061d6271558925c516" +dependencies = [ + "itertools 0.14.0", + "num-traits", + "parking_lot", + "rand 0.10.2", + "rustc-hash", + "tracing", + "vortex-array", + "vortex-buffer", + "vortex-error", + "vortex-mask", + "vortex-utils", +] + +[[package]] +name = "vortex-compute" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3f19f5b164afbec399bdf41c9c1b0c90afd8de98baf078a7a5ae2514ac8ba3f" +dependencies = [ + "vortex-buffer", +] + +[[package]] +name = "vortex-datetime-parts" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1feecd7ce3b66c03370f7a5450a15c759cd0a823c1fcde577c358287a902041" +dependencies = [ + "num-traits", + "prost", + "vortex-array", + "vortex-buffer", + "vortex-error", + "vortex-mask", + "vortex-session", +] + +[[package]] +name = "vortex-decimal-byte-parts" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cdd8ccb809d9bf839c1e3cd1b1adc5fd2a2ed9d3d74bb13764b73a0412fc064" +dependencies = [ + "num-traits", + "prost", + "vortex-array", + "vortex-buffer", + "vortex-error", + "vortex-mask", + "vortex-session", +] + +[[package]] +name = "vortex-edition" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b70fecc1d259c29774654ed16d011f36b568504447c2180943185f36141d038" +dependencies = [ + "parking_lot", + "vortex-error", + "vortex-session", +] + +[[package]] +name = "vortex-error" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "069ea43932ff10488f55ec10256a75a85e219607fdb29da87b888aa772de001d" +dependencies = [ + "arrow-schema", + "flatbuffers", + "jiff", + "prost", + "tokio", +] + +[[package]] +name = "vortex-fastlanes" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd5799e2e14034fa4e174fd935842318d0d858ad328b0dc17291ceb4ae96d2e1" +dependencies = [ + "fastlanes 0.7.2", + "itertools 0.14.0", + "lending-iterator", + "num-traits", + "prost", + "vortex-array", + "vortex-buffer", + "vortex-error", + "vortex-mask", + "vortex-session", +] + +[[package]] +name = "vortex-file" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b39794944bd6a9562c2928afd745c3d7f969587c07435bb37d6f37d34140b4a" +dependencies = [ + "async-stream", + "async-trait", + "bytes", + "flatbuffers", + "futures", + "itertools 0.14.0", + "kanal", + "moka", + "parking_lot", + "pin-project-lite", + "tokio", + "tracing", + "url", + "vortex-alp", + "vortex-array", + "vortex-btrblocks", + "vortex-buffer", + "vortex-bytebool", + "vortex-datetime-parts", + "vortex-decimal-byte-parts", + "vortex-edition", + "vortex-error", + "vortex-fastlanes", + "vortex-flatbuffers", + "vortex-fsst", + "vortex-io", + "vortex-layout", + "vortex-mask", + "vortex-metrics", + "vortex-onpair", + "vortex-pco", + "vortex-runend", + "vortex-scan", + "vortex-sequence", + "vortex-session", + "vortex-sparse", + "vortex-utils", + "vortex-zigzag", + "vortex-zstd", +] + +[[package]] +name = "vortex-flatbuffers" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d9ad94c8aa7cee143a234ce2c04f896ad6a7d01c615752328ca5305dfd897fc" +dependencies = [ + "flatbuffers", + "vortex-buffer", + "vortex-error", +] + +[[package]] +name = "vortex-fsst" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "612d95a0d18cac5e50318afc59bd41a24a384558c847bfda8797eff274b83a7f" +dependencies = [ + "fsst-rs", + "num-traits", + "prost", + "vortex-array", + "vortex-buffer", + "vortex-error", + "vortex-mask", + "vortex-session", +] + +[[package]] +name = "vortex-io" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9624f11d3d30e4965909717aec04670fe62106643449855fc8032faa6f1b9fbb" +dependencies = [ + "async-executor", + "async-fs", + "async-stream", + "async-trait", + "bytes", + "crossbeam-channel", + "custom-labels", + "futures", + "glob", + "kanal", + "parking_lot", + "pin-project-lite", + "smol", + "tokio", + "tracing", + "vortex-array", + "vortex-buffer", + "vortex-error", + "vortex-metrics", + "vortex-session", + "vortex-utils", + "wasm-bindgen-futures", +] + +[[package]] +name = "vortex-ipc" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a499ec004d6e1b23d52ba3aff0ce843a0689fc3e8eec0d8fc8a552e4de60472d" +dependencies = [ + "bytes", + "flatbuffers", + "futures", + "itertools 0.14.0", + "pin-project-lite", + "vortex-array", + "vortex-buffer", + "vortex-error", + "vortex-flatbuffers", + "vortex-session", +] + +[[package]] +name = "vortex-json" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ce0763be583581780f7f2ed8bb799d82b9084618dac19be05e460ca10ceafbb" +dependencies = [ + "arrow-array", + "arrow-schema", + "prost", + "vortex-array", + "vortex-arrow", + "vortex-edition", + "vortex-error", + "vortex-proto", + "vortex-session", +] + +[[package]] +name = "vortex-layout" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5877370f62b2fef5a8a6056a71aac81d80a456ca5667e4260182535cdffb6f11" +dependencies = [ + "arcref", + "arrow-array", + "arrow-schema", + "async-stream", + "async-trait", + "bit-vec", + "flatbuffers", + "futures", + "itertools 0.14.0", + "kanal", + "moka", + "once_cell", + "parking_lot", + "paste", + "pin-project-lite", + "prost", + "rustc-hash", + "sketches-ddsketch", + "termtree", + "tokio", + "tracing", + "twox-hash", + "uuid", + "vortex-array", + "vortex-arrow", + "vortex-btrblocks", + "vortex-buffer", + "vortex-error", + "vortex-flatbuffers", + "vortex-io", + "vortex-mask", + "vortex-metrics", + "vortex-runend", + "vortex-scan", + "vortex-sequence", + "vortex-session", + "vortex-utils", +] + +[[package]] +name = "vortex-mask" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91352099d66b9292a374eabcaf36ea0edc173305e05d595ceb2676a355054ec9" +dependencies = [ + "itertools 0.14.0", + "vortex-buffer", + "vortex-error", +] + +[[package]] +name = "vortex-metrics" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d93c771036f8ae5180288b5f5a190c10f6da913a950a11592af3c8fdfe27c53" +dependencies = [ + "parking_lot", + "sketches-ddsketch", +] + +[[package]] +name = "vortex-onpair" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4f3946d4ce6ebe42253a51ce4d65769e3a0243db3419bf44a60b2a9cb74b26c" +dependencies = [ + "num-traits", + "onpair", + "prost", + "vortex-array", + "vortex-buffer", + "vortex-error", + "vortex-mask", + "vortex-session", +] + +[[package]] +name = "vortex-parquet-variant" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faff122a19770b2716402c15b233c3696447c179ebf4e93b5449afb9f427db1f" +dependencies = [ + "arrow-array", + "arrow-buffer", + "arrow-schema", + "chrono", + "parquet-variant", + "parquet-variant-compute", + "prost", + "vortex-array", + "vortex-arrow", + "vortex-buffer", + "vortex-error", + "vortex-json", + "vortex-mask", + "vortex-proto", + "vortex-session", +] + +[[package]] +name = "vortex-pco" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1113d8543d967d442e5c035392d7c7e65ae5b18267e6fac5f210cc30b7d42fd6" +dependencies = [ + "pco", + "prost", + "vortex-array", + "vortex-buffer", + "vortex-error", + "vortex-mask", + "vortex-session", +] + +[[package]] +name = "vortex-proto" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95ed2db063cc759e9461fc40a6da95ddf17f2d8af8948a3fe3b5079e1d5f9fae" +dependencies = [ + "prost", + "prost-types", +] + +[[package]] +name = "vortex-runend" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9614791732d7b4f13036318685808cb3a285b249895b0142fb92f1add57643c2" +dependencies = [ + "itertools 0.14.0", + "num-traits", + "prost", + "vortex-array", + "vortex-buffer", + "vortex-error", + "vortex-mask", + "vortex-session", +] + +[[package]] +name = "vortex-scan" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fc7d948af3a2eb6a11e31643eb7c3db1cb7e188421b0a74fd36009bbd6c283d" +dependencies = [ + "async-trait", + "futures", + "roaring", + "tracing", + "vortex-array", + "vortex-buffer", + "vortex-error", + "vortex-mask", + "vortex-session", +] + +[[package]] +name = "vortex-sequence" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a864402ea44d12e6daae1d63a9d4b65a902ebea7f12436e84066c2bffbdcbd1b" +dependencies = [ + "num-traits", + "prost", + "smallvec", + "vortex-array", + "vortex-buffer", + "vortex-error", + "vortex-mask", + "vortex-proto", + "vortex-session", +] + +[[package]] +name = "vortex-session" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e3870512537f3a2a4df35f6044129b934bda96b44819d82744cfb2d4d9fe8f" +dependencies = [ + "arc-swap", + "lasso", + "parking_lot", + "vortex-error", + "vortex-utils", +] + +[[package]] +name = "vortex-sparse" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a58a99b9033e19bd3dabbbe18fe33cabc99b4ceb4b30329baea317e734e2ddf0" +dependencies = [ + "itertools 0.14.0", + "num-traits", + "prost", + "vortex-array", + "vortex-buffer", + "vortex-error", + "vortex-mask", + "vortex-session", +] + +[[package]] +name = "vortex-utils" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17f3f61a19a4f06e5db46faf52f76c403b6202ac662be298e36ec3cfe2d0a034" +dependencies = [ + "dashmap", + "hashbrown 0.17.1", +] + +[[package]] +name = "vortex-zigzag" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dc33b4e0a82055e8576161588258efb1b8581459db4decee20ed6a48605509e" +dependencies = [ + "vortex-array", + "vortex-buffer", + "vortex-error", + "vortex-mask", + "vortex-session", + "zigzag", +] + +[[package]] +name = "vortex-zstd" +version = "0.86.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5b49914d9a3b1bcba92a7e79a4cc3e2136f2ced349cbe91ec7eb2d30bc9dec4" +dependencies = [ + "itertools 0.14.0", + "num-traits", + "prost", + "vortex-array", + "vortex-buffer", + "vortex-edition", + "vortex-error", + "vortex-mask", + "vortex-session", + "zstd", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.128" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aecb87a33d3b0c5e3b7aa46336eaf486cffafbd281b195e4c8b80d50df2351bf" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ef4c5d3d2cdf5c54f4231181768f5510842e350db025faf1f7163b1030ed928" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.128" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a690d511e3c1a8b3a55e33511e3c2c00c78415cd23650f32b808627f5696b9ed" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.128" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "411e4887f0071ef2d2164a9d5fdf2d20efbef78fccd3a78b0c10a1dc5295e48a" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 3.0.6", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.128" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81941cd78d0c92026c33e5e01312845a4cb1e9af3407f9134b100dd03144103e" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "writeable" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33811428bee40dbceb6d545e95754741d17a6aef9a4849f0fd62e2ba4f412a78" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d35102a9f36d089ccae9e4c6802bc118be4487b80aaffc0ab4e0cf5ce92d2873" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "146c01f5ab44258da43cf276c74a2763db2ff3969c9c652c3f2de07041d0b2bc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", + "synstructure", +] + +[[package]] +name = "zerotrie" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0464e17806c1d976d5cba29399c7f08e516e279e2ba493f63123b5fca67dd8" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "zigzag" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70b40401a28d86ce16a330b863b86fd7dbee4d7c940587ab09ab8c019f9e3fdf" +dependencies = [ + "num-traits", +] + +[[package]] +name = "zlib-rs" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b268e58e7c693d7c271f93ffc4ba3b380412554231c85bf61ca7af91042a4112" + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" + +[[package]] +name = "zstd" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "7.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64d80649ab6db9d9f6f9c80a40becd948eda4714a0a5ac8c4d157a32231c7882" +dependencies = [ + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.1.0+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef0a8027ec3ee71300ab3bcbcd0393f434aa72b91ca6d635a39941deae8eea0" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/clients/rust/Cargo.toml b/clients/rust/Cargo.toml new file mode 100644 index 0000000..aa4ebbd --- /dev/null +++ b/clients/rust/Cargo.toml @@ -0,0 +1,33 @@ +# SPDX-FileCopyrightText: 2026 Raincloud Maintainers +# SPDX-License-Identifier: Apache-2.0 +[package] +name = "raincloud-reader" +version = "0.3.0" +edition = "2021" +rust-version = "1.95" +publish = false +include = ["src/**", "tests/**", "build.rs", "Cargo.toml", "Cargo.lock"] +license = "Apache-2.0" +description = "Datasets-style Raincloud reads over the Arrow C stream API; resolution runs in the raincloud CLI" + +[workspace] + +[lib] +name = "raincloud_reader" +crate-type = ["rlib", "cdylib"] + +[features] +default = ["vortex"] +vortex = ["dep:vortex", "dep:tokio"] + +[dependencies] +arrow-array = { version = "=59.2", features = ["ffi"] } +arrow-schema = "=59.2" +arrow-ipc = { version = "=59.2", features = ["zstd"] } +parquet = "=59.2" +vortex = { version = "=0.86.1", features = ["files", "tokio", "zstd"], optional = true } +tokio = { version = "1", features = ["rt-multi-thread"], optional = true } +# The describe reply is re-serialized for C and Java callers; arbitrary_precision +# passes its numbers through verbatim (2**64 seeds, u64 row counts, -0) instead +# of rounding them through f64. +serde_json = { version = "1", features = ["arbitrary_precision"] } diff --git a/clients/rust/build.rs b/clients/rust/build.rs new file mode 100644 index 0000000..d347ba8 --- /dev/null +++ b/clients/rust/build.rs @@ -0,0 +1,18 @@ +// SPDX-FileCopyrightText: 2026 Raincloud Maintainers +// SPDX-License-Identifier: Apache-2.0 +//! Give the C library an install-independent name. Without a SONAME a linker +//! records the absolute path it linked against in each consumer, and moving +//! the installation breaks them. +fn main() { + match std::env::var("CARGO_CFG_TARGET_OS").as_deref() { + Ok("linux" | "android" | "freebsd" | "netbsd" | "openbsd" | "dragonfly") => { + println!("cargo:rustc-cdylib-link-arg=-Wl,-soname,libraincloud_reader.so") + } + Ok("macos" | "ios") => { + println!( + "cargo:rustc-cdylib-link-arg=-Wl,-install_name,@rpath/libraincloud_reader.dylib" + ) + } + _ => {} + } +} diff --git a/clients/rust/src/cli.rs b/clients/rust/src/cli.rs new file mode 100644 index 0000000..86b5a71 --- /dev/null +++ b/clients/rust/src/cli.rs @@ -0,0 +1,166 @@ +// SPDX-FileCopyrightText: 2026 Raincloud Maintainers +// SPDX-License-Identifier: Apache-2.0 +//! Catalog selection, resolution, downloads and verification all belong to the +//! `raincloud` command line tool; this crate only runs it and reads the path. +use crate::{Error, ErrorKind, Result}; +use serde_json::{Map, Value}; +use std::fmt; +use std::process::{Command, Stdio}; + +/// Settings travel in this environment variable, named by `--settings-env`. +/// A process's environment is readable only by its own user, while its command +/// line (`/proc/*/cmdline`) is readable by every account on the machine, and +/// settings can carry credentials: a mirror URL with a user or a signed query. +const SETTINGS_ENV: &str = "RAINCLOUD_SETTINGS"; + +/// The formats this build decodes. `auto` chooses among these, not among the +/// readers the CLI's own Python environment happens to have installed. +pub(crate) const READERS: &str = if cfg!(feature = "vortex") { + "arrow,parquet,vortex" +} else { + "arrow,parquet" +}; + +/// How much of a reply that is not JSON to quote in the error. +const EXCERPT_CHARS: usize = 200; + +/// How to reach the CLI, and the settings to hand it verbatim. +#[derive(Clone)] +pub(crate) struct Cli { + exe: String, + settings: Map, +} + +// Settings can carry credentials: name them, never print their values. +impl fmt::Debug for Cli { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("Cli") + .field("exe", &self.exe) + .field("settings", &self.settings.keys().collect::>()) + .finish() + } +} + +impl Cli { + /// `options` are Raincloud settings (the TOML keys, plus `config` and + /// `no_config`), validated by the CLI. The one native-only key, `cli`, + /// names the executable; otherwise `RAINCLOUD_CLI`, otherwise `PATH`. + pub(crate) fn new(options: &Value) -> Result { + let mut settings = match options { + Value::Null => Map::new(), + Value::Object(map) => map.clone(), + _ => { + return Err(Error::new( + ErrorKind::InvalidArgument, + "options must be a JSON object", + )) + } + }; + let exe = match settings.remove("cli") { + Some(Value::String(path)) => path, + Some(_) => { + return Err(Error::new( + ErrorKind::InvalidArgument, + "the `cli` option must be a path", + )) + } + None => std::env::var("RAINCLOUD_CLI").unwrap_or_else(|_| "raincloud".into()), + }; + Ok(Self { exe, settings }) + } + + /// Run one subcommand with `--json`. Stderr is left attached so warnings + /// (checksum drift, re-fetches) reach the caller's terminal or log. + pub(crate) fn run(&self, overrides: &[(&str, &Value)], args: &[&str]) -> Result { + let mut settings = self.settings.clone(); + for (key, value) in overrides { + settings.insert((*key).to_owned(), (*value).clone()); + } + let output = Command::new(&self.exe) + .arg("--json") + .arg("--settings-env") + .args(args) + .env(SETTINGS_ENV, Value::Object(settings).to_string()) + .stdin(Stdio::null()) + .stderr(Stdio::inherit()) + .output() + .map_err(|e| { + Error::new( + ErrorKind::Io, + format!( + "cannot run `{}` ({e}); install raincloud, or set the `cli` option or RAINCLOUD_CLI", + self.exe + ), + ) + })?; + let command = format!("`{} {}`", self.exe, args.join(" ")); + let reply: Value = match serde_json::from_slice(&output.stdout) { + Ok(reply) => reply, + // argparse rejects arguments it does not know with status 2. + Err(_) if output.status.code() == Some(2) => { + return Err(Error::new( + ErrorKind::Internal, + format!( + "{command} was rejected; `{}` is probably older than this reader \ + (needs `raincloud describe`, `--json` and `--settings-env`); see its stderr", + self.exe + ), + )) + } + Err(_) if !output.status.success() => { + return Err(Error::new( + ErrorKind::Internal, + format!("{command} exited with {}; see its stderr", output.status), + )) + } + // Exit 0 with a reply that does not parse: something else wrote to + // stdout, or the CLI printed a value JSON cannot carry. + Err(e) => { + return Err(Error::new( + ErrorKind::Internal, + format!( + "{command} succeeded but its reply is not JSON ({e}): {:?}", + excerpt(&output.stdout) + ), + )) + } + }; + match reply { + Value::Object(mut map) if map.contains_key("error") => { + let error = map.remove("error").unwrap_or_default(); + let class = error["type"].as_str().unwrap_or("unknown error"); + let message = error["message"].as_str().unwrap_or(class); + let Some(mro) = error["mro"].as_array() else { + return Err(Error::new( + ErrorKind::Internal, + format!( + "{command} reported {class} without its class MRO; `{}` is older \ + than this reader: {message}", + self.exe + ), + )); + }; + Err(Error::new( + ErrorKind::from_python(mro.iter().filter_map(Value::as_str)), + message, + )) + } + reply if output.status.success() => Ok(reply), + _ => Err(Error::new( + ErrorKind::Internal, + format!( + "{command} exited with {} without reporting an error; see its stderr", + output.status + ), + )), + } + } +} + +fn excerpt(stdout: &[u8]) -> String { + let text = String::from_utf8_lossy(stdout); + match text.char_indices().nth(EXCERPT_CHARS) { + Some((end, _)) => format!("{}...", &text[..end]), + None => text.into_owned(), + } +} diff --git a/clients/rust/src/error.rs b/clients/rust/src/error.rs new file mode 100644 index 0000000..919c960 --- /dev/null +++ b/clients/rust/src/error.rs @@ -0,0 +1,225 @@ +// SPDX-FileCopyrightText: 2026 Raincloud Maintainers +// SPDX-License-Identifier: Apache-2.0 +use std::fmt; + +/// Stable categories shared with the C and Java APIs. Messages are diagnostic. +/// +/// The numbers are ABI: codes are only ever appended, and a C or Java caller +/// treats a code it does not know as `Internal`. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +#[repr(i32)] +pub enum ErrorKind { + InvalidArgument = 1, + Catalog = 2, + MissingRevision = 3, + UnknownSlug = 4, + FormatUnavailable = 5, + OfflineMiss = 6, + ArtifactNotFound = 7, + ChecksumMismatch = 8, + /// Producer-side (build/publish); a read does not raise it. + CatalogConflict = 9, + /// A mirror could not be read: unreachable, refused, or not a store. A + /// mirror that answers "no such file" is `ArtifactNotFound`. + Transport = 10, + /// The bytes are fine and this build cannot represent their type; ask for + /// another format. + UnsupportedType = 11, + Io = 12, + Internal = 13, + /// The artifact was found but could not be decoded: truncated, damaged, or + /// not the format its path claims. Re-fetch or rebuild it; another format + /// will not help. + CorruptArtifact = 14, +} +#[derive(Debug)] +pub struct Error { + pub kind: ErrorKind, + pub message: String, +} +pub type Result = std::result::Result; +impl ErrorKind { + /// Every kind, in code order. + #[cfg(test)] + const ALL: [Self; 14] = [ + Self::InvalidArgument, + Self::Catalog, + Self::MissingRevision, + Self::UnknownSlug, + Self::FormatUnavailable, + Self::OfflineMiss, + Self::ArtifactNotFound, + Self::ChecksumMismatch, + Self::CatalogConflict, + Self::Transport, + Self::UnsupportedType, + Self::Io, + Self::Internal, + Self::CorruptArtifact, + ]; + /// The CLI reports a failure by its Python exception class's MRO. The + /// first class in it with a code decides, so a subclass keeps its parent's + /// category unless it has its own (`MissingRevision` is not + /// `CatalogError`; `FileNotFoundError` is `OSError`). + pub(crate) fn from_python<'a>(mro: impl IntoIterator) -> Self { + mro.into_iter() + .find_map(Self::from_python_class) + .unwrap_or(Self::Internal) + } + fn from_python_class(name: &str) -> Option { + Some(match name { + "ValueError" => Self::InvalidArgument, + "CatalogError" => Self::Catalog, + "MissingRevision" => Self::MissingRevision, + "UnknownSlug" => Self::UnknownSlug, + "FormatUnavailable" | "MissingDependency" => Self::FormatUnavailable, + "OfflineMiss" => Self::OfflineMiss, + "ArtifactNotFound" => Self::ArtifactNotFound, + "ChecksumMismatch" => Self::ChecksumMismatch, + "CatalogConflict" => Self::CatalogConflict, + "MirrorUnavailable" => Self::Transport, + "UnsupportedType" => Self::UnsupportedType, + "CorruptArtifact" => Self::CorruptArtifact, + "OSError" => Self::Io, + _ => return None, + }) + } +} +impl Error { + pub fn new(kind: ErrorKind, message: impl ToString) -> Self { + Self { + kind, + message: message.to_string(), + } + } +} +impl fmt::Display for Error { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{:?}: {}", self.kind, self.message) + } +} +impl std::error::Error for Error {} +impl From for Error { + fn from(e: std::io::Error) -> Self { + Self::new(ErrorKind::Io, e) + } +} +impl From for Error { + fn from(e: serde_json::Error) -> Self { + Self::new(ErrorKind::InvalidArgument, e) + } +} +// Only the "not implemented" variants mean the type is beyond this build, and +// only an I/O failure is `Io`; the rest describe damaged or unreadable bytes. A +// read that ends early is the file being shorter than its own structure says: +// damage, not an I/O failure. +pub(crate) fn io_kind(io: &std::io::Error) -> ErrorKind { + if io.kind() == std::io::ErrorKind::UnexpectedEof { + ErrorKind::CorruptArtifact + } else { + ErrorKind::Io + } +} +pub(crate) fn arrow_kind(e: &arrow_schema::ArrowError) -> ErrorKind { + match e { + arrow_schema::ArrowError::NotYetImplemented(_) => ErrorKind::UnsupportedType, + arrow_schema::ArrowError::IoError(_, io) => io_kind(io), + _ => ErrorKind::CorruptArtifact, + } +} +impl From for Error { + fn from(e: arrow_schema::ArrowError) -> Self { + Self::new(arrow_kind(&e), e) + } +} +impl From for Error { + fn from(e: parquet::errors::ParquetError) -> Self { + use parquet::errors::ParquetError as P; + let kind = match &e { + P::NYI(_) => ErrorKind::UnsupportedType, + P::External(source) => match source.downcast_ref::() { + Some(io) => io_kind(io), + None => ErrorKind::CorruptArtifact, + }, + _ => ErrorKind::CorruptArtifact, + }; + Self::new(kind, e) + } +} + +#[cfg(test)] +mod tests { + use super::{Error, ErrorKind}; + use std::io; + + #[test] + fn only_an_io_failure_is_io() { + use arrow_schema::ArrowError; + use parquet::errors::ParquetError; + for (io, kind) in [ + (io::ErrorKind::PermissionDenied, ErrorKind::Io), + (io::ErrorKind::Other, ErrorKind::Io), + (io::ErrorKind::UnexpectedEof, ErrorKind::CorruptArtifact), + ] { + let arrow = Error::from(ArrowError::IoError("read".into(), io::Error::from(io))); + assert_eq!(arrow.kind, kind, "arrow {io:?}"); + let parquet = Error::from(ParquetError::External(Box::new(io::Error::from(io)))); + assert_eq!(parquet.kind, kind, "parquet {io:?}"); + } + let external = ParquetError::External(Box::new(ArrowError::ComputeError("x".into()))); + assert_eq!(Error::from(external).kind, ErrorKind::CorruptArtifact); + assert_eq!( + Error::from(ParquetError::General("bad page".into())).kind, + ErrorKind::CorruptArtifact + ); + assert_eq!( + Error::from(ParquetError::NYI("INTERVAL".into())).kind, + ErrorKind::UnsupportedType + ); + } + + #[test] + fn codes_are_dense_and_ordered() { + for (i, kind) in ErrorKind::ALL.iter().enumerate() { + assert_eq!(*kind as i32, i as i32 + 1); + } + } + + #[test] + fn first_known_class_in_the_mro_decides() { + let cases: &[(&[&str], ErrorKind)] = &[ + ( + &["UnknownSlug", "RaincloudError", "Exception"], + ErrorKind::UnknownSlug, + ), + ( + &["MissingRevision", "CatalogError", "RaincloudError"], + ErrorKind::MissingRevision, + ), + ( + &["FileNotFoundError", "OSError", "Exception"], + ErrorKind::Io, + ), + ( + &["JSONDecodeError", "ValueError", "Exception"], + ErrorKind::InvalidArgument, + ), + ( + &["BuildFailed", "RaincloudError", "Exception"], + ErrorKind::Internal, + ), + ( + &["KeyError", "LookupError", "Exception"], + ErrorKind::Internal, + ), + (&[], ErrorKind::Internal), + ]; + for (mro, kind) in cases { + assert_eq!( + ErrorKind::from_python(mro.iter().copied()), + *kind, + "{mro:?}" + ); + } + } +} diff --git a/clients/rust/src/ffi.rs b/clients/rust/src/ffi.rs new file mode 100644 index 0000000..4c10c1c --- /dev/null +++ b/clients/rust/src/ffi.rs @@ -0,0 +1,158 @@ +// SPDX-FileCopyrightText: 2026 Raincloud Maintainers +// SPDX-License-Identifier: Apache-2.0 +//! C ABI ownership: each successful open/string/stream has exactly one release. +//! Callers must pass valid pointers, exclusively own mutable outputs, and never +//! reuse released handles. Panics at exported function boundaries become errors. +use crate::{Dataset, Error, ErrorKind, Result}; +use arrow_array::ffi_stream::FFI_ArrowArrayStream; +use std::{ + ffi::{c_char, CStr, CString}, + panic::{catch_unwind, AssertUnwindSafe}, + ptr, +}; + +#[repr(C)] +pub struct RcError { + pub code: i32, + pub message: *mut c_char, +} +fn run(error: *mut RcError, f: impl FnOnce() -> Result<()>) -> i32 { + let result = catch_unwind(AssertUnwindSafe(f)) + .unwrap_or_else(|_| Err(Error::new(ErrorKind::Internal, "native reader panicked"))); + match result { + Ok(()) => 0, + Err(e) => { + if !error.is_null() { + unsafe { + (*error).code = e.kind as i32; + (*error).message = CString::new(e.message.replace('\0', "\\0")) + .unwrap() + .into_raw(); + } + } + e.kind as i32 + } + } +} +unsafe fn text<'a>(p: *const c_char) -> Result<&'a str> { + if p.is_null() { + return Err(Error::new(ErrorKind::InvalidArgument, "null string")); + } + CStr::from_ptr(p) + .to_str() + .map_err(|e| Error::new(ErrorKind::InvalidArgument, e)) +} +unsafe fn ds<'a>(p: *const Dataset) -> Result<&'a Dataset> { + p.as_ref() + .ok_or_else(|| Error::new(ErrorKind::InvalidArgument, "null dataset")) +} +#[no_mangle] +pub extern "C" fn raincloud_abi_version() -> u32 { + 1 +} +#[no_mangle] +pub unsafe extern "C" fn raincloud_open( + options: *const c_char, + slug: *const c_char, + format: *const c_char, + out: *mut *mut Dataset, + error: *mut RcError, +) -> i32 { + run(error, || { + if out.is_null() { + return Err(Error::new(ErrorKind::InvalidArgument, "null output")); + } + *out = ptr::null_mut(); + let options: serde_json::Value = serde_json::from_str(if options.is_null() { + "{}" + } else { + text(options)? + })?; + let value = Dataset::load( + &options, + text(slug)?, + if format.is_null() { + "auto" + } else { + text(format)? + }, + )?; + *out = Box::into_raw(Box::new(value)); + Ok(()) + }) +} +#[no_mangle] +pub unsafe extern "C" fn raincloud_metadata( + handle: *const Dataset, + out: *mut *mut c_char, + error: *mut RcError, +) -> i32 { + run(error, || { + if out.is_null() { + return Err(Error::new(ErrorKind::InvalidArgument, "null output")); + } + *out = ptr::null_mut(); + let value = serde_json::to_string(ds(handle)?.metadata())?; + *out = CString::new(value).unwrap().into_raw(); + Ok(()) + }) +} +#[no_mangle] +pub unsafe extern "C" fn raincloud_path( + handle: *const Dataset, + out: *mut *mut c_char, + error: *mut RcError, +) -> i32 { + run(error, || { + if out.is_null() { + return Err(Error::new(ErrorKind::InvalidArgument, "null output")); + } + *out = ptr::null_mut(); + let path = ds(handle)?.path()?; + *out = CString::new( + path.to_str() + .ok_or_else(|| Error::new(ErrorKind::InvalidArgument, "path is not UTF-8"))?, + ) + .map_err(|e| Error::new(ErrorKind::InvalidArgument, e))? + .into_raw(); + Ok(()) + }) +} +#[no_mangle] +pub unsafe extern "C" fn raincloud_batches( + handle: *const Dataset, + batch_size: usize, + out: *mut FFI_ArrowArrayStream, + error: *mut RcError, +) -> i32 { + run(error, || { + if out.is_null() { + return Err(Error::new(ErrorKind::InvalidArgument, "null stream output")); + } + // out must be uninitialized/released storage, never an existing live stream. + ptr::write(out, FFI_ArrowArrayStream::empty()); + let reader = ds(handle)?.batches(batch_size)?; + ptr::write(out, FFI_ArrowArrayStream::new(Box::new(reader))); + Ok(()) + }) +} +#[no_mangle] +pub unsafe extern "C" fn raincloud_close(handle: *mut Dataset) { + if !handle.is_null() { + drop(Box::from_raw(handle)); + } +} +#[no_mangle] +pub unsafe extern "C" fn raincloud_string_free(value: *mut c_char) { + if !value.is_null() { + drop(CString::from_raw(value)); + } +} +#[no_mangle] +pub unsafe extern "C" fn raincloud_error_free(error: *mut RcError) { + if let Some(e) = error.as_mut() { + raincloud_string_free(e.message); + e.message = ptr::null_mut(); + e.code = 0; + } +} diff --git a/clients/rust/src/lib.rs b/clients/rust/src/lib.rs new file mode 100644 index 0000000..eb09905 --- /dev/null +++ b/clients/rust/src/lib.rs @@ -0,0 +1,166 @@ +// SPDX-FileCopyrightText: 2026 Raincloud Maintainers +// SPDX-License-Identifier: Apache-2.0 +//! Datasets-style reads for Rust, C and C++: name a dataset, get Arrow batches. +//! Everything before the bytes — catalog, resolution, download, verification — +//! is dispatched to the `raincloud` command line tool. +//! +//! Every open/path/batches/schema call runs one `raincloud` process and blocks +//! until it exits. It inherits this process's environment, working directory +//! (relative settings resolve against it) and stderr, and may wait on the +//! store's download lock with no timeout. +mod cli; +mod error; +mod ffi; +mod reader; +pub use arrow_array::RecordBatchReader; +pub use error::{Error, ErrorKind, Result}; +pub use reader::Batches; +use serde_json::Value; +use std::fmt; + +/// A dataset selected from the catalog. Opening reads catalog metadata only; +/// the artifact is resolved when you ask for its path or its batches. +#[derive(Clone)] +pub struct Dataset { + cli: cli::Cli, + slug: String, + format: String, + revision: String, + metadata: Value, +} + +// The CLI half carries settings, which can carry credentials. +impl fmt::Debug for Dataset { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("Dataset") + .field("slug", &self.slug) + .field("format", &self.format) + .field("catalog_revision", &self.revision) + .finish_non_exhaustive() + } +} + +/// `load("uci-seeds")` with default settings and automatic format. +pub fn load(slug: &str) -> Result { + Dataset::load(&Value::Null, slug, "auto") +} + +/// A string field of a CLI reply. A missing one means the CLI and this reader +/// disagree about the protocol, which must not be papered over with a default. +fn reply_str<'a>(reply: &'a Value, command: &str, key: &str) -> Result<&'a str> { + reply[key].as_str().ok_or_else(|| { + Error::new( + ErrorKind::Internal, + format!("`raincloud {command}` replied without a string `{key}`; the CLI and this reader are different versions"), + ) + }) +} + +impl Dataset { + /// `format`: auto, arrow, parquet, or vortex. + pub fn load(options: &Value, slug: &str, format: &str) -> Result { + if slug.is_empty() || slug.contains('\0') { + return Err(Error::new( + ErrorKind::InvalidArgument, + format!("{slug:?} is not a dataset name"), + )); + } + // Refused here, not by the CLI: argparse would read `-x` as an option + // and exit 2, and a NUL cannot reach a command line at all, so both + // would surface as the wrong kind of error. + if format.is_empty() || format.contains('\0') || format.starts_with('-') { + return Err(Error::new( + ErrorKind::InvalidArgument, + format!("{format:?} is not a format; use auto, arrow, parquet or vortex"), + )); + } + let cli = cli::Cli::new(options)?; + // `--format=VALUE` keeps the value one argument, and `--` keeps a slug + // that starts with `-` a name, not an option. + let metadata = cli.run( + &[], + &[ + "describe", + &format!("--format={format}"), + "--readers", + cli::READERS, + "--", + slug, + ], + )?; + let selected = reply_str(&metadata, "describe", "format")?; + if selected.is_empty() || selected.contains('@') { + return Err(Error::new( + ErrorKind::Internal, + format!("`raincloud describe` selected format {selected:?}, which is not a format"), + )); + } + reply_str(&metadata, "describe", "catalog_source")?; + Ok(Self { + format: selected.to_owned(), + revision: reply_str(&metadata, "describe", "catalog_revision")?.to_owned(), + cli, + slug: slug.to_owned(), + metadata, + }) + } + /// Catalog record: rows, columns, formats, catalog revision, recipe. + pub fn metadata(&self) -> &Value { + &self.metadata + } + /// The selected representation, e.g. `vortex`. + pub fn format(&self) -> &str { + &self.format + } + /// Return a location, not a read lease; publishers may replace it. + /// + /// Resolves against the catalog generation this handle opened with. A + /// revision or pack-directory selection names that generation again; a + /// checkout, local manifest or bundled catalog that has changed since the + /// open is refused with `Catalog` rather than read. + pub fn path(&self) -> Result { + let reply = self.cli.run( + &[("catalog", &self.metadata["catalog_source"])], + &[ + "load", + &format!("--format={}", self.format), + "--readers", + cli::READERS, + "--", + &self.slug, + ], + )?; + let revision = reply_str(&reply, "load", "catalog_revision")?; + if revision != self.revision { + return Err(Error::new( + ErrorKind::Catalog, + format!( + "the catalog changed since {} was opened (revision {} then, {revision} now); open it again", + self.slug, self.revision + ), + )); + } + Ok(reply_str(&reply, "load", "path")?.into()) + } + /// Refuses a format this build cannot decode before resolving anything, + /// so no bytes are downloaded only to be refused. + pub fn batches(&self, batch_size: usize) -> Result { + if batch_size == 0 { + return Err(Error::new( + ErrorKind::InvalidArgument, + "batch_size must be positive", + )); + } + if !cli::READERS.split(',').any(|f| f == self.format) { + return Err(Error::new( + ErrorKind::FormatUnavailable, + format!("reader not compiled for {}", self.format), + )); + } + Batches::open(&self.path()?, &self.format, batch_size) + } + /// May resolve/download bytes; does not materialize rows. + pub fn schema(&self) -> Result { + Ok(self.batches(65536)?.schema()) + } +} diff --git a/clients/rust/src/reader.rs b/clients/rust/src/reader.rs new file mode 100644 index 0000000..6143b51 --- /dev/null +++ b/clients/rust/src/reader.rs @@ -0,0 +1,270 @@ +// SPDX-FileCopyrightText: 2026 Raincloud Maintainers +// SPDX-License-Identifier: Apache-2.0 +use crate::{Error, ErrorKind, Result}; +use arrow_array::{RecordBatch, RecordBatchReader}; +use arrow_schema::{ArrowError, SchemaRef}; +use std::{ + fs::File, + panic::{catch_unwind, AssertUnwindSafe}, + path::Path, +}; + +/// Iterator owns its source and releases it on drop; yielded batches own buffers. +/// `batch_size` bounds returned rows, not the size of an encoded IPC/Vortex chunk. +/// +/// A decoder that panics yields an error for that batch and ends the stream; +/// the panic never unwinds out of `next`. It is `Internal`, not +/// `CorruptArtifact`: a panic on damaged bytes cannot be told apart from a +/// decoder bug. This iterator is also the producer behind the C stream, whose +/// callbacks must not unwind into a C, C++ or JVM frame. +pub struct Batches { + inner: Box, + schema: SchemaRef, + pending: Option, + batch_size: usize, + panicked: bool, +} +impl Iterator for Batches { + type Item = std::result::Result; + fn next(&mut self) -> Option { + let batch = match self.pending.take() { + Some(b) => b, + None if self.panicked => return None, + None => match catch_unwind(AssertUnwindSafe(|| self.inner.next())) { + Ok(None) => return None, + Ok(Some(Ok(b))) => b, + Ok(Some(Err(e))) => return Some(Err(e)), + Err(panic) => { + // The decoder's state is unknown after a panic: stop here. + self.panicked = true; + let what = panic + .downcast_ref::<&str>() + .map(|s| s.to_string()) + .or_else(|| panic.downcast_ref::().cloned()) + .unwrap_or_else(|| "no message".into()); + return Some(Err(ArrowError::ExternalError(Box::new(Error::new( + ErrorKind::Internal, + format!("the decoder panicked (damaged bytes or a decoder bug): {what}"), + ))))); + } + }, + }; + if batch.num_rows() > self.batch_size { + self.pending = Some(batch.slice(self.batch_size, batch.num_rows() - self.batch_size)); + Some(Ok(batch.slice(0, self.batch_size))) + } else { + Some(Ok(batch)) + } + } +} +impl RecordBatchReader for Batches { + fn schema(&self) -> SchemaRef { + self.schema.clone() + } +} +impl Batches { + pub(crate) fn open(path: &Path, format: &str, batch_size: usize) -> Result { + if batch_size == 0 { + return Err(Error::new( + ErrorKind::InvalidArgument, + "batch_size must be positive", + )); + } + let inner: Box = match format { + "arrow" => Box::new(arrow_ipc::reader::FileReader::try_new( + File::open(path)?, + None, + )?), + "parquet" => Box::new( + parquet::arrow::arrow_reader::ParquetRecordBatchReaderBuilder::try_new( + File::open(path)?, + )? + .with_batch_size(batch_size) + .build()?, + ), + #[cfg(feature = "vortex")] + "vortex" => vortex_reader(path)?, + _ => { + return Err(Error::new( + ErrorKind::FormatUnavailable, + format!("reader not compiled for {format}"), + )) + } + }; + Ok(Self::from_reader(inner, batch_size)) + } + fn from_reader(inner: Box, batch_size: usize) -> Self { + let schema = inner.schema(); + Self { + inner, + schema, + pending: None, + batch_size, + panicked: false, + } + } +} +/// Classify a Vortex failure the way the IPC and Parquet conversions do +/// (`error::io_kind`, `error::arrow_kind`): an I/O failure is `Io`, a type +/// this build cannot express is `UnsupportedType`, and anything else means the +/// bytes are not a readable Vortex file. +#[cfg(feature = "vortex")] +fn vortex_error(e: vortex::error::VortexError) -> Error { + use crate::error::{arrow_kind, io_kind}; + use vortex::error::VortexError as V; + let mut cause = &e; + loop { + match cause { + V::Context(_, inner) => cause = inner, + V::Shared(inner) => cause = inner, + _ => break, + } + } + let kind = match cause { + V::Io(io, _) => io_kind(io), + V::Arrow(arrow, _) => arrow_kind(arrow), + V::External(source, _) => source + .downcast_ref::() + .map_or(ErrorKind::CorruptArtifact, io_kind), + V::NotImplemented(..) => ErrorKind::UnsupportedType, + _ => ErrorKind::CorruptArtifact, + }; + Error::new(kind, e) +} +#[cfg(feature = "vortex")] +fn vortex_reader(path: &Path) -> Result> { + use vortex::{ + arrow::ArrowSessionExt, + file::OpenOptionsSessionExt, + io::{ + runtime::{tokio::TokioRuntime, BlockingRuntime}, + session::RuntimeSessionExt, + }, + session::VortexSession, + VortexSessionDefault, + }; + // A dedicated runtime lets synchronous native clients own their reader; + // no process-global runtime or caller thread-local runtime is required. + let runtime = tokio::runtime::Builder::new_multi_thread() + .worker_threads(2) + .enable_all() + .build()?; + let blocking = TokioRuntime::from(runtime.handle()); + let session = VortexSession::default().with_handle(blocking.handle()); + let file = blocking + .block_on(session.open_options().open_path(path)) + .map_err(vortex_error)?; + // The file decoded; only its dtype has no Arrow form in this build. + let schema = std::sync::Arc::new( + session + .arrow() + .to_arrow_schema(file.dtype()) + .map_err(|e| Error::new(ErrorKind::UnsupportedType, e))?, + ); + let reader = file + .scan() + .and_then(|s| s.into_record_batch_reader(schema, &blocking)) + .map_err(vortex_error)?; + struct Owned { + reader: Box, + _runtime: tokio::runtime::Runtime, + } + impl Iterator for Owned { + type Item = std::result::Result; + fn next(&mut self) -> Option { + self.reader.next() + } + } + impl RecordBatchReader for Owned { + fn schema(&self) -> SchemaRef { + self.reader.schema() + } + } + Ok(Box::new(Owned { + reader: Box::new(reader), + _runtime: runtime, + })) +} + +#[cfg(test)] +mod tests { + use super::*; + use arrow_array::ffi_stream::{ArrowArrayStreamReader, FFI_ArrowArrayStream}; + use arrow_schema::{DataType, Field, Schema}; + use std::sync::Arc; + + struct Panics(SchemaRef); + impl Iterator for Panics { + type Item = std::result::Result; + fn next(&mut self) -> Option { + panic!("decoder exploded") + } + } + impl RecordBatchReader for Panics { + fn schema(&self) -> SchemaRef { + self.0.clone() + } + } + + #[test] + fn a_decoder_panic_is_a_stream_error_not_an_unwind() { + let schema = Arc::new(Schema::new(vec![Field::new("x", DataType::Int32, true)])); + let batches = Batches::from_reader(Box::new(Panics(schema)), 4); + // Through the C stream callbacks, as a C, C++ or Java consumer reads it. + let stream = FFI_ArrowArrayStream::new(Box::new(batches)); + let mut reader = ArrowArrayStreamReader::try_new(stream).unwrap(); + let error = reader.next().unwrap().unwrap_err().to_string(); + assert!(error.contains("decoder exploded"), "{error}"); + assert!(reader.next().is_none()); + } + + #[test] + fn undecodable_bytes_are_corrupt_not_unsupported() { + let dir = std::env::temp_dir().join(format!("raincloud-reader-{}", std::process::id())); + std::fs::create_dir_all(&dir).unwrap(); + let mut formats = vec!["arrow", "parquet"]; + if cfg!(feature = "vortex") { + formats.push("vortex"); + } + for format in formats { + let path = dir.join(format!("zeros.{format}")); + std::fs::write(&path, [0u8; 4096]).unwrap(); + let kind = Batches::open(&path, format, 8).err().map(|e| e.kind); + assert_eq!(kind, Some(ErrorKind::CorruptArtifact), "{format}"); + let missing = dir.join(format!("missing.{format}")); + let kind = Batches::open(&missing, format, 8).err().map(|e| e.kind); + assert_eq!(kind, Some(ErrorKind::Io), "{format}"); + } + std::fs::remove_dir_all(&dir).unwrap(); + } + + #[cfg(feature = "vortex")] + #[test] + fn vortex_io_failures_are_io_however_wrapped() { + use std::io; + use vortex::error::VortexError as V; + let denied = || io::Error::from(io::ErrorKind::PermissionDenied); + let eof = || io::Error::from(io::ErrorKind::UnexpectedEof); + let cases = [ + (V::from(denied()), ErrorKind::Io), + (V::from(denied()).with_context("open"), ErrorKind::Io), + ( + V::from(std::sync::Arc::new(V::from(denied()).with_context("scan"))), + ErrorKind::Io, + ), + ( + V::from(ArrowError::IoError("read".into(), denied())), + ErrorKind::Io, + ), + (V::from(eof()), ErrorKind::CorruptArtifact), + ( + V::from(eof()).with_context("footer"), + ErrorKind::CorruptArtifact, + ), + ]; + for (error, kind) in cases { + let shown = error.to_string(); + assert_eq!(vortex_error(error).kind, kind, "{shown}"); + } + } +} diff --git a/clients/rust/tests/protocol.rs b/clients/rust/tests/protocol.rs new file mode 100644 index 0000000..1fbded8 --- /dev/null +++ b/clients/rust/tests/protocol.rs @@ -0,0 +1,263 @@ +// SPDX-FileCopyrightText: 2026 Raincloud Maintainers +// SPDX-License-Identifier: Apache-2.0 +//! The reader's side of its protocol with the `raincloud` CLI, against a +//! scripted stand-in: no Python, catalog or fixture needed. +#![cfg(unix)] +use raincloud_reader::{Dataset, ErrorKind}; +use serde_json::{json, Value}; +use std::{ + fs, io, + os::unix::fs::PermissionsExt, + path::{Path, PathBuf}, + sync::{Mutex, MutexGuard}, +}; + +const SECRET: &str = "s3cr3t-token"; + +/// One test at a time: a script being written while another test's thread +/// forks is still open in that child until it execs, and running the script +/// then fails with ETXTBSY ("text file busy"). +fn serial() -> MutexGuard<'static, ()> { + static SERIAL: Mutex<()> = Mutex::new(()); + SERIAL + .lock() + .unwrap_or_else(|poisoned| poisoned.into_inner()) +} + +/// A scripted CLI in a directory of its own, removed when this is dropped. +struct FakeCli { + script: PathBuf, +} + +impl FakeCli { + fn path(&self) -> &Path { + &self.script + } + fn dir(&self) -> &Path { + self.script.parent().unwrap() + } + /// Every argument of every run, one per line. + fn argv(&self) -> String { + fs::read_to_string(self.dir().join("argv")).unwrap() + } +} + +impl Drop for FakeCli { + fn drop(&mut self) { + if let Err(e) = fs::remove_dir_all(self.dir()) { + eprintln!("cannot remove {}: {e}", self.dir().display()); + } + } +} + +/// A CLI that records its argv and settings, then prints `.out` +/// and exits with `.status` (default 0). +fn fake_cli(name: &str, describe: &str, load: &str) -> FakeCli { + let dir = + std::env::temp_dir().join(format!("raincloud-protocol-{}-{name}", std::process::id())); + // A fresh directory, so no earlier run's argv or settings can be read back. + match fs::remove_dir_all(&dir) { + Err(e) if e.kind() != io::ErrorKind::NotFound => panic!("{}: {e}", dir.display()), + _ => {} + } + fs::create_dir_all(&dir).unwrap(); + let script = dir.join("raincloud"); + fs::write( + &script, + r#"#!/bin/sh +dir=$(dirname "$0") +printf '%s\n' "$@" >> "$dir/argv" +printf '%s\n' "$RAINCLOUD_SETTINGS" >> "$dir/settings" +for a in "$@"; do case "$a" in describe|load) cmd=$a; break;; esac; done +cat "$dir/$cmd.out" +exit "$(cat "$dir/$cmd.status" 2>/dev/null || echo 0)" +"#, + ) + .unwrap(); + fs::set_permissions(&script, fs::Permissions::from_mode(0o755)).unwrap(); + fs::write(dir.join("describe.out"), describe).unwrap(); + fs::write(dir.join("load.out"), load).unwrap(); + FakeCli { script } +} + +fn describe_reply() -> Value { + json!({"slug": "tiny", "format": "parquet", "catalog_source": "checkout", + "catalog_revision": "a".repeat(64), "rows": 8}) +} + +fn load_reply(revision: &str) -> String { + json!({"slug": "tiny", "format": "parquet", "path": "/data/tiny.parquet", + "catalog_revision": revision}) + .to_string() +} + +fn options(cli: &FakeCli) -> Value { + json!({"cli": cli.path(), "mirror": format!("https://reader:{SECRET}@mirror.example/v2?sig={SECRET}")}) +} + +#[test] +fn settings_travel_in_the_environment_never_on_the_command_line() { + let _serial = serial(); + let cli = fake_cli( + "settings", + &describe_reply().to_string(), + &load_reply(&"a".repeat(64)), + ); + let ds = Dataset::load(&options(&cli), "-starts-with-dash", "auto").unwrap(); + assert_eq!(ds.path().unwrap(), PathBuf::from("/data/tiny.parquet")); + let dir = cli.dir(); + let argv = cli.argv(); + assert!(!argv.contains(SECRET), "settings leaked onto argv:\n{argv}"); + assert!(argv.lines().any(|a| a == "--settings-env"), "{argv}"); + // One argument each: a format can never be read as an option. + assert!(argv.lines().any(|a| a == "--format=auto"), "{argv}"); + assert!(argv.lines().any(|a| a == "--format=parquet"), "{argv}"); + // `--` keeps a slug that starts with `-` a name, and --readers names this build's decoders. + assert!(argv.contains("--\n-starts-with-dash\n"), "{argv}"); + let readers = if cfg!(feature = "vortex") { + "arrow,parquet,vortex" + } else { + "arrow,parquet" + }; + assert!(argv.contains(&format!("--readers\n{readers}\n")), "{argv}"); + let settings: Vec = fs::read_to_string(dir.join("settings")) + .unwrap() + .lines() + .map(|l| serde_json::from_str(l).unwrap()) + .collect(); + assert!(settings[0]["mirror"].as_str().unwrap().contains(SECRET)); + assert!(settings[0].get("cli").is_none()); + // path() pins the catalog the handle opened with. + assert_eq!(settings[1]["catalog"], "checkout"); + let shown = format!("{ds:?}"); + assert!(!shown.contains(SECRET), "{shown}"); +} + +#[test] +fn a_changed_catalog_is_refused_not_read() { + let _serial = serial(); + let cli = fake_cli( + "revision", + &describe_reply().to_string(), + &load_reply(&"b".repeat(64)), + ); + let ds = Dataset::load(&options(&cli), "tiny", "auto").unwrap(); + let error = ds.path().unwrap_err(); + assert_eq!(error.kind, ErrorKind::Catalog, "{error}"); + assert!(error.message.contains("open it again"), "{error}"); +} + +#[test] +fn a_reply_missing_protocol_fields_is_a_version_mismatch() { + let _serial = serial(); + let mut cases = Vec::new(); + for key in ["format", "catalog_source", "catalog_revision"] { + let mut reply = describe_reply(); + reply.as_object_mut().unwrap().remove(key); + cases.push(reply); + } + for format in ["", "parquet@rs"] { + let mut reply = describe_reply(); + reply["format"] = json!(format); + cases.push(reply); + } + for (i, reply) in cases.iter().enumerate() { + let cli = fake_cli(&format!("fields{i}"), &reply.to_string(), "{}"); + let error = Dataset::load(&options(&cli), "tiny", "auto").unwrap_err(); + assert_eq!(error.kind, ErrorKind::Internal, "{reply}: {error}"); + } + let cli = fake_cli( + "nopath", + &describe_reply().to_string(), + &json!({"catalog_revision": "a".repeat(64)}).to_string(), + ); + let error = Dataset::load(&options(&cli), "tiny", "auto") + .unwrap() + .path() + .unwrap_err(); + assert_eq!(error.kind, ErrorKind::Internal, "{error}"); +} + +#[test] +fn stdout_that_is_not_json_is_reported_with_an_excerpt() { + let _serial = serial(); + let cli = fake_cli("nonjson", "stray print\n{\"format\": NaN}", "{}"); + let error = Dataset::load(&options(&cli), "tiny", "auto").unwrap_err(); + assert_eq!(error.kind, ErrorKind::Internal); + assert!( + error.message.contains("not JSON") && error.message.contains("stray print"), + "{error}" + ); +} + +#[test] +fn errors_map_by_class_mro() { + let _serial = serial(); + let reply = json!({"error": {"type": "UnknownSlug", "mro": ["UnknownSlug", "RaincloudError", "Exception"], + "message": "no dataset tiny"}}); + let cli = fake_cli("mro", &reply.to_string(), "{}"); + fs::write(cli.dir().join("describe.status"), "1").unwrap(); + let error = Dataset::load(&options(&cli), "tiny", "auto").unwrap_err(); + assert_eq!(error.kind, ErrorKind::UnknownSlug); + assert_eq!(error.message, "no dataset tiny"); + + let reply = json!({"error": {"type": "UnknownSlug", "message": "no dataset tiny"}}); + let cli = fake_cli("nomro", &reply.to_string(), "{}"); + fs::write(cli.dir().join("describe.status"), "1").unwrap(); + let error = Dataset::load(&options(&cli), "tiny", "auto").unwrap_err(); + assert_eq!(error.kind, ErrorKind::Internal); + assert!(error.message.contains("older"), "{error}"); + + let cli = fake_cli("usage", "", "{}"); + fs::write(cli.dir().join("describe.status"), "2").unwrap(); + let error = Dataset::load(&options(&cli), "tiny", "auto").unwrap_err(); + assert_eq!(error.kind, ErrorKind::Internal); + assert!(error.message.contains("older"), "{error}"); +} + +#[test] +fn a_name_that_cannot_be_a_slug_is_refused_before_running_anything() { + let _serial = serial(); + let never = json!({"cli": "/nonexistent/raincloud"}); + for slug in ["", "ti\0ny"] { + assert_eq!( + Dataset::load(&never, slug, "auto").unwrap_err().kind, + ErrorKind::InvalidArgument + ); + } +} + +#[test] +fn a_format_that_cannot_be_one_is_refused_before_running_anything() { + let _serial = serial(); + let never = json!({"cli": "/nonexistent/raincloud"}); + for format in ["", "-x", "--readers", "par\0quet"] { + let error = Dataset::load(&never, "tiny", format).unwrap_err(); + assert_eq!( + error.kind, + ErrorKind::InvalidArgument, + "{format:?}: {error}" + ); + } +} + +#[test] +fn batches_refuse_an_undecodable_format_before_resolving_it() { + let _serial = serial(); + let mut reply = describe_reply(); + reply["format"] = json!("orc"); + let cli = fake_cli( + "undecodable", + &reply.to_string(), + &load_reply(&"a".repeat(64)), + ); + let ds = Dataset::load(&options(&cli), "tiny", "orc").unwrap(); + let Err(error) = ds.batches(8) else { + panic!("batches decoded orc") + }; + assert_eq!(error.kind, ErrorKind::FormatUnavailable, "{error}"); + // Nothing was resolved, so nothing was downloaded. + assert!(!cli.argv().lines().any(|a| a == "load"), "{}", cli.argv()); + // The path itself still resolves. + assert_eq!(ds.path().unwrap(), PathBuf::from("/data/tiny.parquet")); +} diff --git a/clients/rust/tests/reader.rs b/clients/rust/tests/reader.rs new file mode 100644 index 0000000..6c32731 --- /dev/null +++ b/clients/rust/tests/reader.rs @@ -0,0 +1,46 @@ +// SPDX-FileCopyrightText: 2026 Raincloud Maintainers +// SPDX-License-Identifier: Apache-2.0 +use raincloud_reader::{Dataset, ErrorKind, RecordBatchReader}; +use serde_json::{json, Value}; + +// Needs the shared fixture and a `raincloud` CLI (RAINCLOUD_CLI or PATH). +#[test] +fn batches_and_typed_misses() { + let fixture = std::env::var("RAINCLOUD_TEST_FIXTURE") + .expect("set RAINCLOUD_TEST_FIXTURE to shared fixture"); + let mut options: Value = + serde_json::from_slice(&std::fs::read(format!("{fixture}/options.json")).unwrap()).unwrap(); + for format in ["arrow", "parquet", "vortex"] { + if format == "vortex" && !cfg!(feature = "vortex") { + continue; + } + let ds = Dataset::load(&options, "tiny", format).unwrap(); + assert_eq!(ds.metadata()["catalog_id"], "reader-fixture"); + assert_eq!(ds.format(), format); + let batches = ds.batches(2).unwrap(); + assert_eq!(batches.schema().fields().len(), 4); + drop(ds); + let mut rows = 0; + for b in batches { + let b = b.unwrap(); + assert!(b.num_rows() <= 2); + rows += b.num_rows(); + } + assert_eq!(rows, 8); + } + options["data_dir"] = json!(format!("{fixture}/missing")); + let ds = Dataset::load(&options, "tiny", "arrow").unwrap(); + assert_eq!(ds.path().unwrap_err().kind, ErrorKind::OfflineMiss); + assert_eq!( + Dataset::load(&options, "tiny", "parquet@java") + .unwrap_err() + .kind, + ErrorKind::FormatUnavailable + ); + assert_eq!( + Dataset::load(&json!({"cli": "/nonexistent/raincloud"}), "tiny", "auto") + .unwrap_err() + .kind, + ErrorKind::Io + ); +} diff --git a/docs/v1/datasets.md b/docs/v1/datasets.md index 6b21800..89bf961 100644 --- a/docs/v1/datasets.md +++ b/docs/v1/datasets.md @@ -1,4 +1,4 @@ - + ## Curated picks @@ -164,7 +164,7 @@ | HumanEval | openai/openai_humaneval (Chen et al., 2021) | Canonical 164-problem Python coding benchmark. Each row carries `task_id`, `prompt` (function signature + docstring), `canonical_solution`, `test`, and `entry_point`. The standard 'pass@k' eval target. | https://huggingface.co/datasets/openai/openai_humaneval | Tabular (Parquet) | MIT | 164 | 1 | 0.1 MB | 0.1 MB | | Individual Household Electric Power Consumption | UCI ML Repository — Individual Household Electric Power Consumption | Measurements of electric power consumption in one household with a one-minute sampling rate over a period of almost 4 years. Different electrical quantities and some sub-metering values are available. This archive contains 2075259 measurements gathered in a house located in Sceaux (7km of Paris, France) between December 2006 and November 2010 (47 months). Notes: 1.(global_active_power*1000/60 - sub_metering_1 - sub_metering_2 - sub_metering_3) represents the active energy consumed every minute (in watt hour) in the household by electrical equipment not measured in sub-meterings 1, 2 and 3. 2.The dataset contains some missing values in the measurements (nearly 1,25% of the rows). | https://archive.ics.uci.edu/dataset/235/individual+household+electric+power+consumption | Tabular (CSV) | CC-BY-4.0 | 2,075,259 | — | 9.0 MB | 22.3 MB | | Iowa Liquor Sales | Iowa Liquor Sales | 12 million alcoholic beverage sales in the Midwest. The Iowa Department of Commerce requires that every store that sells alcohol in bottled form for off-the-premises consumption must hold a class "E" liquor license (an arrangement typical of most of the state alcohol regulatory bodies). All alcoholic sales made by stores registered thusly with the Iowa Department of Commerce are logged in the Commerce department system, which is in turn published as open data by the State of Iowa. This dataset contains information on the name, kind, price, quantity, and location of sale of sales of individual containers or packages of containers of alcoholic beverages. — adapted from the dataset's Kaggle description (residentmario/iowa-liquor-sales). | https://gist.github.com/dannguyen/18ed71d3451d147af414 | Tabular (CSV) | CC0-1.0 | 12,591,077 | — | 281.4 MB | 350.1 MB | -| Iris | UCI ML Repository — Iris | A small classic dataset from Fisher, 1936. One of the earliest known datasets used for evaluating classification methods. This is one of the earliest datasets used in the literature on classification methods and widely used in statistics and machine learning. The data set contains 3 classes of 50 instances each, where each class refers to a type of iris plant. One class is linearly separable from the other 2; the latter are not linearly separable from each other. Predicted attribute: class of iris plant. This is an exceedingly simple domain. This data differs from the data presented in Fishers article (identified by Steve Chadwick, spchadwick@espeedaz.net ). | https://archive.ics.uci.edu/dataset/53/iris | Tabular (CSV) | CC-BY-4.0 | 150 | 1 | 0.0 MB | 0.0 MB | +| Iris | UCI ML Repository — Iris | A small classic dataset from Fisher, 1936. One of the earliest known datasets used for evaluating classification methods. This is one of the earliest datasets used in the literature on classification methods and widely used in statistics and machine learning. The data set contains 3 classes of 50 instances each, where each class refers to a type of iris plant. One class is linearly separable from the other 2; the latter are not linearly separable from each other. Predicted attribute: class of iris plant. This is an exceedingly simple domain. This data differs from the data presented in Fishers article (identified by Steve Chadwick). | https://archive.ics.uci.edu/dataset/53/iris | Tabular (CSV) | CC-BY-4.0 | 150 | 1 | 0.0 MB | 0.0 MB | | JSONBench (Bluesky 100m) | ClickHouse JSONBench — Bluesky firehose 100 M records | 100 M Bluesky firehose events (likes / follows / posts / reposts / ...) stored as a single VARIANT column; benchmark dataset for semi-structured workloads. | https://github.com/ClickHouse/JSONBench | Custom | Apache-2.0 | 100,000,000 | — | 11,411.6 MB | — | | Kepler Exoplanet Search Results | Kepler Exoplanet Search Results | 10000 exoplanet candidates examined by the Kepler Space Observatory. The Kepler Space Observatory is a NASA-build satellite that was launched in 2009. The telescope is dedicated to searching for exoplanets in star systems besides our own, with the ultimate goal of possibly finding other habitable planets besides our own. The original mission ended in 2013 due to mechanical failures, but the telescope has nevertheless been functional since 2014 on a "K2" extended mission. — adapted from the dataset's Kaggle description (nasa/kepler-exoplanet-search-results). | https://exoplanetarchive.ipac.caltech.edu/docs/API_kepcandidate_columns.html | Tabular (CSV) | CC0-1.0 | 9,564 | 1 | 3.2 MB | 3.2 MB | | LibriSpeech (test-clean) | openslr/librispeech_asr — clean test split (sample) | LibriSpeech ASR clean test split: ~2.6K read-aloud utterances from audiobooks with verbatim transcripts. Each row carries `audio` (`struct`), `text`, `speaker_id`, `chapter_id`. Sample of the full ~1000-hour corpus; flip allow patterns to `all/train.clean.100/*.parquet` (or 360/500) for the bigger splits. | https://huggingface.co/datasets/openslr/librispeech_asr | Tabular (Parquet) | CC-BY-4.0 | 2,620 | 1 | 330.0 MB | 350.5 MB | diff --git a/docs/v1/handlers.md b/docs/v1/handlers.md index 89d0a96..d505fbe 100644 --- a/docs/v1/handlers.md +++ b/docs/v1/handlers.md @@ -1,4 +1,4 @@ - + | Handler | Purpose | Streaming | Extra Deps | # Manifest Specs | Example Slugs | |---------|---------|-----------|------------|------------------|---------------| | `beijing_pm25_parse` | Parse UCI Beijing Multi-Site Air Quality (dataset 501). | no | — | 1 | `uci-beijing-multi-site-air-quality` | diff --git a/docs/v1/profiles/bi-generico.json b/docs/v1/profiles/bi-generico.json index 1153977..66d9aa7 100644 --- a/docs/v1/profiles/bi-generico.json +++ b/docs/v1/profiles/bi-generico.json @@ -1070,23 +1070,23 @@ "mean_length": 51.330330254925414, "top_values": [ { - "value": "ftp://spotsftpgua:Ftpgu4t3m4l4@181.48.50.21/TV_GUA", + "value": "ftp://@181.48.50.21/TV_GUA", "count": 51985963 }, { - "value": "ftp://spotsftpgua:Ftpgu4t3m4l4@181.48.50.21/RADIO_GUA/", + "value": "ftp://@181.48.50.21/RADIO_GUA/", "count": 29660189 }, { - "value": "ftp://spotsftpgua:Ftpgu4t3m4l4@181.48.50.21/TV_GUA/", + "value": "ftp://@181.48.50.21/TV_GUA/", "count": 24434219 }, { - "value": "ftp://spotsftpgua:Ftpgu4t3m4l4@181.48.50.21/PE_GUA/", + "value": "ftp://@181.48.50.21/PE_GUA/", "count": 3837049 }, { - "value": "ftp://spotsftpgua:Ftpgu4t3m4l4@181.48.50.21/PRENSA_GUA", + "value": "ftp://@181.48.50.21/PRENSA_GUA", "count": 3207256 } ], diff --git a/docs/v1/profiles/bi-motos.json b/docs/v1/profiles/bi-motos.json index 0ef4a1f..39c8bef 100644 --- a/docs/v1/profiles/bi-motos.json +++ b/docs/v1/profiles/bi-motos.json @@ -1054,23 +1054,23 @@ "mean_length": 51.36482307929779, "top_values": [ { - "value": "ftp://spotsftpgua:Ftpgu4t3m4l4@181.48.50.21/TV_GUA", + "value": "ftp://@181.48.50.21/TV_GUA", "count": 13065546 }, { - "value": "ftp://spotsftpgua:Ftpgu4t3m4l4@181.48.50.21/RADIO_GUA/", + "value": "ftp://@181.48.50.21/RADIO_GUA/", "count": 6846414 }, { - "value": "ftp://spotsftpgua:Ftpgu4t3m4l4@181.48.50.21/TV_GUA/", + "value": "ftp://@181.48.50.21/TV_GUA/", "count": 6431712 }, { - "value": "ftp://spotsftpgua:Ftpgu4t3m4l4@181.48.50.21/PE_GUA/", + "value": "ftp://@181.48.50.21/PE_GUA/", "count": 965060 }, { - "value": "ftp://spotsftpgua:Ftpgu4t3m4l4@181.48.50.21/PRENSA_GUA", + "value": "ftp://@181.48.50.21/PRENSA_GUA", "count": 864404 } ], diff --git a/docs/v1/snapshot.json b/docs/v1/snapshot.json index d8ff359..f467409 100644 --- a/docs/v1/snapshot.json +++ b/docs/v1/snapshot.json @@ -1,7 +1,7 @@ { "schema_version": 1, "generated_at": "2026-06-10T15:47:46Z", - "note": "Auto-generated by scripts/pipeline/docs.py. Read by the TUI as a fallback when a local parquet isn't built. Regenerate after any build / schema change with `python -m scripts.pipeline.docs snapshot`.", + "note": "Auto-generated by raincloud/pipeline/docs.py. Read by the TUI as a fallback when a local parquet isn't built. Regenerate after any build / schema change with `python -m raincloud.pipeline.docs snapshot`.", "slugs": { "clickbench-hits": { "expected_rows": 99997497, @@ -6562,7 +6562,7 @@ "type": "string", "length": 166247654, "null_count": 384320, - "min": "ftp://spotsftpgua:Ftpgu4t3m4l4@181.48.50.21/PE_GUA//DISCO/108555d.JPG", + "min": "ftp://@181.48.50.21/PE_GUA//DISCO/108555d.JPG", "max": "http://204.51.113.172/videosgt//DISCO35/157962.MP3" }, { @@ -6826,7 +6826,7 @@ "type": "string", "length": 2102467, "null_count": 384320, - "min": "ftp://spotsftpgua:Ftpgu4t3m4l4@181.48.50.21/PE_GUA/", + "min": "ftp://@181.48.50.21/PE_GUA/", "max": "http://204.51.113.172/videosgt/" } ] @@ -10938,8 +10938,8 @@ "type": "string", "length": 41274114, "null_count": 153728, - "min": "ftp://spotsftpgua:Ftpgu4t3m4l4@181.48.50.21/PE_GUA//DISCO/108555d.JPG", - "max": "ftp://spotsftpgua:Ftpgu4t3m4l4@181.48.50.21/TV_GUA/DISCO99/51116.wmv" + "min": "ftp://@181.48.50.21/PE_GUA//DISCO/108555d.JPG", + "max": "ftp://@181.48.50.21/TV_GUA/DISCO99/51116.wmv" }, { "name": "Corte", @@ -11202,8 +11202,8 @@ "type": "string", "length": 524901, "null_count": 153728, - "min": "ftp://spotsftpgua:Ftpgu4t3m4l4@181.48.50.21/PE_GUA/", - "max": "ftp://spotsftpgua:Ftpgu4t3m4l4@181.48.50.21/TV_GUA/" + "min": "ftp://@181.48.50.21/PE_GUA/", + "max": "ftp://@181.48.50.21/TV_GUA/" }, { "name": "Anunciante (grupo)", @@ -115585,8 +115585,8 @@ "type": "string", "length": 9499, "null_count": 0, - "min": "/home/albert/.cache/huggingface/datasets/downloads/extracted/4a12a5d9e3d43248af424bf5fb40094f2aac834e9c19b34fb91aa912db1bd0b0/1089-134686-0000.flac", - "max": "/home/albert/.cache/huggingface/datasets/downloads/extracted/4a12a5d9e3d43248af424bf5fb40094f2aac834e9c19b34fb91aa912db1bd0b0/908-31957-0025.flac" + "min": "", + "max": "" }, { "name": "audio", diff --git a/docs/v2/compliance.json b/docs/v2/compliance.json new file mode 100644 index 0000000..5cfb4c8 --- /dev/null +++ b/docs/v2/compliance.json @@ -0,0 +1,50503 @@ +{ + "generated_at": "2026-09-26T05:40:09Z", + "versions": { + "python": "3.11.11", + "pyarrow": "24.0.0", + "vortex": "0.86.1" + }, + "scope": { + "all": false, + "selected_slugs": [ + "120-years-of-olympic-history-athletes-and-results", + "ai2-arc", + "airbnb-prices-in-european-cities", + "airbnbopendata", + "amazon-reviews-2023-subscription-boxes", + "anthropic-hh-rlhf-helpful-base", + "anthropic-interviewer", + "basketball", + "building-permit-applications-data", + "california-housing-prices", + "codeparrot-clean-valid", + "coronahack-chest-xraydataset", + "countries-of-the-world", + "covid-world-vaccination-progress", + "covid19-data-from-john-hopkins-university", + "databricks-dolly-15k", + "disease-symptom-description-dataset", + "docmatix-zero-shot", + "finepdfs-en-test", + "fitbit", + "formula-1-world-championship-1950-2020", + "frames-benchmark", + "glass", + "global-fossil-co2-emissions-by-country-2002-2022", + "google-cluster-trace-2011-machine-events", + "gsm8k", + "gtsrb-german-traffic-sign", + "hellaswag", + "helpsteer2", + "hotel-booking-demand", + "hotpotqa-fullwiki", + "housing-prices-dataset", + "humaneval", + "insurance", + "international-football-results-from-1872-to-2017", + "kepler-exoplanet-search-results", + "kepler-labelled-time-series-data", + "librispeech-test-clean", + "loan-default-dataset", + "lung-cancer", + "marketing-data", + "mbpp", + "medmcqa", + "mlcourse", + "mmlu", + "mmlu-pro", + "mmmlu", + "mnist", + "movies", + "new-york-city-airbnb-open-data", + "news-headlines-dataset-for-sarcasm-detection", + "nips-papers", + "no-robots", + "nyc-property-sales", + "oasst1", + "osmi-mental-health-in-tech-2016", + "osmi-mental-health-in-tech-2017", + "osmi-mental-health-in-tech-2018", + "osmi-mental-health-in-tech-2019", + "osmi-mental-health-in-tech-2020", + "osmi-mental-health-in-tech-2021", + "osmi-mental-health-in-tech-2022", + "osmi-mental-health-in-tech-2023", + "palmer-archipelago-antarctica-penguin-data", + "peoples-speech-clean-validation", + "pubmedqa-labeled", + "squad-v2", + "stack-overflow-2018-developer-survey", + "synthetic-text-to-sql", + "temperature-change", + "titanic-dataset", + "truthfulqa-mc", + "uci-abalone", + "uci-adult", + "uci-ai4i-2020-predictive-maintenance", + "uci-air-quality", + "uci-auto-mpg", + "uci-automobile", + "uci-bank-marketing", + "uci-bike-sharing-dataset", + "uci-breast-cancer", + "uci-breast-cancer-wisconsin-diagnostic", + "uci-breast-cancer-wisconsin-original", + "uci-car-evaluation", + "uci-cdc-diabetes-health-indicators", + "uci-census-income", + "uci-chronic-kidney-disease", + "uci-concrete-compressive-strength", + "uci-credit-approval", + "uci-default-of-credit-card-clients", + "uci-diabetes", + "uci-diabetes-130-us-hospitals", + "uci-dry-bean-dataset", + "uci-electricityloaddiagrams20112014", + "uci-energy-efficiency", + "uci-estimation-of-obesity-levels", + "uci-forest-fires", + "uci-heart-disease", + "uci-heart-failure-clinical-records", + "uci-human-activity-recognition-using-smartphones", + "uci-iris", + "uci-magic-gamma-telescope", + "uci-mushroom", + "uci-online-shoppers-purchasing-intention", + "uci-optical-recognition-of-handwritten-digits", + "uci-parkinsons", + "uci-phishing-websites", + "uci-predict-students-dropout-and-academic-success", + "uci-real-estate-valuation-data-set", + "uci-seeds", + "uci-seoul-bike-sharing-demand", + "uci-sms-spam-collection", + "uci-spambase", + "uci-statlog-german-credit-data", + "uci-student-performance", + "uci-thyroid-disease", + "uci-wholesale-customers", + "uci-wine", + "uci-wine-quality", + "ufcdata", + "ultrafeedback-binarized", + "us-airbnb-open-data", + "walmart-dataset", + "wdi", + "world-energy-consumption", + "zoo-animal-classification" + ], + "requested_cells": null, + "requested_readers": null, + "deliberately_skipped_slugs": [], + "missing_canonical_slugs": [] + }, + "slugs": { + "120-years-of-olympic-history-athletes-and-results": { + "canonical": "/v2/120-years-of-olympic-history-athletes-and-results/arrow/120-years-of-olympic-history-athletes-and-results.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "ai2-arc": { + "canonical": "/v2/ai2-arc/arrow/ai2-arc.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "airbnb-prices-in-european-cities": { + "canonical": "/v2/airbnb-prices-in-european-cities/arrow/airbnb-prices-in-european-cities.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "airbnbopendata": { + "canonical": "/v2/airbnbopendata/arrow/airbnbopendata.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "amazon-reviews-2023-subscription-boxes": { + "canonical": "/v2/amazon-reviews-2023-subscription-boxes/arrow/amazon-reviews-2023-subscription-boxes.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "anthropic-hh-rlhf-helpful-base": { + "canonical": "/v2/anthropic-hh-rlhf-helpful-base/arrow/anthropic-hh-rlhf-helpful-base.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "fail", + "note": "parquet@hardwood: read error", + "detail": "UncheckedIOException: [anthropic-hh-rlhf-helpful-base.parquet] Failed to scan pages for column 'chosen' (caused by IOException: Malformed Parquet metadata: binary value declares 1077 bytes but only 997 remain)" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 24, + "fail": 1, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "anthropic-interviewer": { + "canonical": "/v2/anthropic-interviewer/arrow/anthropic-interviewer.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "basketball": { + "canonical": "/v2/basketball/arrow/basketball.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "building-permit-applications-data": { + "canonical": "/v2/building-permit-applications-data/arrow/building-permit-applications-data.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "california-housing-prices": { + "canonical": "/v2/california-housing-prices/arrow/california-housing-prices.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "codeparrot-clean-valid": { + "canonical": "/v2/codeparrot-clean-valid/arrow/codeparrot-clean-valid.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "fail", + "note": "parquet@hardwood: read error", + "detail": "UncheckedIOException: [codeparrot-clean-valid.parquet] Failed to scan pages for column 'content' (caused by IOException: Malformed Parquet metadata: binary value declares 3646 bytes but only 1000 remain)" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 24, + "fail": 1, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "coronahack-chest-xraydataset": { + "canonical": "/v2/coronahack-chest-xraydataset/arrow/coronahack-chest-xraydataset.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "countries-of-the-world": { + "canonical": "/v2/countries-of-the-world/arrow/countries-of-the-world.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": false, + "note": "VARIANT column downgraded to its shredded struct \u2014 pyarrow cannot emit a Parquet VARIANT logical type" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": false, + "note": "VARIANT annotation not preserved on the Vortex round-trip \u2014 column survives as its shredded struct" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips; VARIANT kept (data)" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips; VARIANT kept (data)" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips; VARIANT kept (data)" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": false, + "note": "vortex@rs: round-trips; VARIANT annotation not preserved (column kept as its shredded struct)" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": false, + "note": "vortex@jni: round-trips; VARIANT not kept: VARIANT annotation not preserved (column kept as its shredded struct)" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical (VARIANT column present \u2014 annotation not preserved on read; data compared as its shredded struct)", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical (VARIANT column present \u2014 compared as its shredded struct)", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical (VARIANT column present \u2014 compared as its shredded struct)", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical (VARIANT column present \u2014 annotation not preserved on read; data compared as its shredded struct)", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical (VARIANT column present \u2014 compared as its shredded struct)", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical (VARIANT column present \u2014 annotation not preserved on read; data compared as its shredded struct)", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical (VARIANT column present \u2014 compared as its shredded struct)", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical (VARIANT column present \u2014 compared as its shredded struct)", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical (VARIANT column present \u2014 annotation not preserved on read; data compared as its shredded struct)", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical (VARIANT column present \u2014 compared as its shredded struct)", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical (VARIANT column present \u2014 compared as its shredded struct)", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical (VARIANT column present \u2014 annotation not preserved on read; data compared as its shredded struct)", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical (VARIANT column present \u2014 compared as its shredded struct)", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical (VARIANT column present \u2014 compared as its shredded struct)", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical (VARIANT column present \u2014 annotation not preserved on read; data compared as its shredded struct)", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical (VARIANT column present \u2014 compared as its shredded struct)", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical (VARIANT column present \u2014 annotation not preserved on read; data compared as its shredded struct)", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical (VARIANT column present \u2014 compared as its shredded struct)", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "covid-world-vaccination-progress": { + "canonical": "/v2/covid-world-vaccination-progress/arrow/covid-world-vaccination-progress.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "covid19-data-from-john-hopkins-university": { + "canonical": "/v2/covid19-data-from-john-hopkins-university/arrow/covid19-data-from-john-hopkins-university.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "databricks-dolly-15k": { + "canonical": "/v2/databricks-dolly-15k/arrow/databricks-dolly-15k.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "fail", + "note": "parquet@hardwood: read error", + "detail": "UncheckedIOException: [databricks-dolly-15k.parquet] Failed to scan pages for column 'context' (caused by IOException: Malformed Parquet metadata: binary value declares 1153 bytes but only 998 remain)" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 24, + "fail": 1, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "disease-symptom-description-dataset": { + "canonical": "/v2/disease-symptom-description-dataset/arrow/disease-symptom-description-dataset.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "docmatix-zero-shot": { + "canonical": "/v2/docmatix-zero-shot/arrow/docmatix-zero-shot.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "finepdfs-en-test": { + "canonical": "/v2/finepdfs-en-test/arrow/finepdfs-en-test.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "fail", + "note": "parquet@hardwood: read error", + "detail": "UncheckedIOException: [finepdfs-en-test.parquet] Failed to scan pages for column 'text' (caused by IOException: Malformed Parquet metadata: binary value declares 1663 bytes but only 1000 remain)" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 24, + "fail": 1, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "fitbit": { + "canonical": "/v2/fitbit/arrow/fitbit.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "formula-1-world-championship-1950-2020": { + "canonical": "/v2/formula-1-world-championship-1950-2020/arrow/formula-1-world-championship-1950-2020.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "frames-benchmark": { + "canonical": "/v2/frames-benchmark/arrow/frames-benchmark.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "glass": { + "canonical": "/v2/glass/arrow/glass.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "global-fossil-co2-emissions-by-country-2002-2022": { + "canonical": "/v2/global-fossil-co2-emissions-by-country-2002-2022/arrow/global-fossil-co2-emissions-by-country-2002-2022.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "google-cluster-trace-2011-machine-events": { + "canonical": "/v2/google-cluster-trace-2011-machine-events/arrow/google-cluster-trace-2011-machine-events.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "gsm8k": { + "canonical": "/v2/gsm8k/arrow/gsm8k.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "gtsrb-german-traffic-sign": { + "canonical": "/v2/gtsrb-german-traffic-sign/arrow/gtsrb-german-traffic-sign.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "hellaswag": { + "canonical": "/v2/hellaswag/arrow/hellaswag.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "helpsteer2": { + "canonical": "/v2/helpsteer2/arrow/helpsteer2.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "fail", + "note": "parquet@hardwood: read error", + "detail": "UncheckedIOException: [helpsteer2.parquet] Failed to scan pages for column 'prompt' (caused by IOException: Malformed Parquet metadata: binary value declares 1969 bytes but only 997 remain)" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 24, + "fail": 1, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "hotel-booking-demand": { + "canonical": "/v2/hotel-booking-demand/arrow/hotel-booking-demand.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "hotpotqa-fullwiki": { + "canonical": "/v2/hotpotqa-fullwiki/arrow/hotpotqa-fullwiki.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "housing-prices-dataset": { + "canonical": "/v2/housing-prices-dataset/arrow/housing-prices-dataset.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "humaneval": { + "canonical": "/v2/humaneval/arrow/humaneval.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "fail", + "note": "parquet@hardwood: read error", + "detail": "UncheckedIOException: [humaneval.parquet] Failed to scan pages for column 'prompt' (caused by IOException: Malformed Parquet metadata: binary value declares 609 bytes but only 238 remain)" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 24, + "fail": 1, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "insurance": { + "canonical": "/v2/insurance/arrow/insurance.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "international-football-results-from-1872-to-2017": { + "canonical": "/v2/international-football-results-from-1872-to-2017/arrow/international-football-results-from-1872-to-2017.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "kepler-exoplanet-search-results": { + "canonical": "/v2/kepler-exoplanet-search-results/arrow/kepler-exoplanet-search-results.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "kepler-labelled-time-series-data": { + "canonical": "/v2/kepler-labelled-time-series-data/arrow/kepler-labelled-time-series-data.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "librispeech-test-clean": { + "canonical": "/v2/librispeech-test-clean/arrow/librispeech-test-clean.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "loan-default-dataset": { + "canonical": "/v2/loan-default-dataset/arrow/loan-default-dataset.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "lung-cancer": { + "canonical": "/v2/lung-cancer/arrow/lung-cancer.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "marketing-data": { + "canonical": "/v2/marketing-data/arrow/marketing-data.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "mbpp": { + "canonical": "/v2/mbpp/arrow/mbpp.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "medmcqa": { + "canonical": "/v2/medmcqa/arrow/medmcqa.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "fail", + "note": "parquet@hardwood: read error", + "detail": "UncheckedIOException: [medmcqa.parquet] Failed to scan pages for column 'exp' (caused by IOException: Malformed Parquet metadata: binary value declares 1103 bytes but only 606 remain)" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 24, + "fail": 1, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "mlcourse": { + "canonical": "/v2/mlcourse/arrow/mlcourse.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "mmlu": { + "canonical": "/v2/mmlu/arrow/mmlu.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "fail", + "note": "parquet@hardwood: read error", + "detail": "UncheckedIOException: [mmlu.parquet] Failed to scan pages for column 'question' (caused by IOException: Malformed Parquet metadata: binary value declares 1162 bytes but only 527 remain)" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 24, + "fail": 1, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "mmlu-pro": { + "canonical": "/v2/mmlu-pro/arrow/mmlu-pro.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "mmmlu": { + "canonical": "/v2/mmmlu/arrow/mmmlu.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "fail", + "note": "parquet@hardwood: read error", + "detail": "UncheckedIOException: [mmmlu.parquet] Failed to scan pages for column 'Question' (caused by IOException: Malformed Parquet metadata: binary value declares 2938 bytes but only 212 remain)" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 24, + "fail": 1, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "mnist": { + "canonical": "/v2/mnist/arrow/mnist.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "movies": { + "canonical": "/v2/movies/arrow/movies.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "new-york-city-airbnb-open-data": { + "canonical": "/v2/new-york-city-airbnb-open-data/arrow/new-york-city-airbnb-open-data.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "news-headlines-dataset-for-sarcasm-detection": { + "canonical": "/v2/news-headlines-dataset-for-sarcasm-detection/arrow/news-headlines-dataset-for-sarcasm-detection.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "nips-papers": { + "canonical": "/v2/nips-papers/arrow/nips-papers.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "fail", + "note": "parquet@hardwood: read error", + "detail": "UncheckedIOException: [nips-papers.parquet] Failed to scan pages for column 'abstract' (caused by IOException: Malformed Parquet metadata: binary value declares 1325 bytes but only 999 remain)" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 24, + "fail": 1, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "no-robots": { + "canonical": "/v2/no-robots/arrow/no-robots.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "fail", + "note": "parquet@hardwood: read error", + "detail": "UncheckedIOException: [no-robots.parquet] Failed to fetch metadata for row group 0 (caused by IOException: Malformed Parquet metadata: binary value declares 826 bytes but only 193 remain)" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 24, + "fail": 1, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "nyc-property-sales": { + "canonical": "/v2/nyc-property-sales/arrow/nyc-property-sales.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "oasst1": { + "canonical": "/v2/oasst1/arrow/oasst1.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "fail", + "note": "parquet@hardwood: read error", + "detail": "UncheckedIOException: [oasst1.parquet] Failed to scan pages for column 'text' (caused by IOException: Malformed Parquet metadata: binary value declares 530 bytes but only 160 remain)" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 24, + "fail": 1, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "osmi-mental-health-in-tech-2016": { + "canonical": "/v2/osmi-mental-health-in-tech-2016/arrow/osmi-mental-health-in-tech-2016.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "osmi-mental-health-in-tech-2017": { + "canonical": "/v2/osmi-mental-health-in-tech-2017/arrow/osmi-mental-health-in-tech-2017.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "osmi-mental-health-in-tech-2018": { + "canonical": "/v2/osmi-mental-health-in-tech-2018/arrow/osmi-mental-health-in-tech-2018.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "osmi-mental-health-in-tech-2019": { + "canonical": "/v2/osmi-mental-health-in-tech-2019/arrow/osmi-mental-health-in-tech-2019.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "osmi-mental-health-in-tech-2020": { + "canonical": "/v2/osmi-mental-health-in-tech-2020/arrow/osmi-mental-health-in-tech-2020.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "osmi-mental-health-in-tech-2021": { + "canonical": "/v2/osmi-mental-health-in-tech-2021/arrow/osmi-mental-health-in-tech-2021.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "osmi-mental-health-in-tech-2022": { + "canonical": "/v2/osmi-mental-health-in-tech-2022/arrow/osmi-mental-health-in-tech-2022.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "osmi-mental-health-in-tech-2023": { + "canonical": "/v2/osmi-mental-health-in-tech-2023/arrow/osmi-mental-health-in-tech-2023.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "palmer-archipelago-antarctica-penguin-data": { + "canonical": "/v2/palmer-archipelago-antarctica-penguin-data/arrow/palmer-archipelago-antarctica-penguin-data.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "peoples-speech-clean-validation": { + "canonical": "/v2/peoples-speech-clean-validation/arrow/peoples-speech-clean-validation.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": false, + "variant_faithful": true, + "note": "sidecar parquet@hardwood: parquet@hardwood: self-verify fail: read error: requested an array past the JVM's array size limit \u2014 RuntimeException: Error in pipeline for column 'bytes' (caused by OutOfMemoryError: Requested array size exceeds VM limit)" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "fail", + "note": "parquet@hardwood: read error: requested an array past the JVM's array size limit", + "detail": "RuntimeException: Error in pipeline for column 'bytes' (caused by OutOfMemoryError: Requested array size exceeds VM limit)" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "fail", + "note": "parquet@hardwood: read error: requested an array past the JVM's array size limit", + "detail": "RuntimeException: Error in pipeline for column 'bytes' (caused by OutOfMemoryError: Requested array size exceeds VM limit)" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "fail", + "note": "parquet@hardwood: read error: requested an array past the JVM's array size limit", + "detail": "RuntimeException: Error in pipeline for column 'bytes' (caused by OutOfMemoryError: Requested array size exceeds VM limit)" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 18, + "fail": 3, + "skip": 0, + "na": 21, + "spec_ambiguous": 0 + } + }, + "pubmedqa-labeled": { + "canonical": "/v2/pubmedqa-labeled/arrow/pubmedqa-labeled.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "squad-v2": { + "canonical": "/v2/squad-v2/arrow/squad-v2.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "fail", + "note": "parquet@hardwood: read error", + "detail": "UncheckedIOException: [squad-v2.parquet] Failed to scan pages for column 'context' (caused by IOException: Malformed Parquet metadata: binary value declares 811 bytes but only 533 remain)" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 24, + "fail": 1, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "stack-overflow-2018-developer-survey": { + "canonical": "/v2/stack-overflow-2018-developer-survey/arrow/stack-overflow-2018-developer-survey.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "synthetic-text-to-sql": { + "canonical": "/v2/synthetic-text-to-sql/arrow/synthetic-text-to-sql.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "temperature-change": { + "canonical": "/v2/temperature-change/arrow/temperature-change.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "titanic-dataset": { + "canonical": "/v2/titanic-dataset/arrow/titanic-dataset.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "truthfulqa-mc": { + "canonical": "/v2/truthfulqa-mc/arrow/truthfulqa-mc.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-abalone": { + "canonical": "/v2/uci-abalone/arrow/uci-abalone.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-adult": { + "canonical": "/v2/uci-adult/arrow/uci-adult.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-ai4i-2020-predictive-maintenance": { + "canonical": "/v2/uci-ai4i-2020-predictive-maintenance/arrow/uci-ai4i-2020-predictive-maintenance.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-air-quality": { + "canonical": "/v2/uci-air-quality/arrow/uci-air-quality.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-auto-mpg": { + "canonical": "/v2/uci-auto-mpg/arrow/uci-auto-mpg.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-automobile": { + "canonical": "/v2/uci-automobile/arrow/uci-automobile.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-bank-marketing": { + "canonical": "/v2/uci-bank-marketing/arrow/uci-bank-marketing.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-bike-sharing-dataset": { + "canonical": "/v2/uci-bike-sharing-dataset/arrow/uci-bike-sharing-dataset.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-breast-cancer": { + "canonical": "/v2/uci-breast-cancer/arrow/uci-breast-cancer.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-breast-cancer-wisconsin-diagnostic": { + "canonical": "/v2/uci-breast-cancer-wisconsin-diagnostic/arrow/uci-breast-cancer-wisconsin-diagnostic.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-breast-cancer-wisconsin-original": { + "canonical": "/v2/uci-breast-cancer-wisconsin-original/arrow/uci-breast-cancer-wisconsin-original.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-car-evaluation": { + "canonical": "/v2/uci-car-evaluation/arrow/uci-car-evaluation.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-cdc-diabetes-health-indicators": { + "canonical": "/v2/uci-cdc-diabetes-health-indicators/arrow/uci-cdc-diabetes-health-indicators.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-census-income": { + "canonical": "/v2/uci-census-income/arrow/uci-census-income.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-chronic-kidney-disease": { + "canonical": "/v2/uci-chronic-kidney-disease/arrow/uci-chronic-kidney-disease.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-concrete-compressive-strength": { + "canonical": "/v2/uci-concrete-compressive-strength/arrow/uci-concrete-compressive-strength.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-credit-approval": { + "canonical": "/v2/uci-credit-approval/arrow/uci-credit-approval.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-default-of-credit-card-clients": { + "canonical": "/v2/uci-default-of-credit-card-clients/arrow/uci-default-of-credit-card-clients.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-diabetes": { + "canonical": "/v2/uci-diabetes/arrow/uci-diabetes.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-diabetes-130-us-hospitals": { + "canonical": "/v2/uci-diabetes-130-us-hospitals/arrow/uci-diabetes-130-us-hospitals.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-dry-bean-dataset": { + "canonical": "/v2/uci-dry-bean-dataset/arrow/uci-dry-bean-dataset.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-electricityloaddiagrams20112014": { + "canonical": "/v2/uci-electricityloaddiagrams20112014/arrow/uci-electricityloaddiagrams20112014.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-energy-efficiency": { + "canonical": "/v2/uci-energy-efficiency/arrow/uci-energy-efficiency.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-estimation-of-obesity-levels": { + "canonical": "/v2/uci-estimation-of-obesity-levels/arrow/uci-estimation-of-obesity-levels.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-forest-fires": { + "canonical": "/v2/uci-forest-fires/arrow/uci-forest-fires.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-heart-disease": { + "canonical": "/v2/uci-heart-disease/arrow/uci-heart-disease.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-heart-failure-clinical-records": { + "canonical": "/v2/uci-heart-failure-clinical-records/arrow/uci-heart-failure-clinical-records.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-human-activity-recognition-using-smartphones": { + "canonical": "/v2/uci-human-activity-recognition-using-smartphones/arrow/uci-human-activity-recognition-using-smartphones.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-iris": { + "canonical": "/v2/uci-iris/arrow/uci-iris.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-magic-gamma-telescope": { + "canonical": "/v2/uci-magic-gamma-telescope/arrow/uci-magic-gamma-telescope.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-mushroom": { + "canonical": "/v2/uci-mushroom/arrow/uci-mushroom.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-online-shoppers-purchasing-intention": { + "canonical": "/v2/uci-online-shoppers-purchasing-intention/arrow/uci-online-shoppers-purchasing-intention.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-optical-recognition-of-handwritten-digits": { + "canonical": "/v2/uci-optical-recognition-of-handwritten-digits/arrow/uci-optical-recognition-of-handwritten-digits.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-parkinsons": { + "canonical": "/v2/uci-parkinsons/arrow/uci-parkinsons.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-phishing-websites": { + "canonical": "/v2/uci-phishing-websites/arrow/uci-phishing-websites.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-predict-students-dropout-and-academic-success": { + "canonical": "/v2/uci-predict-students-dropout-and-academic-success/arrow/uci-predict-students-dropout-and-academic-success.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-real-estate-valuation-data-set": { + "canonical": "/v2/uci-real-estate-valuation-data-set/arrow/uci-real-estate-valuation-data-set.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-seeds": { + "canonical": "/v2/uci-seeds/arrow/uci-seeds.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-seoul-bike-sharing-demand": { + "canonical": "/v2/uci-seoul-bike-sharing-demand/arrow/uci-seoul-bike-sharing-demand.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-sms-spam-collection": { + "canonical": "/v2/uci-sms-spam-collection/arrow/uci-sms-spam-collection.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-spambase": { + "canonical": "/v2/uci-spambase/arrow/uci-spambase.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-statlog-german-credit-data": { + "canonical": "/v2/uci-statlog-german-credit-data/arrow/uci-statlog-german-credit-data.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-student-performance": { + "canonical": "/v2/uci-student-performance/arrow/uci-student-performance.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-thyroid-disease": { + "canonical": "/v2/uci-thyroid-disease/arrow/uci-thyroid-disease.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-wholesale-customers": { + "canonical": "/v2/uci-wholesale-customers/arrow/uci-wholesale-customers.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-wine": { + "canonical": "/v2/uci-wine/arrow/uci-wine.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "uci-wine-quality": { + "canonical": "/v2/uci-wine-quality/arrow/uci-wine-quality.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "ufcdata": { + "canonical": "/v2/ufcdata/arrow/ufcdata.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "ultrafeedback-binarized": { + "canonical": "/v2/ultrafeedback-binarized/arrow/ultrafeedback-binarized.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "fail", + "note": "parquet@hardwood: read error", + "detail": "UncheckedIOException: [ultrafeedback-binarized.parquet] Failed to fetch metadata for row group 0 (caused by IOException: Malformed Parquet metadata: binary value declares 1609 bytes but only 911 remain)" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 24, + "fail": 1, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "us-airbnb-open-data": { + "canonical": "/v2/us-airbnb-open-data/arrow/us-airbnb-open-data.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "walmart-dataset": { + "canonical": "/v2/walmart-dataset/arrow/walmart-dataset.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "wdi": { + "canonical": "/v2/wdi/arrow/wdi.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "world-energy-consumption": { + "canonical": "/v2/world-energy-consumption/arrow/world-energy-consumption.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + }, + "zoo-animal-classification": { + "canonical": "/v2/zoo-animal-classification/arrow/zoo-animal-classification.arrow.zstd", + "write": [ + { + "cell": "parquet@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "vortex@py", + "roundtrip": true, + "variant_faithful": true, + "note": "" + }, + { + "cell": "parquet@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@rs: round-trips to canonical" + }, + { + "cell": "parquet@java", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@java: round-trips to canonical" + }, + { + "cell": "parquet@hardwood", + "roundtrip": true, + "variant_faithful": true, + "note": "parquet@hardwood: round-trips to canonical" + }, + { + "cell": "vortex@rs", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@rs: round-trips to canonical" + }, + { + "cell": "vortex@jni", + "roundtrip": true, + "variant_faithful": true, + "note": "vortex@jni: round-trips to canonical" + } + ], + "read": [ + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@py", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@py", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@rs", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@java", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@py", + "status": "pass", + "note": "parquet@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@py", + "status": "na", + "note": "vortex@py does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@rs", + "status": "pass", + "note": "parquet@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@rs", + "status": "na", + "note": "vortex@rs does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@java", + "status": "pass", + "note": "parquet@java: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "parquet@hardwood", + "status": "pass", + "note": "parquet@hardwood: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "parquet@hardwood", + "reader_id": "vortex@jni", + "status": "na", + "note": "vortex@jni does not read 'parquet'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@rs", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@py", + "status": "na", + "note": "parquet@py does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@py", + "status": "pass", + "note": "vortex@py: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@rs", + "status": "na", + "note": "parquet@rs does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@rs", + "status": "pass", + "note": "vortex@rs: round-trips to canonical", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@java", + "status": "na", + "note": "parquet@java does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "parquet@hardwood", + "status": "na", + "note": "parquet@hardwood does not read 'vortex'", + "detail": "" + }, + { + "artifact_cell": "vortex@jni", + "reader_id": "vortex@jni", + "status": "pass", + "note": "vortex@jni: round-trips to canonical", + "detail": "" + } + ], + "skipped_cells": [], + "rollup": { + "pass": 25, + "fail": 0, + "skip": 0, + "na": 24, + "spec_ambiguous": 0 + } + } + }, + "rollup": { + "pass": 3129, + "fail": 17, + "skip": 0, + "na": 3021, + "spec_ambiguous": 0 + } +} diff --git a/docs/v2/datasets.md b/docs/v2/datasets.md new file mode 100644 index 0000000..582e137 --- /dev/null +++ b/docs/v2/datasets.md @@ -0,0 +1,491 @@ + + +## Curated picks + +### Encoding +- **`glove-6b-100d`** — 400,000 English word embeddings at 100 dimensions, trained on 6B tokens from Wikipedia 2014 + Gigaword 5 (Pennington et al., EMNLP 2014). Th +- **`uci-seeds`** — Measurements of geometrical properties of kernels belonging to three different varieties of wheat. A soft X-ray technique and GRAINS package +- **`kepler-exoplanet-search-results`** — 10000 exoplanet candidates examined by the Kepler Space Observatory. The Kepler Space Observatory is a NASA-build satellite that was launche +- **`ultrachat-200k`** — 200k filtered + formatted multi-turn conversations from the UltraChat corpus, used by HuggingFaceH4 to instruction-tune Zephyr-7b-β. Each ro +- **`ampds-whe`** — Whole-house electricity consumption time-series from AMPds v2 (the Almanac of Minutely Power dataset, version 2). 1-minute resolution measur + +### Stress +- **`osm-germany-ways`** — OSM ways (linear features) for Germany from the Geofabrik extract — roads, paths, rivers, building outlines, railway lines. Each row carries +- **`hacker-news`** — 28.7M Hacker News posts and comments spanning the site's full history (2007 onward). Single flat parquet from Google's bigquery-public-data +- **`wikipedia-en`** — Cleaned-text English Wikipedia dump from 2023-11-01 (~6.4M articles). Each row carries `id`, `url`, `title`, `text` from Wikimedia's parquet +- **`hotpotqa-fullwiki`** — 113K multi-hop QA over Wikipedia. Fullwiki config: each question must be answered by reasoning across multiple Wikipedia paragraphs. Each ro + +--- + +| Dataset Short Name | Dataset Full Name | Dataset Description | Dataset Source (URL) | Data Kind | License | Row Count | Row Groups - Parquet | File Size - Parquet | File Size - Vortex | +|--------------------|-------------------|---------------------|----------------------|-----------|---------|-----------|----------------------|---------------------|--------------------| +| 120 years of Olympic history: athletes and results | 120 years of Olympic history: athletes and results | basic bio data on athletes and medal results from Athens 1896 to Rio 2016. This is a historical dataset on the modern Olympic Games, including all the Games from Athens 1896 to Rio 2016. I scraped this data from www.sports-reference.com in May 2018. The R code I used to scrape and wrangle the data is on GitHub. — adapted from the dataset's Kaggle description (heesoo37/120-years-of-olympic-history-athletes-and-results). | https://github.com/rgriff23/Olympic_history | Tabular (CSV) | CC0-1.0 | 271,116 | 1 | 4.4 MB | 5.5 MB | +| [⚠ Amazon Reviews 2023 (Subscription Boxes)](#scrape-advisory-amazon-reviews-2023-subscription-boxes) | Amazon Reviews 2023 — Subscription_Boxes user reviews (McAuley Lab, UCSD; Hou et al. 2024) | User reviews for the Subscription_Boxes category from the Amazon Reviews 2023 corpus — rating, title, text, asin, parent_asin, user_id, millisecond timestamp, helpful_vote, verified_purchase, and a nested images list. Smallest of 33 categories; the catalog's smoke-test slice of the 571M-review corpus. | https://huggingface.co/datasets/McAuley-Lab/Amazon-Reviews-2023 | Structured (JSON) | NoAssertion | 16,216 | 1 | 2.4 MB | 2.5 MB | +| [⚠ C4 (en, validation)](#scrape-advisory-c4-en-validation) | AllenAI/C4 — Colossal Clean Crawled Corpus, English validation split | C4 (Raffel et al., JMLR 2020) — a heavily-filtered scrape of Common Crawl used to pretrain T5. This entry pulls only the 8-shard English validation split (~365k documents), enough for type coverage and as a smoke-test for the Common-Crawl scrape playbook. Flip allow_patterns to `en/c4-train.*.json.gz` to mirror the 327 GB English training set. | https://huggingface.co/datasets/allenai/c4 | Structured (JSON) | ODC-By-1.0 | 364,608 | 7 | 340.4 MB | 345.7 MB | +| [⚠ CodeParrot Clean (validation)](#scrape-advisory-codeparrot-clean-valid) | codeparrot/codeparrot-clean — validation split | 61k Python source files scraped from MIT/BSD/Apache-licensed GitHub repos by the CodeParrot project. Validation split (142 MB raw .json.gz). Showcases code-corpus shape: string `content`, numeric quality metrics (line_mean, alpha_frac), boolean autogenerated flag, and per-row license attribution. | https://huggingface.co/datasets/codeparrot/codeparrot-clean-valid | Structured + Blobs | Apache-2.0 | 61,373 | 5 | 149.9 MB | 249.6 MB | +| [⚠ FineMath (4+ quality subset)](#scrape-advisory-finemath-4plus) | HuggingFaceTB/finemath — quality≥4 math web pages | Math-focused subset of the fineweb pipeline, filtered to documents with an automated quality score ≥ 4 (the higher of the two quality tiers). 64 parquet shards. Schema mirrors fineweb (`text` + harvest metadata). | https://huggingface.co/datasets/HuggingFaceTB/finemath | Tabular (Parquet) | ODC-By-1.0 | 6,699,493 | 270 | 12,686.0 MB | 16,658.5 MB | +| [⚠ FinePDFs (English test sample)](#scrape-advisory-finepdfs-en-test) | HuggingFaceFW/finepdfs — English test split (sample) | Sample slice of HuggingFace's PDF-derived corpus (3T tokens total, 1733 languages). Schema mirrors fineweb (`text` + harvest metadata) but the source is OCR/extracted PDFs rather than HTML. Limited here to the English test split (~1 shard) for tractable build size — flip allow patterns to `eng_Latn/train/*.parquet` for the full English corpus (579 shards, multi-hour fetch). | https://huggingface.co/datasets/HuggingFaceFW/finepdfs | Tabular (Parquet) | ODC-By-1.0 | 373 | 1 | 7.0 MB | 10.6 MB | +| [⚠ Fineweb (sample, 10BT)](#scrape-advisory-fineweb-sample-10bt) | HuggingFaceFW/fineweb — 10B-token reproducibility sample | 10B-token reproducibility sample of HuggingFace's Fineweb (a 15TB Common-Crawl-filtered English-text corpus released for LLM pretraining research). 15 parquet shards of `text` + deduplication metadata (~32 GB raw). Flip allow_patterns to `sample/100BT/*.parquet` (300 GB) or `sample/350BT/*.parquet` (1 TB) for larger reproducibility samples. | https://huggingface.co/datasets/HuggingFaceFW/fineweb | Tabular (Parquet) | ODC-By-1.0 | 14,868,862 | 375 | 20,436.2 MB | 20,943.2 MB | +| [⚠ Fineweb-2 (Swedish sample)](#scrape-advisory-fineweb-2-swedish) | HuggingFaceFW/fineweb-2 — Swedish Latin-script subset (sample) | Swedish-language subset of HuggingFace's multilingual fineweb-2 (the 1000+-language extension of the original English fineweb). Each row carries `text` plus the same dedup/quality metadata fields as fineweb. Picked Swedish for a moderately-sized representative non-English split; flip `hf_allow_patterns` to `_