Skip to content

feat: move data normalization from Python consumers to Rust extractor… #1141

feat: move data normalization from Python consumers to Rust extractor…

feat: move data normalization from Python consumers to Rust extractor… #1141

Triggered via push April 12, 2026 01:55
Status Success
Total duration 13m 34s
Artifacts 10

build.yml

on: push
detect-changes
5s
detect-changes
run-code-quality  /  code-quality
2m 21s
run-code-quality / code-quality
list-sub-projects  /  list-sub-projects
4s
list-sub-projects / list-sub-projects
Matrix: run-e2e-tests / e2e-test
run-security  /  Python Security
45s
run-security / Python Security
run-security  /  Semgrep CE Scan
57s
run-security / Semgrep CE Scan
run-security  /  Rust Security
22s
run-security / Rust Security
run-security  /  Secret Scanning
13s
run-security / Secret Scanning
run-security  /  Container Scanning
31s
run-security / Container Scanning
run-docker-compose-validate  /  validate-compose
10s
run-docker-compose-validate / validate-compose
run-tests  /  test-api
49s
run-tests / test-api
run-tests  /  test-common
54s
run-tests / test-common
run-tests  /  test-dashboard
1m 1s
run-tests / test-dashboard
run-tests  /  test-explore
33s
run-tests / test-explore
run-tests  /  test-insights
28s
run-tests / test-insights
run-tests  /  test-mcp-server
28s
run-tests / test-mcp-server
run-tests  /  test-brainzgraphinator
24s
run-tests / test-brainzgraphinator
run-tests  /  test-graphinator
44s
run-tests / test-graphinator
run-tests  /  test-schema-init
20s
run-tests / test-schema-init
run-tests  /  test-tableinator
42s
run-tests / test-tableinator
run-tests  /  test-brainztableinator
33s
run-tests / test-brainztableinator
run-tests  /  test-js
25s
run-tests / test-js
run-tests  /  test-extractor
2m 55s
run-tests / test-extractor
Matrix: run-docker-validate / validate-dockerfiles
aggregate-results
3s
aggregate-results
Matrix: build-discogsography
Fit to window
Zoom out
Zoom in

Annotations

