describe-functional-changes
Skill3.8k starsChanged 7 days agoApache-2.0View on GitHub
Describe what a code change does functionally (the scenarios whose behavior changes, the new and removed behaviors, and what deliberately stays the same) as a short "Functional changes" Before | After table for a PR description. /create-pr calls it for every PR. Use it directly when asked "what does this PR change functionally", "describe the behavior change", "write a functional diff", "explain this change without the code", or to improve a PR description that only restates the diff.
Adopted by
Steady: 0 new projects took it in the last 4 weeks, none the 4 weeks before.thin data
Who's talking about DataDog/datadog-agent
- aws/aws-sdk-go-v2“[SOLUTION IN THREAD] "not found, ResolveEndpointV2" service modules before 11/15/23 are incompatible …”GitHub · Nov 16, 2023 · 45 reactions
- micrometer-metrics/micrometer“Unix Domain Socket support (StatsD)”GitHub · Aug 17, 2018 · 22 reactions
- golang/go“proposal: x/tools/go/analysis/passes/appends: check for incorrect slice length initialization ”GitHub · Oct 14, 2024 · 18 reactions
- airbytehq/airbyte“[STORAGE-S3] Add Support for Custom S3 Endpoint”GitHub · Aug 16, 2024 · 14 reactions
- prometheus/blackbox_exporter“List of metrics provided in a human-readable format”GitHub · Dec 15, 2021 · 13 reactions
The biggest 5 of 56 mentions linking to the repository that our crawl found. Each line is their own headline.
See all 56
Talked about on GitHub and Stack Overflow (56 times).
On GitHub · 48
- Nov 16, 2023[SOLUTION IN THREAD] "not found, ResolveEndpointV2" service modules before 11/15/23 are incompatible against newer root modules — aws/aws-sdk-go-v245 reactions · 33 comments
- Aug 17, 2018Unix Domain Socket support (StatsD) — micrometer-metrics/micrometer22 reactions · 23 comments
- Oct 14, 2024proposal: x/tools/go/analysis/passes/appends: check for incorrect slice length initialization — golang/go18 reactions · 28 comments
- Aug 16, 2024[STORAGE-S3] Add Support for Custom S3 Endpoint — airbytehq/airbyte14 reactions · 21 comments
- Dec 15, 2021List of metrics provided in a human-readable format — prometheus/blackbox_exporter13 reactions · 5 comments
43 more on GitHub
- Feb 26, 2026cmd/go: decide and document official recommendation for typical 'go' version in go.mod for open source libraries — golang/go9 reactions · 13 comments
- Dec 26, 2024[BUG] go.mod tidy fails due to unresolved module in dd-trace-go — DataDog/dd-trace-go9 reactions · 8 comments
- Oct 31, 2018[disk] Blacklist certain partitions by default — DataDog/integrations-core9 reactions · 6 comments
- Mar 27, 2024datadog-agent: panic: must be called from a bundle — NixOS/nixpkgs8 reactions · 5 comments
- Feb 3, 2026cmd/go: go list computes build info for test packages when not needed — golang/go7 reactions · 4 comments
- Jan 28, 2022v1.35.0 breaks any program trying to use a `-v` flag — DataDog/dd-trace-go6 reactions · 5 comments
- May 10, 2021Validator reports false duplicates — dependabot/dependabot-core6 reactions · 2 comments
- Aug 27, 2020ERROR | Cannot write json file: /opt/datadog-agent/run/version-history.json with Agent 7.22 — DataDog/heroku-buildpack-datadog6 reactions · 5 comments
- Feb 17, 2025[receiver/sqlserver] Support query-level log collection [Top Query] — open-telemetry/opentelemetry-collector-contrib4 reactions · 11 comments
- Jul 20, 2026chore(ci): update Datadog Agent version to 7.81.1 — DataDog/saluki3 reactions · 3 comments
- Jun 20, 2025datadog-agent: 7.56.2 -> 7.70.2 — NixOS/nixpkgs3 reactions · 3 comments
- May 17, 2024Service V2 collector — prometheus-community/windows_exporter3 reactions
- Nov 4, 2026CONTINT-5659: adds kubernetes_state.pod.unready metric to metadata.csv — DataDog/integrations-core2 reactions · 3 comments
- Nov 2, 2026[Backport v1.32] Update default Agent to `7.85.0` — DataDog/datadog-operator2 reactions · 2 comments
- Nov 2, 2026Update default Agent to `7.85.0` — DataDog/datadog-operator2 reactions · 2 comments
- Oct 26, 2026chore(ci): update Datadog Agent version to 7.84.6 — DataDog/saluki2 reactions · 3 comments
- Oct 21, 2026feat(nodeagent): add DD_POD_NAME as env var — DataDog/datadog-operator2 reactions · 4 comments
- Oct 19, 2026chore(ci): update Datadog Agent version to 7.84.3 — DataDog/saluki2 reactions · 3 comments
- Oct 12, 2026chore(ci): update Datadog Agent version to 7.84.2 — DataDog/saluki2 reactions · 3 comments
- Oct 9, 2026Revert Python version upgrade on 7.84.x — DataDog/integrations-core2 reactions · 6 comments
- Oct 5, 2026chore(ci): update Datadog Agent version to 7.84.1 — DataDog/saluki2 reactions · 2 comments
- Sep 29, 2026Install DotSlash in the standard build images — DataDog/datadog-agent-buildimages2 reactions · 2 comments
- Sep 28, 2026chore(ci): update Datadog Agent version to 7.83.3 — DataDog/saluki2 reactions · 2 comments
- Sep 28, 2026chore(deps): bump the docker-compose-dev group across 2 directories with 14 updates — DataDog/dd-trace-go2 reactions · 2 comments
- Sep 28, 2026Update go dependencies — DataDog/datadog-operator2 reactions · 3 comments
- Sep 21, 2026chore(ci): update Datadog Agent version to 7.83.2 — DataDog/saluki2 reactions · 2 comments
- Sep 21, 2026chore(deps): bump the docker-compose-dev group across 2 directories with 10 updates — DataDog/dd-trace-go2 reactions · 3 comments
- Sep 15, 2026fix(datadog): configure Core Agent for PAR split mode — DataDog/helm-charts2 reactions
- Sep 14, 2026chore(deps): bump the docker-compose-dev group across 2 directories with 7 updates — DataDog/dd-trace-go2 reactions · 3 comments
- Sep 4, 2026feat(orchestrator): grant KubeAI collection RBAC — DataDog/datadog-operator2 reactions · 1 comment
- Sep 3, 2026chore(ci): update Datadog Agent version to 7.83.0 — DataDog/saluki2 reactions · 2 comments
- Sep 3, 2026fix(metrics): normalize metric names prior to filtering — DataDog/saluki2 reactions · 4 comments
- Aug 26, 2026chore(ci): update Datadog Agent version to 7.82.3 — DataDog/saluki2 reactions · 2 comments
- Aug 26, 2026include selinux-type annotation to dap — DataDog/datadog-operator2 reactions · 1 comment
- Aug 24, 2026[CONTP-2014] Add `instrumentation_controller.*` metrics to default cluster agent integration — DataDog/integrations-core2 reactions · 4 comments
- Aug 24, 2026chore(ci): update Datadog Agent version to 7.82.2 — DataDog/saluki2 reactions · 2 comments
- Aug 21, 2026Revert "Revert "Make sure we keep the testing params when extra params does not override minor version"" — DataDog/agent-linux-install-scriptsays it tested it2 reactions · 4 comments
- Aug 18, 2026feat(datadog-agent-commons): add minimal IPC TLS feature — DataDog/saluki2 reactions · 2 comments
- Aug 17, 2026chore(ci): update Datadog Agent version to 7.82.1 — DataDog/saluki2 reactions · 2 comments
- Aug 17, 2026chore(deps): bump the docker-compose-dev group across 3 directories with 7 updates — DataDog/dd-trace-go2 reactions · 3 comments
- Aug 3, 2026chore(ci): update Datadog Agent version to 7.81.3 — DataDog/saluki2 reactions · 2 comments
- Jul 29, 2026[ACIX-1887] Remove legacy devcontainer image — DataDog/datadog-agent-buildimages2 reactions · 1 comment
- Oct 5, 2024Update ecs_fargate docs to note DD_DOGSTATSD_TAG_CARDINALITY setting — DataDog/integrations-core2 reactions · 2 comments
On Stack Overflow · 8
- Mar 13, 2020How do you pass file_system_blacklist arg to Datadog Docker Agent run command?3 votes
- Dec 11, 2019Containers - Failed to get host IPs3 votes
- May 13, 2020Is there a serverless kubernetes datadog agent?2 votes
- Jun 29, 2018How to set docker labels on ECS agent container?2 votes · 1 answer
- Apr 28, 2022Issues with setting up Autodiscovery Auto-Configuration for Kubernetes integration in Datadog1 vote
3 more on Stack Overflow
- Nov 4, 2020How to configure hostname in ECS Fargate task definition1 vote
- Jan 26, 2023datadog local check setup same as check_mk local check for monitoring0 votes
- Mar 31, 2021How does the serverless datadog forwarder encrypt/encode their logs?0 votes
In this repository44 other files it gives its agents.
- AGENTS.mdAGENTS.md
- bazel/AGENTS.mdAGENTS.md
- omnibus/AGENTS.mdAGENTS.md
- packages/AGENTS.mdAGENTS.md
- tasks/AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- .cursor/rules/agent_corecheck.mdcCursor rule
- .cursor/rules/bazel-buildifier.mdcCursor rule
- .cursor/rules/e2e_tests.mdcCursor rule
- .cursor/rules/general-guidelines.mdcCursor rule
- .cursor/rules/system_probe_modules.mdcCursor rule
- agent-supply-chain-newsletterSkill
- alliumSkill
- anomalydetection-run-gensim-scenarioSkill
- auto-jiraSkill
- create-componentSkill
- create-config-fieldSkill
- create-core-checkSkill
- create-epic-recapSkill
- create-go-moduleSkill
- create-invoke-taskSkill
- create-prSkill
- create-release-noteSkill
- create-runtime-settingSkill
- create-status-providerSkill
- create-subcommandSkill
- cws-btfhub-syncSkill
- cws-iouring-coverageSkill
- e2e-auditSkill
- explain-lading-configSkill
- follow-prSkill
- gpu-live-metric-validationSkill
- handle-pr-ci-failureSkill
- injector-devSkill
- locate-config-settingSkill
- quality-gate-size-analysisSkill
- review-pr-commentsSkill
- run-e2eSkill
- run-jiraSkill
- run-windows-e2eSkill
- triage-ci-failureSkill
- update-3rd-party-libsSkill
- update-otel-depsSkill
- write-e2eSkill
The file
We split this skill into the rules it gives an agent
2 rules. About 0 are common, 0 are distinctive, and 2 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈0
Distinctive · estimate
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 28
Or a PR number: use gh pr diff <number> and gh pr view <number> --json title,body,baseRefName,headRefName.
- Very specific: line 71
Group distinct concerns: When a change affects separate areas (e.g.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Describe functional changes
Turn a diff into a short description of how behavior changes, written for a reviewer who hasn't read the code yet.
AI-written PR descriptions tend to restate the diff: which functions moved, which files changed. From that, a reviewer can't tell what the change does without reading every line. This skill writes the missing piece: the scenarios whose outcome is different after the change, phrased so that someone who knows the product but not this code can check them. It complements the technical description of the PR; it doesn't replace it.
Owning team: @DataDog/agent-devx
Prerequisites: a git checkout where the base branch (main by default) is available locally. Only a PR number input needs gh, authenticated with access to DataDog/datadog-agent.
Inputs
- A diff range, the current branch against
mainby default. For<base>...<head>, use it instead ofmain...HEADin the commands below, and<base>..<head>forgit log. - Or a PR number: use
gh pr diff <number>andgh pr view <number> --json title,body,baseRefName,headRefName. - Optional context: the motivation, a linked issue, or what the user said about the change. Commit messages and an existing PR body are context too. Use context to tell which behaviors matter, not as facts about the code: check the claims it makes (e.g. "the Helm chart already mounts X") before repeating them. The description must match what the code does, even when that differs from the stated intent.
Process
- Collect the change.
git log --format='%h %s%n%b' main..HEAD git diff --stat main...HEAD git diff main...HEAD - Identify who is affected. Every change has an audience whose experience changes: Agent users and their configuration, the payloads sent to Datadog (metrics, tags, logs, traces), CLI, status, or flare output, other Agent components, developers running invoke tasks or tests, CI pipelines, or agents following a skill. Functional changes are what they would observe, so name them before writing anything.
- Work out behavior, not edits. For each meaningful hunk, ask in which situation the outcome is now different. Read the surrounding code, callers, config defaults, and build tags: a diff shows which lines changed, not which paths reach them or on which platforms. Added or changed tests are usually the best evidence of intent: their setup is the scenario and their assertions are the outcome. Sort what you find into the categories below, which are for your analysis, not headings in the output:
- Changed: an existing scenario with a different outcome. Note both sides: they become the Before and After of a row, and let the reviewer judge whether the old behavior was relied on.
- New: a scenario that wasn't handled or possible before.
- Removed: something that no longer happens or is no longer possible.
- Unchanged: something a reviewer would reasonably expect to change but doesn't (defaults, existing configs, other platforms, payload formats). This is what lets a reviewer stop worrying about a whole area, so only include the ones a reviewer would actually ask about.
- Check each claim. Every claim should be backed by code or a test you read. For docs and skills, that includes what they say about the repo (paths, commands, files): a wrong one is a likely bug. When a behavior depends on something you can't see (runtime config, another repository, the backend), read more, or leave it out of the block and list it in the notes, rather than presenting a guess as a fact. Drop anything that restates the code without saying what it changes for anyone. If you notice a likely bug or an unhandled edge case, keep it for the notes (see "Output"): the block describes what the code does, not what it should do.
- Write the block in the format below.
Output
Return a Markdown block as raw text (not in a code fence), ready to paste under "What does this PR do?" after the technical summary. The placeholders show the shape, not required wording:
**Functional changes**
| Before | After |
| --- | --- |
| <Scenario>: <old outcome> | <New outcome> |
| <Something that used to happen> | <It no longer happens> |
| — | <Scenario that is now handled or possible> |
Unchanged: <area a reviewer might worry about>.What makes a good block:
- Show before and after. Most changes modify something that already exists, and seeing the old and new behavior side by side is what lets a reviewer judge whether the change is right, so lead with the table. Start the Before cell with the scenario in a few words (e.g. "
HOST_ROOTmounted: …"), so that each row reads on its own; a short After cell is fine. - Don't invent a before. For a scenario that wasn't handled or possible, put
—in Before. When nothing existed before at all (a new check, command, or skill), skip the table and list as bullets what it enables and its notable effects, not each of its steps. - One scenario per row, seen from outside. Table cells can't hold line breaks, so keep each cell to a short sentence. Name the affected audience when it isn't obvious (e.g. "In
security-agent status, …"). Config keys, CLI flags, metric and tag names, labels, files, and commands are fine to name. Internal function and type names usually aren't: a cell that needs one is probably describing the implementation. Leave out how you verified the claim; reviewers have the diff for that. - Most important first. Aim for at most 8 rows; one is fine for a small change. If you need more, the PR probably does several things; say so rather than listing everything.
- Unchanged goes last, after the table or bullets, as one or two short lines: they only qualify the changes.
- Group distinct concerns. When a change affects separate areas (e.g. behavior and security, or two components), give each its own bold label and table, like
**Security changes**, instead of one long table. - Plain tone, like the rest of the description: no "This PR introduces…", no adjectives selling the change.
- No functional change? Return one line instead of a table:
No functional change: <what was restructured>; <what shows the behavior is preserved>.For a refactor, that is the main thing a reviewer needs to know.
After the block, add short notes for the user, outside the block and only when there is something to say: claims you couldn't verify and what would confirm them, likely bugs or edge cases you noticed, and changed behavior that no test covers. They don't go in the PR description as is, but the user may want to act on them before opening the PR.
Examples
CI workflow change, reshaped from #58985. Its technical summary was "Merges the three PR labeling workflows into one, and moves the community PR Slack notification to its own workflow." The functional block then says what that changes for PR authors and maintainers:
**Functional changes**
| Before | After |
| --- | --- |
| Some PRs never got `internal` or `community`, e.g. PRs with merge conflicts, for which GitHub skips `pull_request` workflows | Every PR gets `internal` (branch in this repo) or `community` (fork), whatever its target branch |
| Team labels of internal PRs came from the PR's own CODEOWNERS | Team labels come from `main`'s CODEOWNERS for every PR |
| The community Slack notification was sent only when a fork PR was opened | It is sent whenever `community` is added, by the labeler or by hand |
| The stale bot's closing comment said 15 days | It says 30 days |
Unchanged: the stale bot's selection rules.
**Security changes**
| Before | After |
| --- | --- |
| Internal PRs ran their own `tasks/` code with the labeling token | No code from the PR runs with the labeling token |Workflow file names, job names, and the YAML restructuring are absent: the summary sentence and the diff already cover them.
Agent change (hypothetical). A description of the implementation:
- Add a `handleTruncation` method to the tailer and call it from `readForever`.The same change, described functionally:
**Functional changes**
| Before | After |
| --- | --- |
| When a tailed file was truncated in place (copytruncate rotation), the Agent waited for it to grow past the previous offset, losing the lines in between | The Agent resumes from the start of the truncated file |
Unchanged: files rotated by rename, and `logs_config` defaults.Nothing existed before (hypothetical new check), so bullets instead of a table:
**Functional changes**
- The new `foo` check, disabled by default, reports `foo.connections.active` and `foo.errors` every 15 seconds once configured.
- `agent status` lists it under Collector like other checks.Refactor:
No functional change: config parsing for the check moves into its own package; the existing parsing unit tests pass unmodified.Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

