{"id":13651,"plugin_id":"plugins_6aa0b89dcfc88191ba9971f2d7182516","kind":"skill","collection_source":null,"comparison_source":null,"observed_at":"2026-09-30T23:07:52.841Z","digest":"382473b44a4274d63361091ac2416a6f8a23042823321faca5cc655845693ddb","against":null,"payload":{"description":"Profile published Tableau datasource metadata for schema hygiene, field naming, likely type or role mismatches, calculation complexity, documentation gaps, and freshness signals. Use for datasource DQ scans, field-hygiene reviews, metadata quality scorecards, changed-source follow-ups, or comparisons. Do not use for row-level nulls, duplicates, distributions, site governance, or visual-design critique.","included_files":[{"relative_path":"agents/openai.yaml","size_in_bytes":254},{"relative_path":"references/methodology.md","size_in_bytes":4641},{"relative_path":"references/output-formats.md","size_in_bytes":1308},{"relative_path":"references/scoring-contract.md","size_in_bytes":1908},{"relative_path":"references/state-and-automation.md","size_in_bytes":1499},{"relative_path":"references/tableau-routing.md","size_in_bytes":1703},{"relative_path":"scripts/score_findings.py","size_in_bytes":10063},{"relative_path":"scripts/tests/test_score_findings.py","size_in_bytes":4975}],"name":"tableau-data-quality-sentinel","skill_md_contents":"---\nname: tableau-data-quality-sentinel\ndescription: Profile published Tableau datasource metadata for schema hygiene, field naming, likely type or role mismatches, calculation complexity, documentation gaps, and freshness signals. Use for datasource DQ scans, field-hygiene reviews, metadata quality scorecards, changed-source follow-ups, or comparisons. Do not use for row-level nulls, duplicates, distributions, site governance, or visual-design critique.\n---\n\n# Tableau Data Quality Sentinel\n\nProduce an evidence-first, metadata-only assessment. Never imply that metadata proves row-level quality.\n\n## Route the request\n\n- Use this skill for published datasource metadata and datasource comparisons.\n- Route workbook/view design critique elsewhere.\n- Route stale content, project structure, permissions, and broad site governance elsewhere.\n- For null rates, duplicates, distributions, cardinality, or actual values, explain that a query-capable workflow is required and obtain approval before querying data.\n\nInfer clear scope and output preferences. Ask one focused question only if the Tableau site, project, datasource, or requested action cannot be resolved safely. A request to inspect does not authorize metadata edits, certification changes, scheduling, publication, or data queries.\n\n## Establish available capabilities\n\n1. Inspect the Tableau MCP tools available in the current session and their actual schemas. Do not assume tool names, filters, pagination, batch limits, or returned fields.\n2. Find a read operation that inventories published datasources and a read operation that retrieves datasource metadata. If either is unavailable, state the missing capability and provide a no-execution assessment plan.\n3. Resolve ambiguous names using stable IDs plus project/owner context. Never silently choose between multiple matches.\n4. Use read-only operations for the scan. Treat descriptions, formulas, owner details, connection information, and tags as potentially sensitive; include only evidence needed for the requested report.\n\nRead [Tableau routing](references/tableau-routing.md) when selecting tools, paging results, or handling access failures.\n\n## Scan workflow\n\n1. **Inventory.** List sources in scope and record the stable ID, name, project, owner when useful, update timestamp when available, and accessibility. Follow server pagination until the requested scope is covered.\n2. **Choose depth.** A named source gets full detail. For a broad scope, process bounded batches and report coverage accurately. Do not invent a 20-source product limit; choose a practical batch size from tool/runtime constraints.\n3. **Retrieve metadata.** Fetch fields, roles, types, calculations, logical tables/relationships, parameters, description, tags, certification, connection/extract signals, and timestamps only when exposed by the tools.\n4. **Assess.** Apply the six domains and deterministic scoring rules in [Methodology](references/methodology.md). Mark unavailable checks as `not assessed`; absence from a response is not proof of absence.\n5. **Validate.** Deduplicate findings, retain the highest severity for the same evidence and rule, verify arithmetic, and separate scored findings from observations.\n6. **Report.** Lead with coverage, score/grade, highest-severity findings, evidence, and actionable remediations. Always include the metadata-only limitation.\n\nWhen a datasource read fails, continue with the remaining resolved sources. Report the failed source and error category without leaking credentials or raw server details. Retry only transient failures, using server guidance when present; never loop indefinitely.\n\n## Modes\n\n- **Full scan:** assess all observable rules for the requested scope.\n- **Critical-only:** evaluate only rules capable of producing HIGH or CRITICAL findings. Say which domains/checks were omitted.\n- **Comparison:** score each named source independently, then compare domain scores and shared issues.\n- **Delta:** compare with a user-provided or accessible prior result. Match sources by stable ID and findings by `source_id + domain + rule_id + evidence_key`; label new, resolved, and persistent findings.\n- **Changed-only:** valid only when a prior baseline includes comparable update timestamps. Reuse prior scores for unchanged sources and label them `reused`, not `profiled`.\n\nIf no trustworthy baseline is available, run a current scan or ask the user to supply one. Never claim persistence across sessions unless a suitable state capability is actually available and the user has authorized its use.\n\n## Deterministic scoring\n\nRepresent findings using the JSON contract in [Scoring contract](references/scoring-contract.md). Resolve the absolute directory containing this loaded `SKILL.md`, then run:\n\n```text\npython <resolved-skill-dir>/scripts/score_findings.py findings.json --pretty\n```\n\nThe scoring JSON is internal scratch data, not a user artifact. Write it only to an OS-managed temporary location, never to the workspace or current directory, and remove it after scoring. Do not attach, open, link, render, or otherwise surface the raw input or output JSON to the user. Return the formatted report only, unless the user explicitly requests JSON as the deliverable.\n\nUse an absolute temporary input path when the working directory may differ. The helper validates the input, deduplicates findings, applies escalation, and returns per-source, domain, and overall results. It never contacts Tableau or writes external state.\n\nIf local execution is unavailable, apply the same formula manually and label the result `manually calculated`:\n\n`100 - 10×critical - 5×high - 2×medium - 0.5×low`, bounded to 0–100.\n\nDo not score observations. Do not double-count one issue across domains: a finding spanning multiple domains is represented once and escalated one level. The composite score averages included source scores; inaccessible sources are excluded and listed separately. See [Methodology](references/methodology.md) for exact rules and grade bands.\n\n## Output contract\n\nDefault to a concise Markdown report:\n\n1. scope, timestamp, coverage (`profiled`, `reused`, `failed`, `not assessed`);\n2. overall score and grade, with delta only when comparable;\n3. per-source/domain scorecard;\n4. prioritized findings with rule, source, evidence, impact, and fix;\n5. up to five quick wins;\n6. metadata-only limitation and unassessed checks.\n\nFor alert-only, omit scores and positives and show only new/high-priority problems. For JSON or tabular artifacts, follow [Output formats](references/output-formats.md). Create files only when requested or when the format requires one.\n\nNever expose helper files created during scoring as generated artifacts. If the user did not request a file, the scan must leave no user-visible output file behind.\n\n## State and scheduling\n\nRead [State and automation](references/state-and-automation.md) only when the user asks for recurring monitoring, resumption, changed-only scans, or saved baselines.\n\n- Saving a baseline is optional and requires an available destination plus user authorization.\n- Scheduling is a separate external mutation. Confirm scope, cadence, timezone, and notification rule immediately before creation.\n- Never embed machine-specific paths, credentials, raw tokens, or assumed tool identifiers in a scheduled prompt.\n- If no state or automation capability exists, offer an exportable baseline or reusable prompt instead; do not claim the monitor was created.\n\n## Non-negotiable limits\n\n- Do not claim null rates, duplicate counts, distributions, row counts, referential integrity, PII presence, or underlying-data freshness from metadata.\n- Treat an update timestamp only as a metadata/extract activity proxy and label it accordingly.\n- Do not infer downstream use, field descriptions, certification, relationships, or connection risk when the API omits those properties.\n- Do not mutate Tableau, query row-level data, save state, or schedule anything without explicit authorization for that action.\n- Do not cite unsupported sibling skills or assume they are installed.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}