SDR-2026-0425-PROD-WEB

Production Web Analytics

Grade B−
Overall 71%
Components 487 evaluated
Adapter CJA · 3.5.17
Rubric strict@1.2
Generated Apr 25 2026 · 09:14 UTC
Summary

This implementation graded B−, sitting near the median for self-graded production CJA instances. Schema hygiene and naming consistency are strong; the largest gaps are in calculated metric maintainability (61%) and governance posture (54%), driven by a long tail of duplicate-near-equivalent metrics and the absence of any tracked snapshot history. The five highest-impact remediations are listed below; addressing the top three would move the overall grade to B+.

Category scores

Schema hygiene
82% B
Naming consistency
79% B−
Segment complexity
74% C+
Calc. metric maint.
61% D+
Attribution coverage
68% C
Governance posture
54% D

Top remediations

  1. Consolidate the seven near-duplicate revenue calculated metrics into a single canonical metric. CALC-014 · CALC-015 · CALC-022 +6 pts overall
  2. Establish snapshot tracking for the data view via cja_auto_sdr and commit the baseline to version control. GOV-001 +4 pts overall
  3. Add descriptions to the 38 metrics and 51 dimensions currently lacking them. Required fields exist in the data view; populate them via the API. SCH-003 +3 pts overall
  4. Refactor the four segments with nesting depth ≥ 5 into composed sub-segments to make their intent reviewable. SEG-007 +2 pts overall
  5. Document attribution model selection in calculated metrics — 12 metrics use last-touch implicitly without justification. ATTR-002 +2 pts overall

All findings

CALC-014 High calculated metric maintainability

Seven near-duplicate revenue calculated metrics detected

Jaccard similarity across calculated metric formulas identified seven metrics with ≥ 0.85 formula overlap that all compute revenue per visit, with minor variations in attribution model and allocation. They appear to be the result of independent authors solving the same problem without coordination.

cm_revenue_per_visit              author: r.kim@      created: 2024-03-12
cm_rev_per_visit_v2               author: a.patel@    created: 2024-08-04
cm_revpv_lasttouch                author: r.kim@      created: 2024-11-19
cm_rev_visit_linear               author: m.chen@     created: 2025-01-22
cm_revenue_visit_corrected        author: a.patel@    created: 2025-04-08
cm_rpv_marketing                  author: l.gomez@    created: 2025-09-15
cm_rev_per_visit_final            author: r.kim@      created: 2026-02-03

Near-duplicate metrics produce subtly different numbers in different reports, which surfaces as “the dashboards disagree” complaints from executives. They also create maintenance debt: when the underlying definition needs to change, all seven must be updated in lockstep, and inevitably one is missed.

Designate one canonical metric, document its attribution and allocation choices, and update downstream Workspace projects to reference it. Deprecate the others by tagging them with a sunset date and auditing references via cja_auto_sdr --org-report.

GOV-001 High governance posture

No snapshot history detected for this data view

The grader could not locate any prior snapshots of this data view in the configured snapshot directory. Without snapshot history, configuration changes cannot be diffed, drift cannot be detected, and audit trails are unavailable for compliance review.

cja_auto_sdr dv_prod_web --snapshot ./snapshots/baseline.json
cja_auto_sdr --git-init --git-dir ./snapshots
cja_auto_sdr dv_prod_web --git-commit --git-message "Initial baseline"

From this baseline, schedule weekly snapshots via the GitHub Action template in the cja_auto_sdr examples directory.

SCH-003 Medium schema hygiene

89 components lack descriptions

38 metrics and 51 dimensions in this data view have empty description fields. Descriptions are the primary way new analysts and AI agents understand what a component measures; missing descriptions force readers to infer intent from names alone, which is frequently wrong.

Metrics: 38 of 142 missing (27%). Dimensions: 51 of 203 missing (25%). Both rates exceed the rubric threshold of 10%.

Generate the list of components missing descriptions with cja_auto_sdr --quality-report json and populate via the data view API. Establish a CI check that fails new components added without descriptions.

SEG-007 Medium segment complexity

Four segments exceed nesting depth threshold

The rubric flags segments with container nesting depth ≥ 5 as difficult to review. Four segments in this data view exceed that threshold; the deepest reaches depth 8.

seg_qualified_lead_v3             depth: 8     containers: event/session/person mixed
seg_high_intent_returning         depth: 6     containers: session/event nested
seg_b2b_account_engaged           depth: 6     containers: event/session mixed
seg_promo_responsive              depth: 5     containers: event nested

Deep nesting makes intent illegible. Reviewers cannot easily tell whether the segment matches what its name implies, and small definitional changes have unpredictable population effects.

Decompose each segment into composed sub-segments, named for what each layer captures. The surface segment then becomes a shallow combination of well-named pieces, each independently reviewable.

ATTR-002 Medium attribution coverage

12 calculated metrics use last-touch attribution without documented rationale

Last-touch is the default attribution model and is appropriate for some use cases, but the rubric flags it when applied to revenue and conversion metrics without justification. Twelve such metrics were identified.

For each flagged metric, either change the attribution model to one appropriate for the metric’s intended use (algorithmic, linear, or U-shaped for journey-aware metrics), or document in the metric description why last-touch is the correct choice.

NAME-002 Low naming consistency

Inconsistent prefix convention in custom dimensions

73% of custom dimensions follow the c_ prefix convention. The rubric expects ≥ 80%. Four components diverge from the established pattern.

product_category          (expected: c_product_category)
user_segment              (expected: c_user_segment)
cart_value_band           (expected: c_cart_value_band)
last_search_term          (expected: c_last_search_term)

Rename the four affected components via the data view API. Document the prefix convention in the SDR for future contributors.

Distribution context

Overall score vs publicly graded instances
0 25 50 75 100 median 67 you · 71
Category scores vs median (n = 142 instances)
Schema hygiene Naming Seg. complexity Calc. metric maint. Attribution Governance 0 100 ▌ median

Methodology

This grade was produced by sdr-grader v1.0.0 using the strict@1.2 rubric pack. The rubric encodes 73 rules across six categories; 68 ran successfully against the input data view and 5 were skipped (see below). Each rule contributes to a category subtotal weighted by severity (CRITICAL: 4, HIGH: 3, MEDIUM: 2, LOW: 1). Category subtotals roll up to the overall score using the category weights shown in the rubric definition.

The grader is rule-based and deterministic. The same input always produces the same grade. Findings are auditable: every rule’s source YAML is linked from its finding, and rules can be suppressed or reweighted via a project-level .sdr-grader.yaml.

3 rules skipped during this run:
  • PERF-001 · PERF-002 — performance posture rules require Query Service access; not configured for this run.
  • WS-001 · WS-002 — workspace project quality rules require Workspace API scope; not granted to the service account.
  • LBL-003 — data-labeling rule requires AEP governance API access.
Generated by sdr-grader v1.1.5 against snapshot 2026-04-25T09:14:00Z. Rubric: strict@1.2. Adapter: cja_auto_sdr@3.5.17. 487 components evaluated; 23 components skipped (reason: missing required schema fields). Source: github.com/brian-a-au/sdr-grader.