Skip to main content

sdr-grader

PyPI Tests Lint Version Sync Python 3.11+ Coverage Ruff uv License: MIT

A deterministic, rule-based linter for Adobe Customer Journey Analytics (CJA) and Adobe Analytics (AA) implementations. It consumes JSON snapshots from cja_auto_sdr and aa_auto_sdr, evaluates them against a versioned YAML rubric, and produces a self-contained HTML report card plus machine-readable JSON.

File and directory grading make no network requests or Adobe API calls: the same input and rubric always produce the same grade. The convenience modes --dataview and --rsid are different: they launch a child generator, and that child calls Adobe APIs before the local grader runs.

sdr-grader report card: a CJA implementation graded F at 47%, with per-category scores

What it grades

sdr-grader ships strict and pragmatic rubric packs. Both cover schema hygiene, naming consistency, segment complexity, calculated metric maintainability, attribution coverage, and governance posture. strict uses tight, master-cert-grade thresholds; pragmatic uses the same rule IDs with looser thresholds and severities.

Bundled pack 2.0 has 27 rule IDs. Its scores are not comparable with pack 1.0, so re-baseline CI thresholds, trends, and leaderboards after upgrading. Every default rule grades data carried by the snapshot. Optional registered checks can use operator-supplied JSON; see Supplementary inputs.

How it grades

  1. Adapt the platform snapshot into a normalized implementation.
  2. Run rules from the selected rubric pack.
  3. Score each weighted category from fired and available severity.
  4. Assign a letter using the pack's descending grade-scale bands.

The scoring implementation is pinned with this release at src/sdr_grader/core/grade_calc.py.

First local grade

This auth-free quickstart works from any writable directory after installing Python 3.11 or newer. It grades a tagged synthetic fixture, so you can confirm the installation before using production data or configuring Adobe credentials.

Install the released grader with uv (or use pipx or another isolated Python tool installer):

uv tool install sdr-grader
sdr-grader --version

Download the v1.2.2 synthetic CJA snapshot.

macOS and Linux:

curl -fL -o cja_snapshot_clean.json https://raw.githubusercontent.com/brian-a-au/sdr-grader/v1.2.2/tests/fixtures/cja_snapshot_clean.json

Windows PowerShell:

Invoke-WebRequest -Uri "https://raw.githubusercontent.com/brian-a-au/sdr-grader/v1.2.2/tests/fixtures/cja_snapshot_clean.json" -OutFile "cja_snapshot_clean.json"

Grade it with the installed command on macOS, Linux, or Windows:

sdr-grader cja_snapshot_clean.json --output grade.html --json grade.json --quiet

Open the local HTML report:

open grade.html                 # macOS
xdg-open grade.html             # Linux
Start-Process .\grade.html      # Windows PowerShell

Live snapshots have two separate optional prerequisites:

  • CJA: install cja_auto_sdr using its Installation instructions, then configure its Adobe credentials. Generate with --include-all-inventory; without the complete CJA inventory, calculated-metric and segment inputs are empty and those rules stay silent.
  • AA: install aa_auto_sdr using its Installation instructions, then configure its Adobe credentials. AA includes both inventories by default.

The upstream CJA Component Inventory Overview documents the complete set of --include-* switches.

Using sdr-grader

The following are installed-user workflows. Generate live snapshots only after installing and authenticating the appropriate prerequisite above:

# CJA: include the complete component inventory.
cja_auto_sdr dv_prod_web --include-all-inventory --format json --output snapshot.json

# AA: inventory is included by default.
aa_auto_sdr prod_us --format json --output snapshot.json

# Either platform is auto-detected from the resulting JSON.
sdr-grader snapshot.json --output grade.html --json grade.json

For an installed streaming workflow on macOS, Linux, or Windows shells with pipe support:

cja_auto_sdr dv_prod_web --include-all-inventory --format json --output - | sdr-grader - --output grade.html
aa_auto_sdr prod_us --format json --output - | sdr-grader - --output grade.html

Input modes