44 warnings and 20 notices
run-code-quality / code-quality
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/setup-python@v5, alexellis/arkade-get@1eef818e467c387d3f50cfe0d2c565d1cbe82b03, astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
run-docker-compose-validate / validate-compose
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: alexellis/arkade-get@1eef818e467c387d3f50cfe0d2c565d1cbe82b03. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
run-tests / test-brainzgraphinator
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/setup-python@v5, astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
run-tests / test-mcp-server
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/setup-python@v5, astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
run-tests / test-insights
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/setup-python@v5, astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
run-security / Container Scanning
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/cache@0400d5f644dc74513175e3cd8d07132dd4860809. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
run-tests / test-brainztableinator
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/setup-python@v5, astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
run-tests / test-explore
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/setup-python@v5, astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
run-tests / test-tableinator
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/setup-python@v5, astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
run-tests / test-schema-init
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/setup-python@v5, astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
run-security / Python Security
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/setup-python@v5, astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
run-tests / test-api
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/setup-python@v5, astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
run-tests / test-common
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/setup-python@v5, astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
run-tests / test-graphinator
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/setup-python@v5, astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
run-tests / test-dashboard
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/setup-python@v5, astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
run-e2e-tests / Test firefox
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/setup-python@v5, astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
run-e2e-tests / Test chromium
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/setup-python@v5, astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
run-e2e-tests / Test webkit
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/setup-python@v5, astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
run-e2e-tests / Test webkit - iPad Pro 11
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/setup-python@v5, astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
run-e2e-tests / Test webkit - iPhone 15
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/setup-python@v5, astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
build-discogsography (brainzgraphinator, true)
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/setup-python@v5, astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
build-discogsography (brainzgraphinator, true)
embed field value must be shorter than 1024, got 3426 [`accb054`](https://github.com/SimplicityGuy/discogsography/commit/accb054bd4aba1dd2300a05026a0aca2f881e869) feat: move data normalization from Python consumers to Rust extractor (#290) (#294) * docs: add design spec for moving normalizer logic to Rust extractor (#290) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: add implementation plan for normalizer-to-extractor migration (#290) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add normalize.rs with generic helpers Add strip_at_prefixes, unwrap_container, and ensure_list functions for transforming XML-style JSON conventions into flat format. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add artist normalization to normalize.rs Add normalize_item_list helper and normalize_artist function to flatten members, groups, and aliases from XML container format to flat arrays. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add label normalization to normalize.rs Add normalize_label function to handle parentLabel strip_at_prefixes and sublabels container flattening. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add master normalization to normalize.rs Add normalize_string_list helper and normalize_master function to handle @id stripping, artists container, genres, and styles flattening. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add release normalization to normalize.rs Add normalize_release function handling artists, labels, master_id extraction, genres, styles, extraartists, and formats with @-prefix stripping. Includes full pipeline integration test. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor(extractor): address code review — clarify doc, add edge case tests Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): wire normalize_record into validator pipeline Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: simplify Python normalizer — structural normalization moved to Rust extractor - Gut data_normalizer.py to only retain year parsing and normalize_record() - Replace extract_format_names with inline list comprehension in graphinator - Rewrite normalizer tests for simplified module - Update all test fixtures to flat extractor output format Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(extractor): reorder normalize after evaluate_rules to preserve rule path resolution Rules use dot-notation paths like "genres.genre" that match the XML structure. Moving normalize_record after evaluate_rules ensures rules operate on the pre-normalized shape while the content hash still reflects the normalized output consumers see. Also updates stale comment in tableinator. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * test(extractor): add coverage tests for defensive branches in normalize.rs Covers: non-object inputs to normalizers, string/number items in normalize_item_list, bare string in unwrap_container, non-object format items. Raises line coverage from 93.4% to 97.7%. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
build-discogsography (dashboard, true)
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/setup-python@v5, astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
build-discogsography (dashboard, true)
embed field value must be shorter than 1024, got 3426 [`accb054`](https://github.com/SimplicityGuy/discogsography/commit/accb054bd4aba1dd2300a05026a0aca2f881e869) feat: move data normalization from Python consumers to Rust extractor (#290) (#294) * docs: add design spec for moving normalizer logic to Rust extractor (#290) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: add implementation plan for normalizer-to-extractor migration (#290) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add normalize.rs with generic helpers Add strip_at_prefixes, unwrap_container, and ensure_list functions for transforming XML-style JSON conventions into flat format. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add artist normalization to normalize.rs Add normalize_item_list helper and normalize_artist function to flatten members, groups, and aliases from XML container format to flat arrays. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add label normalization to normalize.rs Add normalize_label function to handle parentLabel strip_at_prefixes and sublabels container flattening. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add master normalization to normalize.rs Add normalize_string_list helper and normalize_master function to handle @id stripping, artists container, genres, and styles flattening. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add release normalization to normalize.rs Add normalize_release function handling artists, labels, master_id extraction, genres, styles, extraartists, and formats with @-prefix stripping. Includes full pipeline integration test. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor(extractor): address code review — clarify doc, add edge case tests Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): wire normalize_record into validator pipeline Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: simplify Python normalizer — structural normalization moved to Rust extractor - Gut data_normalizer.py to only retain year parsing and normalize_record() - Replace extract_format_names with inline list comprehension in graphinator - Rewrite normalizer tests for simplified module - Update all test fixtures to flat extractor output format Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(extractor): reorder normalize after evaluate_rules to preserve rule path resolution Rules use dot-notation paths like "genres.genre" that match the XML structure. Moving normalize_record after evaluate_rules ensures rules operate on the pre-normalized shape while the content hash still reflects the normalized output consumers see. Also updates stale comment in tableinator. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * test(extractor): add coverage tests for defensive branches in normalize.rs Covers: non-object inputs to normalizers, string/number items in normalize_item_list, bare string in unwrap_container, non-object format items. Raises line coverage from 93.4% to 97.7%. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
build-discogsography (tableinator, true)
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/setup-python@v5, astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
build-discogsography (tableinator, true)
embed field value must be shorter than 1024, got 3426 [`accb054`](https://github.com/SimplicityGuy/discogsography/commit/accb054bd4aba1dd2300a05026a0aca2f881e869) feat: move data normalization from Python consumers to Rust extractor (#290) (#294) * docs: add design spec for moving normalizer logic to Rust extractor (#290) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: add implementation plan for normalizer-to-extractor migration (#290) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add normalize.rs with generic helpers Add strip_at_prefixes, unwrap_container, and ensure_list functions for transforming XML-style JSON conventions into flat format. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add artist normalization to normalize.rs Add normalize_item_list helper and normalize_artist function to flatten members, groups, and aliases from XML container format to flat arrays. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add label normalization to normalize.rs Add normalize_label function to handle parentLabel strip_at_prefixes and sublabels container flattening. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add master normalization to normalize.rs Add normalize_string_list helper and normalize_master function to handle @id stripping, artists container, genres, and styles flattening. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add release normalization to normalize.rs Add normalize_release function handling artists, labels, master_id extraction, genres, styles, extraartists, and formats with @-prefix stripping. Includes full pipeline integration test. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor(extractor): address code review — clarify doc, add edge case tests Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): wire normalize_record into validator pipeline Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: simplify Python normalizer — structural normalization moved to Rust extractor - Gut data_normalizer.py to only retain year parsing and normalize_record() - Replace extract_format_names with inline list comprehension in graphinator - Rewrite normalizer tests for simplified module - Update all test fixtures to flat extractor output format Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(extractor): reorder normalize after evaluate_rules to preserve rule path resolution Rules use dot-notation paths like "genres.genre" that match the XML structure. Moving normalize_record after evaluate_rules ensures rules operate on the pre-normalized shape while the content hash still reflects the normalized output consumers see. Also updates stale comment in tableinator. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * test(extractor): add coverage tests for defensive branches in normalize.rs Covers: non-object inputs to normalizers, string/number items in normalize_item_list, bare string in unwrap_container, non-object format items. Raises line coverage from 93.4% to 97.7%. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
build-discogsography (graphinator, true)
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/setup-python@v5, astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
build-discogsography (graphinator, true)
embed field value must be shorter than 1024, got 3426 [`accb054`](https://github.com/SimplicityGuy/discogsography/commit/accb054bd4aba1dd2300a05026a0aca2f881e869) feat: move data normalization from Python consumers to Rust extractor (#290) (#294) * docs: add design spec for moving normalizer logic to Rust extractor (#290) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: add implementation plan for normalizer-to-extractor migration (#290) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add normalize.rs with generic helpers Add strip_at_prefixes, unwrap_container, and ensure_list functions for transforming XML-style JSON conventions into flat format. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add artist normalization to normalize.rs Add normalize_item_list helper and normalize_artist function to flatten members, groups, and aliases from XML container format to flat arrays. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add label normalization to normalize.rs Add normalize_label function to handle parentLabel strip_at_prefixes and sublabels container flattening. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add master normalization to normalize.rs Add normalize_string_list helper and normalize_master function to handle @id stripping, artists container, genres, and styles flattening. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add release normalization to normalize.rs Add normalize_release function handling artists, labels, master_id extraction, genres, styles, extraartists, and formats with @-prefix stripping. Includes full pipeline integration test. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor(extractor): address code review — clarify doc, add edge case tests Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): wire normalize_record into validator pipeline Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: simplify Python normalizer — structural normalization moved to Rust extractor - Gut data_normalizer.py to only retain year parsing and normalize_record() - Replace extract_format_names with inline list comprehension in graphinator - Rewrite normalizer tests for simplified module - Update all test fixtures to flat extractor output format Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(extractor): reorder normalize after evaluate_rules to preserve rule path resolution Rules use dot-notation paths like "genres.genre" that match the XML structure. Moving normalize_record after evaluate_rules ensures rules operate on the pre-normalized shape while the content hash still reflects the normalized output consumers see. Also updates stale comment in tableinator. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * test(extractor): add coverage tests for defensive branches in normalize.rs Covers: non-object inputs to normalizers, string/number items in normalize_item_list, bare string in unwrap_container, non-object format items. Raises line coverage from 93.4% to 97.7%. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
build-discogsography (explore, true)
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/setup-python@v5, astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
build-discogsography (explore, true)
embed field value must be shorter than 1024, got 3426 [`accb054`](https://github.com/SimplicityGuy/discogsography/commit/accb054bd4aba1dd2300a05026a0aca2f881e869) feat: move data normalization from Python consumers to Rust extractor (#290) (#294) * docs: add design spec for moving normalizer logic to Rust extractor (#290) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: add implementation plan for normalizer-to-extractor migration (#290) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add normalize.rs with generic helpers Add strip_at_prefixes, unwrap_container, and ensure_list functions for transforming XML-style JSON conventions into flat format. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add artist normalization to normalize.rs Add normalize_item_list helper and normalize_artist function to flatten members, groups, and aliases from XML container format to flat arrays. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add label normalization to normalize.rs Add normalize_label function to handle parentLabel strip_at_prefixes and sublabels container flattening. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add master normalization to normalize.rs Add normalize_string_list helper and normalize_master function to handle @id stripping, artists container, genres, and styles flattening. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add release normalization to normalize.rs Add normalize_release function handling artists, labels, master_id extraction, genres, styles, extraartists, and formats with @-prefix stripping. Includes full pipeline integration test. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor(extractor): address code review — clarify doc, add edge case tests Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): wire normalize_record into validator pipeline Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: simplify Python normalizer — structural normalization moved to Rust extractor - Gut data_normalizer.py to only retain year parsing and normalize_record() - Replace extract_format_names with inline list comprehension in graphinator - Rewrite normalizer tests for simplified module - Update all test fixtures to flat extractor output format Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(extractor): reorder normalize after evaluate_rules to preserve rule path resolution Rules use dot-notation paths like "genres.genre" that match the XML structure. Moving normalize_record after evaluate_rules ensures rules operate on the pre-normalized shape while the content hash still reflects the normalized output consumers see. Also updates stale comment in tableinator. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * test(extractor): add coverage tests for defensive branches in normalize.rs Covers: non-object inputs to normalizers, string/number items in normalize_item_list, bare string in unwrap_container, non-object format items. Raises line coverage from 93.4% to 97.7%. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
build-discogsography (brainztableinator, true)
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/setup-python@v5, astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
build-discogsography (brainztableinator, true)
embed field value must be shorter than 1024, got 3426 [`accb054`](https://github.com/SimplicityGuy/discogsography/commit/accb054bd4aba1dd2300a05026a0aca2f881e869) feat: move data normalization from Python consumers to Rust extractor (#290) (#294) * docs: add design spec for moving normalizer logic to Rust extractor (#290) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: add implementation plan for normalizer-to-extractor migration (#290) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add normalize.rs with generic helpers Add strip_at_prefixes, unwrap_container, and ensure_list functions for transforming XML-style JSON conventions into flat format. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add artist normalization to normalize.rs Add normalize_item_list helper and normalize_artist function to flatten members, groups, and aliases from XML container format to flat arrays. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add label normalization to normalize.rs Add normalize_label function to handle parentLabel strip_at_prefixes and sublabels container flattening. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add master normalization to normalize.rs Add normalize_string_list helper and normalize_master function to handle @id stripping, artists container, genres, and styles flattening. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add release normalization to normalize.rs Add normalize_release function handling artists, labels, master_id extraction, genres, styles, extraartists, and formats with @-prefix stripping. Includes full pipeline integration test. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor(extractor): address code review — clarify doc, add edge case tests Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): wire normalize_record into validator pipeline Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: simplify Python normalizer — structural normalization moved to Rust extractor - Gut data_normalizer.py to only retain year parsing and normalize_record() - Replace extract_format_names with inline list comprehension in graphinator - Rewrite normalizer tests for simplified module - Update all test fixtures to flat extractor output format Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(extractor): reorder normalize after evaluate_rules to preserve rule path resolution Rules use dot-notation paths like "genres.genre" that match the XML structure. Moving normalize_record after evaluate_rules ensures rules operate on the pre-normalized shape while the content hash still reflects the normalized output consumers see. Also updates stale comment in tableinator. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * test(extractor): add coverage tests for defensive branches in normalize.rs Covers: non-object inputs to normalizers, string/number items in normalize_item_list, bare string in unwrap_container, non-object format items. Raises line coverage from 93.4% to 97.7%. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
build-discogsography (api, true)
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/setup-python@v5, astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
build-discogsography (api, true)
embed field value must be shorter than 1024, got 3426 [`accb054`](https://github.com/SimplicityGuy/discogsography/commit/accb054bd4aba1dd2300a05026a0aca2f881e869) feat: move data normalization from Python consumers to Rust extractor (#290) (#294) * docs: add design spec for moving normalizer logic to Rust extractor (#290) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: add implementation plan for normalizer-to-extractor migration (#290) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add normalize.rs with generic helpers Add strip_at_prefixes, unwrap_container, and ensure_list functions for transforming XML-style JSON conventions into flat format. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add artist normalization to normalize.rs Add normalize_item_list helper and normalize_artist function to flatten members, groups, and aliases from XML container format to flat arrays. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add label normalization to normalize.rs Add normalize_label function to handle parentLabel strip_at_prefixes and sublabels container flattening. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add master normalization to normalize.rs Add normalize_string_list helper and normalize_master function to handle @id stripping, artists container, genres, and styles flattening. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add release normalization to normalize.rs Add normalize_release function handling artists, labels, master_id extraction, genres, styles, extraartists, and formats with @-prefix stripping. Includes full pipeline integration test. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor(extractor): address code review — clarify doc, add edge case tests Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): wire normalize_record into validator pipeline Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: simplify Python normalizer — structural normalization moved to Rust extractor - Gut data_normalizer.py to only retain year parsing and normalize_record() - Replace extract_format_names with inline list comprehension in graphinator - Rewrite normalizer tests for simplified module - Update all test fixtures to flat extractor output format Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(extractor): reorder normalize after evaluate_rules to preserve rule path resolution Rules use dot-notation paths like "genres.genre" that match the XML structure. Moving normalize_record after evaluate_rules ensures rules operate on the pre-normalized shape while the content hash still reflects the normalized output consumers see. Also updates stale comment in tableinator. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * test(extractor): add coverage tests for defensive branches in normalize.rs Covers: non-object inputs to normalizers, string/number items in normalize_item_list, bare string in unwrap_container, non-object format items. Raises line coverage from 93.4% to 97.7%. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sensitive data should not be used in the ARG or ENV commands: api/Dockerfile#L113
SecretsUsedInArgOrEnv: Do not use ARG or ENV instructions for sensitive data (ENV "JWT_SECRET_KEY") More info: https://docs.docker.com/go/dockerfile/rule/secrets-used-in-arg-or-env/
Sensitive data should not be used in the ARG or ENV commands: api/Dockerfile#L113
SecretsUsedInArgOrEnv: Do not use ARG or ENV instructions for sensitive data (ENV "POSTGRES_PASSWORD") More info: https://docs.docker.com/go/dockerfile/rule/secrets-used-in-arg-or-env/
build-discogsography (insights, true)
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/setup-python@v5, astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
build-discogsography (insights, true)
embed field value must be shorter than 1024, got 3426 [`accb054`](https://github.com/SimplicityGuy/discogsography/commit/accb054bd4aba1dd2300a05026a0aca2f881e869) feat: move data normalization from Python consumers to Rust extractor (#290) (#294) * docs: add design spec for moving normalizer logic to Rust extractor (#290) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: add implementation plan for normalizer-to-extractor migration (#290) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add normalize.rs with generic helpers Add strip_at_prefixes, unwrap_container, and ensure_list functions for transforming XML-style JSON conventions into flat format. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add artist normalization to normalize.rs Add normalize_item_list helper and normalize_artist function to flatten members, groups, and aliases from XML container format to flat arrays. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add label normalization to normalize.rs Add normalize_label function to handle parentLabel strip_at_prefixes and sublabels container flattening. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add master normalization to normalize.rs Add normalize_string_list helper and normalize_master function to handle @id stripping, artists container, genres, and styles flattening. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add release normalization to normalize.rs Add normalize_release function handling artists, labels, master_id extraction, genres, styles, extraartists, and formats with @-prefix stripping. Includes full pipeline integration test. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor(extractor): address code review — clarify doc, add edge case tests Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): wire normalize_record into validator pipeline Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: simplify Python normalizer — structural normalization moved to Rust extractor - Gut data_normalizer.py to only retain year parsing and normalize_record() - Replace extract_format_names with inline list comprehension in graphinator - Rewrite normalizer tests for simplified module - Update all test fixtures to flat extractor output format Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(extractor): reorder normalize after evaluate_rules to preserve rule path resolution Rules use dot-notation paths like "genres.genre" that match the XML structure. Moving normalize_record after evaluate_rules ensures rules operate on the pre-normalized shape while the content hash still reflects the normalized output consumers see. Also updates stale comment in tableinator. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * test(extractor): add coverage tests for defensive branches in normalize.rs Covers: non-object inputs to normalizers, string/number items in normalize_item_list, bare string in unwrap_container, non-object format items. Raises line coverage from 93.4% to 97.7%. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
build-discogsography (schema-init, true)
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/setup-python@v5, astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
build-discogsography (schema-init, true)
embed field value must be shorter than 1024, got 3426 [`accb054`](https://github.com/SimplicityGuy/discogsography/commit/accb054bd4aba1dd2300a05026a0aca2f881e869) feat: move data normalization from Python consumers to Rust extractor (#290) (#294) * docs: add design spec for moving normalizer logic to Rust extractor (#290) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: add implementation plan for normalizer-to-extractor migration (#290) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add normalize.rs with generic helpers Add strip_at_prefixes, unwrap_container, and ensure_list functions for transforming XML-style JSON conventions into flat format. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add artist normalization to normalize.rs Add normalize_item_list helper and normalize_artist function to flatten members, groups, and aliases from XML container format to flat arrays. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add label normalization to normalize.rs Add normalize_label function to handle parentLabel strip_at_prefixes and sublabels container flattening. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add master normalization to normalize.rs Add normalize_string_list helper and normalize_master function to handle @id stripping, artists container, genres, and styles flattening. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add release normalization to normalize.rs Add normalize_release function handling artists, labels, master_id extraction, genres, styles, extraartists, and formats with @-prefix stripping. Includes full pipeline integration test. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor(extractor): address code review — clarify doc, add edge case tests Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): wire normalize_record into validator pipeline Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: simplify Python normalizer — structural normalization moved to Rust extractor - Gut data_normalizer.py to only retain year parsing and normalize_record() - Replace extract_format_names with inline list comprehension in graphinator - Rewrite normalizer tests for simplified module - Update all test fixtures to flat extractor output format Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(extractor): reorder normalize after evaluate_rules to preserve rule path resolution Rules use dot-notation paths like "genres.genre" that match the XML structure. Moving normalize_record after evaluate_rules ensures rules operate on the pre-normalized shape while the content hash still reflects the normalized output consumers see. Also updates stale comment in tableinator. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * test(extractor): add coverage tests for defensive branches in normalize.rs Covers: non-object inputs to normalizers, string/number items in normalize_item_list, bare string in unwrap_container, non-object format items. Raises line coverage from 93.4% to 97.7%. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sensitive data should not be used in the ARG or ENV commands: schema-init/Dockerfile#L92
SecretsUsedInArgOrEnv: Do not use ARG or ENV instructions for sensitive data (ENV "POSTGRES_PASSWORD") More info: https://docs.docker.com/go/dockerfile/rule/secrets-used-in-arg-or-env/
Sensitive data should not be used in the ARG or ENV commands: schema-init/Dockerfile#L92
SecretsUsedInArgOrEnv: Do not use ARG or ENV instructions for sensitive data (ENV "NEO4J_PASSWORD") More info: https://docs.docker.com/go/dockerfile/rule/secrets-used-in-arg-or-env/
build-discogsography (extractor, true)
Node.js 20 actions are deprecated. The following actions are running on Node.js 20 and may not work as expected: actions/setup-python@v5, astral-sh/setup-uv@e92bafb6253dcd438e0484186d7669ea7a8ca1cc. Actions will be forced to run with Node.js 24 by default starting June 2nd, 2026. Node.js 20 will be removed from the runner on September 16th, 2026. Please check if updated versions of these actions are available that support Node.js 24. To opt into Node.js 24 now, set the FORCE_JAVASCRIPT_ACTIONS_TO_NODE24=true environment variable on the runner or in your workflow file. Once Node.js 24 becomes the default, you can temporarily opt out by setting ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION=true. For more information see: https://github.blog/changelog/2025-09-19-deprecation-of-node-20-on-github-actions-runners/
build-discogsography (extractor, true)
embed field value must be shorter than 1024, got 3426 [`accb054`](https://github.com/SimplicityGuy/discogsography/commit/accb054bd4aba1dd2300a05026a0aca2f881e869) feat: move data normalization from Python consumers to Rust extractor (#290) (#294) * docs: add design spec for moving normalizer logic to Rust extractor (#290) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * docs: add implementation plan for normalizer-to-extractor migration (#290) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add normalize.rs with generic helpers Add strip_at_prefixes, unwrap_container, and ensure_list functions for transforming XML-style JSON conventions into flat format. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add artist normalization to normalize.rs Add normalize_item_list helper and normalize_artist function to flatten members, groups, and aliases from XML container format to flat arrays. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add label normalization to normalize.rs Add normalize_label function to handle parentLabel strip_at_prefixes and sublabels container flattening. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add master normalization to normalize.rs Add normalize_string_list helper and normalize_master function to handle @id stripping, artists container, genres, and styles flattening. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): add release normalization to normalize.rs Add normalize_release function handling artists, labels, master_id extraction, genres, styles, extraartists, and formats with @-prefix stripping. Includes full pipeline integration test. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor(extractor): address code review — clarify doc, add edge case tests Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * feat(extractor): wire normalize_record into validator pipeline Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * refactor: simplify Python normalizer — structural normalization moved to Rust extractor - Gut data_normalizer.py to only retain year parsing and normalize_record() - Replace extract_format_names with inline list comprehension in graphinator - Rewrite normalizer tests for simplified module - Update all test fixtures to flat extractor output format Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * fix(extractor): reorder normalize after evaluate_rules to preserve rule path resolution Rules use dot-notation paths like "genres.genre" that match the XML structure. Moving normalize_record after evaluate_rules ensures rules operate on the pre-normalized shape while the content hash still reflects the normalized output consumers see. Also updates stale comment in tableinator. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> * test(extractor): add coverage tests for defensive branches in normalize.rs Covers: non-object inputs to normalizers, string/number items in normalize_item_list, bare string in unwrap_container, non-object format items. Raises line coverage from 93.4% to 97.7%. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Cache Performance
Docker cache hit for brainzgraphinator
Build Metrics
Service: brainzgraphinator, Duration: 105s, Cache Used: true
Cache Performance
Docker cache hit for dashboard
Build Metrics
Service: dashboard, Duration: 116s, Cache Used: true
Cache Performance
Docker cache hit for tableinator
Build Metrics
Service: tableinator, Duration: 112s, Cache Used: true
Cache Performance
Docker cache hit for graphinator
Build Metrics
Service: graphinator, Duration: 122s, Cache Used: true
Cache Performance
Docker cache hit for explore
Build Metrics
Service: explore, Duration: 129s, Cache Used: true
Cache Performance
Docker cache hit for brainztableinator
Build Metrics
Service: brainztableinator, Duration: 137s, Cache Used: true
Cache Performance
Docker cache hit for api
Build Metrics
Service: api, Duration: 161s, Cache Used: true
Cache Performance
Docker cache hit for insights
Build Metrics
Service: insights, Duration: 170s, Cache Used: true
Cache Performance
Docker cache hit for schema-init
Build Metrics
Service: schema-init, Duration: 184s, Cache Used: true
Cache Performance
Docker cache hit for extractor
Build Metrics
Service: extractor, Duration: 355s, Cache Used: true

Artifacts

Produced during runtime
Name Size Digest
SimplicityGuy~discogsography~2N0U6J.dockerbuild
83.2 KB
sha256:e2c82491591263858699ae94d1470689300bde8f1e612d154675f11d21ee8862
SimplicityGuy~discogsography~3KSVMO.dockerbuild
82.5 KB
sha256:c223677d32aa018aecb808640e98b8ff096a63d2ed97155b667da2788e686759
SimplicityGuy~discogsography~63DCW6.dockerbuild
106 KB
sha256:d052937ee4834a573da6c22c94aa1ac989d81014a056d63d7c2d805de512dfab
SimplicityGuy~discogsography~F27H9F.dockerbuild
87.2 KB
sha256:980175287a524cb415c59de691303c464c311bd0a3a448c389deff14f19ce920
SimplicityGuy~discogsography~L53HIG.dockerbuild
83.2 KB
sha256:0c8f84e3df37cefe3dc722c13b0658aff8c5ec234d4db63c8c4d9beebc63e341
SimplicityGuy~discogsography~QJIDA5.dockerbuild
106 KB
sha256:2f0fd130e8ce10f33012a52497df5dda556d66fdd047149a1360f756de9c6d6c
SimplicityGuy~discogsography~QWWPI1.dockerbuild
114 KB
sha256:f3615570fc30f0a866f93e3525dbf68fb6fdf15e29c663d06292b8f594ff44d6
SimplicityGuy~discogsography~WCU4G4.dockerbuild
83.8 KB
sha256:f6e578bc191c37fff4154d3d93166a6a102588f39916597d8dc201c5362ec5cd
SimplicityGuy~discogsography~XQY0FU.dockerbuild
77.4 KB
sha256:54a869e81bb7e35bd4340272c249fa2ffe3fcf73e3eaadd47d1fb2fca044e70c
SimplicityGuy~discogsography~Z29WVB.dockerbuild
82.8 KB
sha256:2742d1b4cb04b82a5ee8d2d56a76a676f9fb8ed5070057ee8414988f2c6db99f