{# Audit's object-overview detail page. Lists EVERY active issue + EVERY available SQL-rewrite suggestion for the requested opportunity's destination_table - not just one rule's findings. Historical query-version issue executions are marked in the cost trend. PR / dry-run / shadow surfaces are deliberately absent - audit is read-only and never generates solutions. #} {% extends "layout.html" %} {% block content %} {% from "components/_page_header.html" import back_link, header_card %} {# Detail-level UI macros. Import once at top-level so suggestion-only opportunities and issue-bearing opportunities share the same surface. #} {% from "components/_signal_chip.html" import signal_chip %} {% from "components/_detail_side_card.html" import detail_side_card %} {% from "components/_materialization_side.html" import materialization_side_content %} {% from "components/_query_review.html" import query_review_card %}
{{ back_link("/opportunities", "Issues & Suggestions") }} {% set _path_parts = (row.affected_table or '').split('.') %} {% set _dataset = _path_parts[1] if _path_parts | length >= 2 else '' %} {% set _table = _path_parts[2] if _path_parts | length >= 3 else (row.affected_table or '') %} {% set _title %}{% if _dataset %}{{ _dataset }}.{% endif %}{{ row.dbt_model_name or _table }}{% endset %} {% call header_card(_title) %} {# Build vs consumption - same classification the dashboard uses (build = writes a destination; consumption = read-only). Makes it explicit on the detail page which kind of workload this is. #} {% if row.query_workload_kind == 'build' %} {{ signal_chip("Build", color="brand", title="Build - this query writes a destination table") }} {% elif row.query_workload_kind == 'consumption' %} {{ signal_chip("Consumption", color="teal", title="Consumption - read-only query, no destination written") }} {% endif %} {% if issue_cards %} {% for issue in issue_cards[:3] %} {{ signal_chip(issue.display_name, color="rose", title="Issue found on this object") }} {% endfor %} {% if issue_cards | length > 3 %} {{ signal_chip("issues", color="rose", overflow=("+" ~ (issue_cards | length - 3)), title="More issue rules found on this object") }} {% endif %} {% endif %} {% if row.dbt_model_name %} dbt {% endif %} {% if row.author_email %} {% set _author_label %}{{ row.author_email }}{% endset %} {{ signal_chip(_author_label, color="slate") }} {% endif %} {# Spec 156 - origin chip in the header. Mirrors the Origin column on /opportunities. Click filters the workspace to this origin. Suppress it when it would just duplicate the green "dbt" marker above (origin 'dbt' on a dbt model) - keep it for Looker / Hex / Fivetran / etc. where it adds information. #} {% if row.origin_tool and row.origin_tool != 'ad_hoc' and not (row.origin_tool == 'dbt' and row.dbt_model_name) %} {% set _origin_label %}{{ row.origin_tool | replace('_', ' ') }}{% endset %} {{ signal_chip(_origin_label, color="slate") }} {% endif %} {% endcall %} {# "What changed" signal for the current query version - the same chips the /jobs version cards show. A resolved rule (e.g. "cross join unaggregated resolved") is good news: it fired on an earlier version and the current query no longer triggers it. This is why the suggestion count can be 0 here while /jobs' history shows the rule - it was already fixed. #} {% if resolved_rules_current or new_rules_current %}
{% for rt in resolved_rules_current %} {{ rt | replace('_', ' ') }} resolved in current version {% endfor %} {% for rt in new_rules_current %} {{ rt | replace('_', ' ') }} new in current version {% endfor %}
{% endif %} {%- set _runs = row.execution_count or 1 -%} {%- set _last_ts = latest_job.creation_time.strftime("%Y-%m-%d %H:%M UTC") if (latest_job and latest_job.creation_time) else "" -%} {%- set _agg_bytes = row.aggregated_bytes_processed or (job.total_bytes_processed if job else none) -%} {%- set _agg_slot_ms = row.aggregated_slot_time_ms or (job.total_slot_ms if job else none) -%} {%- set _cost_meta = ( "last " ~ ((latest_job.total_cost or 0) | float | format_usd) ~ ((" · " ~ _last_ts) if _last_ts else "") ) if latest_job else None -%} {%- set _bytes_meta = ( "last " ~ (latest_job.total_bytes_processed | format_bytes) ~ ((" · billed " ~ (latest_job.total_bytes_billed | format_bytes)) if latest_job.total_bytes_billed is not none else "") ) if (latest_job and latest_job.total_bytes_processed is not none) else None -%} {%- set _slot_meta = ( ("last " ~ (latest_job.duration_ms | format_duration) ~ " wall") if (latest_job and latest_job.duration_ms is not none) else None ) -%} {# Cohesive metric strip - one connected band of columns (cost / bytes / slot / executions) rather than separate boxes. Big aggregated value up top, latest-execution detail on the muted line beneath. #}

Cost

{{ row.query_cost_value | format_usd }}

{% if _cost_meta %}

{{ _cost_meta }}

{% endif %}

Bytes processed

{{ (_agg_bytes | format_bytes) if _agg_bytes is not none else "-" }}

{% if _bytes_meta %}

{{ _bytes_meta }}

{% endif %}

Slot time

{{ ("%.1f" | format((_agg_slot_ms or 0) / 3600000) ~ " hrs") if _agg_slot_ms is not none else "-" }}

{% if _slot_meta %}

{{ _slot_meta }}

{% endif %}

Executions

{{ "{:,}".format(_runs) }}

in scan window

{# Cost trend stays expanded: the chart is useful context rather than noisy forensic detail. #} {% if chart_points_payload %} {% set chart_title = "Cost trend and issues" %} {# Subtitle is derived from the payload granularity inside the partial (per-execution vs daily roll-up). The chart spans every query version. Amber rings mark version changes; red points tripped a detection rule. #} {% set chart_collapsible = false %} {% include "jobs/_cost_chart.html" %} {% endif %}
{{ query_review_card(primary_query_improvement, job.query if job else "", improvements | length) }}
{% call detail_side_card("Issues", (issue_cards | length) ~ (' issue' if issue_cards | length == 1 else ' issues'), "findings") %} {% if issue_cards %}
{% for issue in issue_cards %}
{{ signal_chip(issue.display_name, color="rose", title="Issue found on this object") }}

{{ issue.evidence_text }}

Action

{{ issue.action_text }}

Impact

{{ issue.impact_text }}

{% endfor %}
{% else %}

No issue rules fired for this object.

{% endif %} {% endcall %} {% call detail_side_card("SQL Suggestions", (improvements | length) ~ (' suggestion' if improvements | length == 1 else ' suggestions'), "sql-changes") %} {% if improvements %}
{% for imp in improvements %}
{{ imp.display_name }} {% if imp.template_id %} deterministic rewrite {% endif %} {% if primary_query_improvement and imp.rule_type == primary_query_improvement.rule_type %} shown in query {% endif %} {% if imp.occurrences and imp.occurrences > 1 %} ×{{ imp.occurrences }} {% endif %}
{% if imp.explanation and not (imp.diff_lines or imp.before_content) %}

{{ imp.explanation }}

{% elif imp.diff_lines or imp.before_content %}

Original, suggested, and diff views are available in the query panel.

{% endif %} {% if imp.rollback %}
Rollback instructions

{{ imp.rollback }}

{% endif %}
{% endfor %}
{% else %}

No deterministic SQL rewrite suggestions are available for this object.

{% endif %} {% endcall %} {% set _materialization_count = (audit_mv_candidates | length) + (bq_mv_recommendations | length) %} {% call detail_side_card("Materialization Suggestion", _materialization_count ~ (' candidate' if _materialization_count == 1 else ' candidates'), "materialization-suggestion") %} {{ materialization_side_content(audit_mv_candidates, bq_mv_recommendations) }} {% endcall %}
{% if layout_chip_targets or unused_candidates %}
{# Spec 148 - Recommended physical layout. Read-only suggestion of partition + cluster keys based on how the table is queried. The partial gates on ``layout_recommendation`` so a None recommendation produces zero markup. #} {% include "opportunities/_layout_recommendation.html" %} {# Spec 155 - Unused destination table section. Renders when the anchor opportunity_type is "unused_destination_table". The partial gates on a non-empty input list so it produces zero markup otherwise. Kept separate from the Materialization section because the question is different (should the table exist at all? vs. how should it be persisted?). #} {% include "opportunities/_unused_table.html" %}
{% endif %} {# Technical details - cached BigQuery records plus the lookup SQL. #} {% if job_lookup_sql or job_lookup_rows %}

Technical details

Cached BigQuery job records and lookup SQL for verification.

{% include "components/_job_records_table.html" %} {% if job_lookup_sql %}

Job lookup SQL

{{ job_lookup_sql }}
{% endif %}
{% endif %}
{# Generic tab toggler - picks up every ``[data-tab]`` / ``[data-tab-pane]`` pair inside an ancestor with ``[data-active-tab]``. Kept local to this detail surface so suggestion cards' Diff / Original SQL tabs work without coupling to the class name. #} {% endblock %}