Mode Invocation Network behavior
File sdr-grader path/to/snapshot.json Local only.
Directory sdr-grader path/to/snapshots/ Local only; selects the newest snapshot.
Historical sdr-grader path/to/snapshots/ --at 2026-04-01 Local only; selects the closest snapshot not after the date.
Trend sdr-grader path/to/snapshots/ --trend Local only; grades dated snapshots chronologically.
CJA child generator sdr-grader --dataview dv_prod_web cja_auto_sdr calls Adobe APIs; complete inventory is requested automatically.
AA child generator sdr-grader --rsid prod_us aa_auto_sdr calls Adobe APIs.
Stdin … | sdr-grader - The grader is local; the producer determines whether the pipeline uses a network.

One run grades one platform. Keep CJA and AA snapshots in separate directories. Directory history uses only same-platform, same-instance siblings; trend mode rejects mixed-platform or mixed-instance input rather than combining it.

Supplementary inputs

Forked rubrics can read optional JSON from Implementation.supplementary_data. Attach it with repeatable --extra-input KEY=PATH flags; a rule whose key is absent stays silent. The tagged supplementary-input contract defines keys, paths, and failure behavior.

Output

  • HTML report card at --output PATH (default grade-{report-id}.html) is a single self-contained file with no external CSS or JavaScript.
  • JSON output at --json PATH uses schema 1 and contains stable instance, adapter, rubric, and grader identity plus the complete report model. See the tagged JSON output contract.

Rendered examples for this release:

Clean (A) Messy (F)
CJA CJA clean CJA messy
AA AA clean AA messy

Troubleshooting

Missing generators, Adobe authentication, incomplete inventories, platform detection, directory mixing, compatibility warnings, output paths, and privacy are covered in the tagged troubleshooting guide.

Before sharing an HTML or JSON report, follow the current report-sharing privacy matrix.

Integrating sdr-grader

Extending sdr-grader

Start with the tagged customization guide, then choose the narrowest extension surface:

Maintaining sdr-grader

These are source-checkout workflows. Run them from the repository root after cloning the v1.2.2 source tree:

uv sync
uv run pytest
uv run ruff check
uv run python scripts/build_cja_fixtures.py
uv run python scripts/generate_examples.py
uv run python scripts/generate_grade_examples.py
uv run python scripts/generate_trend_example.py

Maintainer references:

Community

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sdr_grader-1.2.2.tar.gz (265.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

sdr_grader-1.2.2-py3-none-any.whl (130.9 kB view details)

Uploaded Python 3

File details

Details for the file sdr_grader-1.2.2.tar.gz.

File metadata

  • Download URL: sdr_grader-1.2.2.tar.gz
  • Upload date:
  • Size: 265.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for sdr_grader-1.2.2.tar.gz
Algorithm Hash digest
SHA256 d6566134cad3fd65cab8d44d983264f2dcd3a83af678d30846455aa28df20789
MD5 e2056865f10934891f36123ba88f7a22
BLAKE2b-256 aad271c18afccf48639ff827e94b3d8bb216a42fd0ac49a81e256eafffbb3ca6

See more details on using hashes here.

Provenance

The following attestation bundles were made for sdr_grader-1.2.2.tar.gz:

Publisher: release.yml on brian-a-au/sdr-grader

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sdr_grader-1.2.2-py3-none-any.whl.

File metadata

  • Download URL: sdr_grader-1.2.2-py3-none-any.whl
  • Upload date:
  • Size: 130.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for sdr_grader-1.2.2-py3-none-any.whl
Algorithm Hash digest
SHA256 6e8c3dfa3808dd338e57894856a5cc212bde0cc21e616f45a57b4f404de440dc
MD5 a7b2ef77a5d1f7c61920da7d9fd694d9
BLAKE2b-256 57b25a4559fe3fbcdc27b8fdd66d5fa819efc1ec21fd0fd6bc6f223aa884617f

See more details on using hashes here.

Provenance

The following attestation bundles were made for sdr_grader-1.2.2-py3-none-any.whl:

Publisher: release.yml on brian-a-au/sdr-grader

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

1.2.4

2 files

1.2.3

2 files

This release

1.2.2 This release

2 files

1.2.1

2 files

1.2.0

2 files

1.1.5

2 files

1.1.4

2 files

1.1.3

2 files

1.1.2

2 files

1.1.1

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page