Review checklist
Run this list, by eye, on any diff — yours or an AI’s — after the tools in Verification tools have run and come back clean. It fits on one printed page on purpose. Every line links the catalog entry that explains why (the AI bug catalog numbers its entries 1–27), so this page stays a list rather than a re-run of the module. The groups follow the reading order in the module overview.
flowchart LR A["Agent config<br/>(conf.d, datadog.yaml)"] --> A1["configcheck: shape only<br/>agent status: loads and types"] T["Tracer options"] --> T1["tsc / .d.ts / harness --options:<br/>names. Config dump: values. Payload: order"] M["Custom metrics"] --> M1["Captured flush + dogstatsd-stats:<br/>type and cardinality. Meaning: review"] TF["Terraform"] --> TF1["terraform validate: names and types.<br/>Semantics: API only"] J["JSON monitors / SLOs / catalog"] --> J1["Model: types and required.<br/>_unparsed: enums. Grammar: API only"] K["Kubernetes wiring"] --> K1["Cluster node Agent configcheck.<br/>Not kubectl"] V["Versions and pins"] --> V1["docker image inspect, config dump,<br/>package versions"]
Agent configuration
Section titled “Agent configuration”- Does
conf.d/<name>.d/use the check’s name (redisdb, notredis), and doesagent status— not justagent configcheck— list the check without a Loading Error? See catalog entry 3, proven withCheck redis not found in Catalog. - Is
instances:a list (- host: …), not a mapping? Entry 1, proven withcannot unmarshal !!map into []integration.RawMap. - Are
tags:(and every other list-typed key) YAML lists, notenv:prodscalars? Entry 2 —configcheckprints it happily;agent statusrefuses it. - Are numeric and boolean values really numbers and booleans (
timeout: 5, not"five")? Entry 4, visible only as[ERROR]inagent status. - Is
DD_SITEa domain (datadoghq.com), never a URL? Entry 6, proven withhttps://process.https://api.datadoghq.com.. - Before filing “missing
init_config” — did you run the tool? Entry 5: the file loaded. A finding that the tool does not reproduce is a note, not a bug.
Images and Kubernetes wiring
Section titled “Images and Kubernetes wiring”- Is the Agent image pinned to an exact tag or a digest rather than
latest/ a floating major, so a postmortem can name the Agent that ran? Entry 7 — the tags coincide today, which is why nobody notices. - Are Autodiscovery annotations on the Pod template (
spec.template.metadata), keyed by the container name, in the.checks(v2, Agent 7.36+) form? Entry 8 — docs-only; nothing offline proves it. Verify on a real cluster with the node Agent’sagent configcheck. - Are
DD_ENV,DD_SERVICE,DD_VERSIONderived from one lower-case source (pod labels) on every workload? Entry 12.
Tracer options (Node.js and Python)
Section titled “Tracer options (Node.js and Python)”- Does every key passed to
tracer.init({...})exist inTracerOptions, spelled camelCase (logInjection, notlog_injection)? Entry 9 and entry 11. TypeScript:tsc --noEmit; JavaScript: the harness--optionsor the startup config dump. - Is
dd-traceinitialised (or preloaded with--import dd-trace/initialize.mjs) before the libraries it must instrument? Entry 10 — proven with a captured payload that lackedexpress.request. - Is a “deprecated” claim about a setting backed by the docs page, not by memory? Entry 13 —
DD_TRACE_SAMPLE_RATEis not deprecated and dd-trace 6.17.0 (Node) honours it, but ddtrace 4.15.2 (Python) silently ignores it; useDD_TRACE_SAMPLING_RULESfor cross-language behaviour. - In Python: is every
ddtrace.config.<x>a real attribute (a read, not a write that silently creates one)? Entry 14. - Is
tracer.configure(...)called only with keyword arguments that exist ininspect.signature(tracer.configure)? Agent address belongs inDD_TRACE_AGENT_URL. Entry 15. - Does browser RUM init carry
allowedTracingUrls(and notallowedTracingOrigins)? Entry 16 —tsccatches the name, only a trace in the UI catches the omission.
Custom metrics
Section titled “Custom metrics”- Where the requirement says “global percentile”, is the type a distribution, not a histogram? Entry 17 — the captured flush went to
/api/beta/sketchesversus/api/v1/series. - Is every tag value drawn from a small, bounded set (no
user_id, request id, or raw URL)? Entry 18 — 50 values, 50 series.
Terraform
Section titled “Terraform”- Does every
resourceblock validate with the pinned provider (terraform init && terraform validate), not the one the AI remembers? Entries 19–20. - In
datadog_dashboard, is each request queryquery { metric_query { … } }plus aformulablock? Entry 19. - Are recovery thresholds inside
monitor_thresholds { … },tagsa list, and block names singular (template_variable)? Entry 20. - For sparse or low-traffic metrics, were
notify_no_data,no_data_timeframe, andrequire_full_windowset on purpose? Entry 21 —validateis green either way, and the provider default fornotify_no_dataisfalse. - Does
datadog_rolereference permissions by ID, and islogs_modify_indexesreally meant for this role? Entry 22. - Are exclusion filters as narrow as the intent, and in the order you mean (first active match wins)? Entry 23.
Monitor, SLO, and catalog JSON
Section titled “Monitor, SLO, and catalog JSON”- Is a burn-rate query
burn_rate("<slo_id>").over("<7d|30d|90d>").long_window("…").short_window("…") > N? Entry 24 — model validation is green for a wrong one; only the API and the docs grammar object. - Do composite monitor queries reference real monitor IDs? Entry 25.
- Was the JSON checked with something stricter than the constructor (an
_unparsedcheck on the deserialized object) so enum typos surface? Entry 26. - Is a Service Catalog entry
apiVersion: v3, and did a human check itsspeckeys (the schema does not reject unknown ones)? Entry 27.
Tooling
Section titled “Tooling”- Was
agent statusread afteragent configcheck, and was a check given at least one run? See Verification tools. - Does CI run
npm run verify(options, Terraform, JSON models) on every fence, andnode tools/verify-snippets.mjs --agentwhere Agent YAML is involved? - For every claim that no tool proved, is there a docs URL beside it — and a date or version?
Spot the bug
Section titled “Spot the bug”🐛 Spot the bug
resource "datadog_dashboard" "checkout" {title = "Checkout overview"layout_type = "ordered"
widget { timeseries_definition { request { q = "avg:system.cpu.user{*}" display_type = "line" } title_size = "large" }}
template_variables { name = "env"}}Show the answer
One line, and terraform validate (provider 4.22.0) prints the fix for you: Unsupported block type ... Blocks of type "template_variables" are not expected here. Did you mean "template_variable"? The block is singular. The corrected dashboard validates:
resource "datadog_dashboard" "checkout" { title = "Checkout overview" layout_type = "ordered"
widget { timeseries_definition { request { q = "avg:system.cpu.user{*}" display_type = "line" } title_size = "large" } }
template_variable { name = "env" }}Mental Model
Section titled “Mental Model”- Order by cost of being wrong. Names and shapes (cheap, tool-checkable) first, then values and order (one layer deeper), then meaning (review or API).
- Every line is a yes/no question with an owner. “Which command answers this?” is part of the line. A line without a command is a docs line and carries a URL.
- Green means “not this class of error.”
configcheckgreen rules out shape; it says nothing about the check loading.
Trade-offs
Section titled “Trade-offs”- Seven groups is a lot for a small diff. Skip a group when the diff does not touch it; do not skip the Tooling group.
- The list can freeze folklore. Entries 5 and 13 are on this page because a plausible rule turned out to be false or only half true. Re-prove a line when the Agent, tracer, or provider version changes.
- Docs-only lines age. Autodiscovery placement and the burn-rate grammar cite docs URLs; re-read them on upgrade.
Common Misconceptions
Section titled “Common Misconceptions”- “If the harness passes, the checklist is done.” The harness proves names, types, and shapes; the Monitor, SLO, and permission lines above are outside its reach.
- “Checklist items are obvious.” Each of them was, at least once in this module, produced by an assistant that sounded confident.
- “
terraform validatechecks against Datadog.” It checks against the provider schema; no request is made (validate = falseon the provider block in the harness).