Release Lambda Layer
DataDog/datadog-lambda-js
Walks through releasing a new datadog-lambda-js Lambda layer version — the automated Commercial release (version bump, tag, GitLab sign/publish jobs, npm publish, GitHub release) and the manual…
Write or extend Datadog Agent new-e2e tests, including fakeintake coverage and the GitLab wiring that runs them; derives scope from the current diff when no target is named.
$ npx skills add DataDog/datadog-agent --skill write-e2e -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install DataDog/datadog-agent write-e2e --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/DataDog/datadog-agent.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/write-e2e .claude/skills/write-e2e && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "write-e2e" agent skill from https://github.com/DataDog/datadog-agent/tree/main/.agents/skills/write-e2e into .claude/skills/write-e2e/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-e2e", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/DataDog/datadog-agent/tree/main/.agents/skills/write-e2eType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add DataDog/datadog-agent --skill write-e2e -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install DataDog/datadog-agent write-e2e --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/DataDog/datadog-agent.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/write-e2e .agents/skills/write-e2e && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "write-e2e" agent skill from https://github.com/DataDog/datadog-agent/tree/main/.agents/skills/write-e2e into .agents/skills/write-e2e/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-e2e", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add DataDog/datadog-agent --skill write-e2e -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install DataDog/datadog-agent write-e2e --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/DataDog/datadog-agent.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/write-e2e .cursor/skills/write-e2e && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "write-e2e" agent skill from https://github.com/DataDog/datadog-agent/tree/main/.agents/skills/write-e2e into .cursor/skills/write-e2e/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-e2e", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/DataDog/datadog-agent.git --path .agents/skills/write-e2e--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add DataDog/datadog-agent --skill write-e2e -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install DataDog/datadog-agent write-e2e --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/DataDog/datadog-agent.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/write-e2e .gemini/skills/write-e2e && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "write-e2e" agent skill from https://github.com/DataDog/datadog-agent/tree/main/.agents/skills/write-e2e into .gemini/skills/write-e2e/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-e2e", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install DataDog/datadog-agent write-e2eInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add DataDog/datadog-agent --skill write-e2e -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/DataDog/datadog-agent.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/write-e2e .github/skills/write-e2e && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "write-e2e" agent skill from https://github.com/DataDog/datadog-agent/tree/main/.agents/skills/write-e2e into .github/skills/write-e2e/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-e2e", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add DataDog/datadog-agent --skill write-e2e -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install DataDog/datadog-agent write-e2e --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/DataDog/datadog-agent.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/write-e2e .opencode/skills/write-e2e && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "write-e2e" agent skill from https://github.com/DataDog/datadog-agent/tree/main/.agents/skills/write-e2e into .opencode/skills/write-e2e/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-e2e", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
write-e2eWrite or extend Datadog Agent new-e2e tests, including fakeintake coverage and the GitLab wiring that runs them; derives scope from the current diff when no target is named.
Write E2E is an agent skill from DataDog/datadog-agent, published by the product's own GitHub organization. Write or extend Datadog Agent new-e2e tests, including fakeintake coverage and the GitLab wiring that runs them; derives scope from the current diff when no target is named. Not for running tests that already exist (run-e2e, run-windows-e2e), or for judging whether a behavior belongs in E2E at all (e2e-audit).
Its SKILL.md is about 5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 6 other files, including reference files (for example `references/api-traps.md`, `references/ci-wiring.md` and `references/environments.md`).
It sits in Testing & QA, covering End-to-end testing. It works with Datadog and GitLab. The repository describes itself as: Main repository for Datadog Agent. The licence is Apache-2.0.
10 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 20eff25. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadWriteEditGlobGrepBashSkillAskUserQuestionFrom allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gitaptFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
datadoghq.comFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Write E2E loads about 5k tokens when it runs, and up to ~14k if it reads all its reference files. Until then it costs about 80 tokens; SKILL.md has 2,228 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
allowed-tools: Read, Write, Edit, Glob, Grep, Bash, Skill, AskUserQuestionAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from DataDog/datadog-agent at commit 20eff25, republished under its Apache-2.0 licence (© DataDog). 2,228 words, ~4,952 tokens.
.claude/skills/write-e2e/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.Produce a mergeable E2E test for a change: correct scope, right environment, assertions that survive real infrastructure, and CI wiring that runs it.
Ownership: the team owning test/new-e2e/tests/<area>/ is paged when the test fails, not @DataDog/agent-devx, which watches main and release branches and dispatches flakes back to that team. That is why the JOBOWNERS entry in Step 8 and the reliability gates in Step 9 are not optional.
The body carries the procedure; the references carry the lookup tables. Load a file when its trigger fires.
| File | Load when |
|---|---|
references/environments.md | The target is anything other than a Linux host, you need a non-default OS, architecture, or cloud, or you want a provisioner variant without the agent or without fakeintake. |
references/templates.md | You need a skeleton other than the Step 5 one, you are splitting a suite across operating systems, or you need to mark a known flake or collect diagnostics on failure. |
references/fakeintake.md | The test asserts on a payload — before writing the first such assertion, or when the payload you need has no client method yet. |
references/ci-wiring.md | You are adding a new test package or changing which build artifacts a test consumes. |
references/api-traps.md | You are working from an internal Confluence E2E page, an older branch, or any snippet whose form you cannot find in use under test/new-e2e/tests/. |
The repo is the source of truth; this skill is the procedure. Resolve an option by grepping its definition (grep -n '^func With' <provisioner-dir>/*.go) rather than recalling it.
Given an argument, treat it as the scope and skip to Step 1. Otherwise derive it:
git status --short
git diff --name-only $(git merge-base HEAD origin/main)Classify each changed path:
| Class | Examples | Action |
|---|---|---|
| User-visible behavior | a metric or log payload, a config key, CLI or service behavior, packaging, permissions | Candidate for coverage |
| Framework | test/e2e-framework/** | No test; validate by running an existing suite |
| Test-only, docs, CI | test/new-e2e/tests/**, docs/**, .gitlab/** | Out of scope |
Resolve the owning team and its <area> directory from .github/CODEOWNERS, then report the scope table before writing anything. When several behaviors are candidates and covering all of them would be a large change, ask which to cover. When nothing in the diff is user-visible, say so and stop — that is a correct answer, not a failure.
Invoke e2e-audit with the behavior. Continue to Step 2 only if the verdict is that E2E is justified; on any other verdict, report it, name the package where the test belongs instead, and stop. Gating before Step 2 is deliberate — reading implementations for the literals a test would assert on is wasted if the behavior belongs in a unit test.
Some areas own their own template and lifecycle rules through a directory-scoped skill: ls test/new-e2e/tests/<area>/.claude/skills/*/SKILL.md. If one exists, invoke it by its name and stop; directory-scoped skills are only offered when the working directory matches, so read the file directly when it is not in the skill list. Sibling skills named elsewhere in this file live under .agents/skills/<name>/SKILL.md.
Provisioning dominates E2E cost, and it is paid per suite. A Kubernetes suite blocks on cluster and agent readiness before its first assertion — tests/containers allows up to ten minutes for it, twenty when FIPS or cri-o makes the images slower to pull — and a new suite beside it pays that again for one assertion. A new test method inside an existing suite is close to free.
Read the implementation now for the exact observable it produces, because the assertion depends on the literal string rather than on the feature name: a metric name, log service, check name, or tag if the behavior ships a payload; a service name, file path, registry key, package name, or CLI output if it does not. Then look for existing coverage and a suite to join:
ls test/new-e2e/tests/<area>/
grep -rn "<metric-or-config-name>" test/new-e2e/tests/<area>/
grep -rln "e2e.BaseSuite\[environments.<Env>\]" test/new-e2e/tests/<area>/Widen the metric grep to all of test/new-e2e/tests/ only when the area turns up nothing.
| Situation | Do |
|---|---|
| A suite in the area already provisions the environment you need | Add a test method to it |
| Same environment, but the suite needs a different agent config | Add a sibling entry point reusing the shared suite body |
| No suite in the area, or a genuinely different environment | Create one |
Read any AGENTS.md inside the target directory first (ls test/new-e2e/tests/<area>/AGENTS.md) — several areas carry local rules that override the defaults below.
| Signal in the behavior | Environment | Provisioner |
|---|---|---|
| Host metrics, agent CLI, files, services, packaging | environments.Host | awshost.Provisioner() |
| Windows host behavior | environments.Host with a Windows OS descriptor | awshost.Provisioner() |
| Active Directory, Defender, FIPS mode, test signing, MSI install | environments.WindowsHost | winawshost.Provisioner() |
| Agent in a container, Docker integrations | environments.DockerHost | awsdocker.Provisioner() |
| DaemonSet, Cluster Agent, admission, k8s tagging | environments.Kubernetes | kind (.../aws/kubernetes/kindvm) |
| ECS or Fargate task behavior | environments.ECS | .../aws/ecs |
| Two hosts, or a host plus a separate workload | custom struct | e2e.WithPulumiProvisioner[Env] |
Ordinary Windows behavior does not need WindowsHost. Suites like tests/agent-subcommands/config_win_test.go run on plain environments.Host with ec2.WithOS(e2eos.WindowsServerDefault), which is also what the cross-OS split in references/templates.md produces — so a Windows test can extend an existing suite instead of provisioning a new one. Move up to WindowsHost only for the scenario components it carries.
Cloud: use the cloud the feature is specific to, and AWS otherwise. Windows included — the Windows CI templates depend on AWS-side MSI artifacts. Azure has a working Windows provisioner and reportedly boots Windows faster, but no test uses it and no CI job wires it, so choosing it means solving both problems yourself.
Kubernetes flavor: use kind. It provisions faster, costs less, and fails less than EKS. Reserve EKS for behavior that is specific to EKS, and expect an EKS job to run on main and nightly rather than on pull requests.
Every stock provisioner ships a fakeintake by default, and on AWS it is an ECS Fargate task you would otherwise pay for and never query. When the test asserts only on host state, drop it. Host provisioners take a ProvisionerNoFakeIntake constructor; every other provisioner spells it differently and a few cannot do it at all, so use the table in references/environments.md rather than guessing.
Reach for a custom provisioner last; test/new-e2e/codereview_guideline.md says to avoid them. Check the option surface of the stock provisioner first — most needs are already an option.
Tests live in test/new-e2e/tests/<area>/. In an existing area, copy the package clause from a file already there — the usual form is the directory with its separators removed (agent-runtimes holds package agentruntimes), but not every area follows it. Read test/new-e2e/AGENTS.md §§ "Layout", "Each entry point needs its own suite type", and "Build tags" for the rest: which <area>, how a Linux/Windows pair splits across files, and why every entry point needs its own suite type — getting that last one wrong silently puts two parallel suites on one stack. references/templates.md § "Splitting one suite across operating systems" has the code for the split.
Fixtures: a YAML snippet of ten lines or fewer goes inline as a const; anything longer, and any script, goes in fixtures/ loaded with //go:embed (which needs _ "embed" in the import block).
// Unless explicitly stated otherwise all files in this repository are licensed
// under the Apache License Version 2.0.
// This product includes software developed at Datadog (https://www.datadoghq.com/).
// Copyright 2016-present Datadog, Inc.
// Package myarea contains e2e tests for <feature>.
package myarea
import (
_ "embed"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/DataDog/datadog-agent/test/e2e-framework/components/datadog/agentparams"
e2eos "github.com/DataDog/datadog-agent/test/e2e-framework/components/os"
"github.com/DataDog/datadog-agent/test/e2e-framework/scenarios/aws/ec2"
"github.com/DataDog/datadog-agent/test/e2e-framework/testing/e2e"
"github.com/DataDog/datadog-agent/test/e2e-framework/testing/environments"
awshost "github.com/DataDog/datadog-agent/test/e2e-framework/testing/provisioners/aws/host"
)
//go:embed fixtures/myfeature.yaml
var myFeatureConfig string
type myFeatureSuite struct {
e2e.BaseSuite[environments.Host]
}
func TestMyFeature(t *testing.T) {
t.Parallel()
e2e.Run(t, &myFeatureSuite{},
e2e.WithProvisioner(awshost.Provisioner(
// AWS agent options nest inside WithRunOptions. The flat
// awshost.WithAgentOptions(...) reads naturally and is what
// Azure and GCP use, but on AWS it does not exist.
awshost.WithRunOptions(
ec2.WithEC2InstanceOptions(ec2.WithOS(e2eos.Ubuntu2204)),
ec2.WithAgentOptions(
agentparams.WithIntegration("myfeature.d", myFeatureConfig),
),
),
)),
)
}
func (s *myFeatureSuite) TestMetricReachesIntake() {
s.EventuallyWithT(func(c *assert.CollectT) {
metrics, err := s.Env().FakeIntake.Client().FilterMetrics("myfeature.points")
require.NoError(c, err)
assert.NotEmpty(c, metrics, "no myfeature.points received yet")
}, 2*time.Minute, 10*time.Second)
}The common agentparams options are WithAgentConfig, WithIntegration, WithLogs, WithFile, WithTags, and WithHostname; references/environments.md has the rest and the container equivalents.
Invariants, each with the reason it exists:
e2e.BaseSuite[Env] and start through e2e.Run — that is what builds s.Env() and registers teardown.t.Parallel() first in the entry point so suites overlap instead of serializing their provisioning.s.T().Run(...) subtests when you genuinely need sequence.SetupSuite, BeforeTest, or AfterTest, call the embedded method first. Do not add defer s.CleanupOnSetupFailure() — BaseSuite already registers a t.Cleanup hook for it, and calling it from a defer consumes the panic so testify reports the recovered value with no stack, costing you the file and line of the failure. Older suites still carry the defer; leave them alone rather than copying them.E2E_DEV_MODE=true is a local-only escape hatch. Write large dumps to s.SessionOutputDir() as an artifact rather than into the job log.Decide first what the behavior is observable as. Most suites in tree assert on host state — services, packaging, permissions, CLI output, resolved configuration — reached through Env().RemoteHost. Payload assertions through fakeintake are the minority; reach for them when the behavior is the payload.
Either way, anything that takes time to settle is asserted inside s.EventuallyWithT(func(c *assert.CollectT) {...}, timeout, interval) as in the Step 5 skeleton, and three rules apply to every such poll: require on anything later code dereferences, so the iteration aborts instead of accumulating misleading errors from a nil result; MustExecuteOn(c, ...) rather than MustExecute, so a transient SSH error retries; and never time.Sleep or a ticker, which is either a flake or wasted minutes.
Asserting on payloads — load references/fakeintake.md first. It has the payload-to-client-method table, the matcher catalog, the timeout budgets, how to prove a negative, and flush ordering around a restart.
Not asserting on payloads — drop the intake. On AWS it is an ECS Fargate task, so provisioning one the test never queries is pure cost against the budget Step 2 is trying to protect. How to drop it depends on the provisioner, as Step 3 notes.
Read test/new-e2e/codereview_guideline.md now — it is the authoritative reliability contract, and three of its sections shape code you are about to type:
image: or FROM resolves to DockerHub and will start failing.latest, and apt install <pkg> silently tracks whatever the mirror carries today.RemoteHost.HostArtifactClient, and remote Kubernetes manifests are vendored locally with their image references rewritten, because a remote manifest pulls both itself and its images at runtime.Needed when you created a new package, and whenever a test starts consuming a build artifact its job does not already pull — adding a container-based test to a package whose job extends a deb-only template leaves it waiting on an image nobody built. A test in a package no job references never runs at all. Load references/ci-wiring.md for the rule template, the artifact-dependency table, the Windows matrix convention, and which branches a job ends up running on. Two things bite regardless of which template you extend: overriding needs replaces the template's list rather than adding to it, so re-reference the template's own entry; and .gitlab/JOBOWNERS is what routes a failure notification, while .github/CODEOWNERS only routes review.
Needs dda, pulumi, ~/.test_infra_config.yaml (created by dda inv e2e.setup), sandbox AWS credentials, and AppGate connected; run-e2e covers setup failures. Run the gates in order and stop at the first failure.
| Gate | Command | Catches |
|---|---|---|
| G1 | dda inv linter.go --module=test/new-e2e --targets=./tests/<area> | Compile errors, including nonexistent provisioner options |
| G2 | grep -rn -e 'docker\.io' -e 'apt-get install' -e 'apt install' -e 'yum install' -e 'curl http' test/new-e2e/tests/<area>/ | External dependencies and unpinned installs |
| G3 | grep -rn 'TARGETS:.*<area>' .gitlab/test/e2e/*.yml .gitlab/windows/test/e2e/*.yml .gitlab/windows/test/e2e_install_packages/*.yml and the JOBOWNERS entry | A test that never runs, or fails silently to no owner |
| G4 | The dev-mode session below | Provisioning, timing, real Agent behavior, hidden inter-test dependencies, missing cleanup |
| G5 | Compare G4's wall time to 15 min (PR-gated) and 30–40 min (main/nightly) | A suite that will slow every pipeline |
G2 flags candidates for review, not violations. A parameterised registry such as ${DD_REGISTRY:-docker.io} resolves to the cache in CI and is fine; a hardcoded docker.io/... or a package install on the VM is not. G3 is a grep, so it comes before G4 — there is no point proving a test works before knowing whether anything runs it.
G4 is the only gate that provisions real cloud infrastructure, and it takes 10–40 minutes. Dev mode keeps the stack alive between runs, so all three live checks share one provision:
# 1. One subtest on fresh infrastructure — proves it does not depend on a sibling.
E2E_DEV_MODE=true dda inv new-e2e-tests.run --targets=./tests/<area>/... --run '^TestX$/^SubB$'
# 2. The whole suite, reusing that stack.
E2E_DEV_MODE=true dda inv new-e2e-tests.run --targets=./tests/<area>/...
# 3. Again, without dev mode — a second green run proves each test left the
# environment as it found it, and the suite destroys its own stack on the way out.
dda inv new-e2e-tests.run --targets=./tests/<area>/...Dropping E2E_DEV_MODE on the last run is what releases the infrastructure, and it releases only this suite's stack. Reach for dda inv new-e2e-tests.clean -s only as deliberate housekeeping: it enumerates every local e2elocal stack and destroys all of them, including ones belonging to work you are not touching.
Show these commands and get agreement before running any of them. Compilation alone is not evidence the test works, so treat skipping G4 as a gap to report rather than a shortcut.
Scope behaviors covered, behaviors dropped and why, e2e-audit verdict
Files created and modified
Environment env struct, cloud, OS, and one line on why that combination
Assertions observable -> how it is checked -> timeout, one row each
Local run command, result, wall time
CI the rule/job/JOBOWNERS diffs, or "none needed" and why
Follow-ups flake exposure, budget headroom, QA label, PR-branch coverageFilled in, for a diff that added a disk.free metric:
Scope Covers disk.free reaching the intake. Dropped the config-parsing
change — e2e-audit called it a unit test. Verdict: E2E justified.
Files test/new-e2e/tests/agent-runtimes/disk_free_test.go (new)
Environment environments.Host, AWS, Ubuntu2204 — host metric, no container
or cluster behavior involved.
Assertions disk.free -> FilterMetrics + WithMetricValueHigherThan(0) -> 2m/10s
Local run dda inv new-e2e-tests.run --targets=./tests/agent-runtimes/...
--run '^TestDiskFree$' — passed, 11m4s
CI None needed. new-e2e-agent-runtimes already covers ./tests/
agent-runtimes and pulls agent_deb-x64-a7.
Follow-ups Test-only change, so qa/no-code-change. Runs on PR branches
via .on_arun_or_e2e_changes. 11m of the 15m budget used.Recommend a QA label, and note that the checks accept exactly one. A pull request that only adds tests or CI wiring takes qa/no-code-change, whichever branches its job runs on. qa/rc-required is for changes that can only be validated on a release candidate — a workload that cannot be emulated, or behavior observable only during RC deployment — so reach for it based on what the change needs, not on whether the new job happens to skip pull-request branches. doc/guidelines/contributing.md has the full list.
When a repository document turns out to be wrong, correct it in the same change — the root AGENTS.md asks for exactly that.
© DataDog, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 5 other files (references) in .agents/skills/write-e2e of DataDog/datadog-agent.
Open the folder on GitHubat commit 20eff25
Write E2E next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Write E2E this skillDataDog/datadog-agent | 3.8k | — | ~5k | Automated safety check: Notes | Apache-2.0 | |
| Release Lambda LayerDataDog/datadog-lambda-js | 126 | — | ~1.8k | Automated safety check: Pass | Apache-2.0 | |
| Promotion Branches E2E Testhardisgroupcom/sfdx-hardis | 401 | — | ~5.5k | Automated safety check: Notes | AGPL-3.0 | |
| Testing Test Automation Engineerchendongqi/OPB-Skills | 125 | — | ~3.1k | Automated safety check: Pass | None | |
| Web Application Testinganthropics/skills | 180k | 51 repos | ~966 | Automated safety check: Pass | Apache-2.0 | |
| OpenHarness End-to-End EvalsHKUDS/OpenHarness | 16k | 1 repos | ~2.1k | Automated safety check: Notes | MIT |
DataDog/datadog-lambda-js
Walks through releasing a new datadog-lambda-js Lambda layer version — the automated Commercial release (version bump, tag, GitLab sign/publish jobs, npm publish, GitHub release) and the manual…
hardisgroupcom/sfdx-hardis
Runs a full end-to-end test of sfdx-hardis promotion branches and backpromote against real Salesforce orgs and a throwaway repository, then writes a report.
chendongqi/OPB-Skills
自动化测试助手 - 专业的测试自动化设计与实现专家。适用场景: (1) 自动化测试框架选型与搭建(Selenium/Cypress/Playwright/Appium) (2) 自动化测试脚本编写(Web/API/Mobile) (3) 测试数据管理与Mock设计 (4) CI/CD测试集成(Jenkins/GitLab CI/GitHub Actions) (5) Page…
anthropics/skills
Tests local web applications with Python Playwright scripts, checking frontend behavior, capturing screenshots and reading browser console logs.
HKUDS/OpenHarness
Validates OpenHarness features by running real multi-turn agent loops with live LLM calls against an unfamiliar codebase, checking actual tool execution.
github/gh-aw
Drives a real browser from the command line with playwright-cli to open pages, interact, mock requests, save state and work with Playwright tests.
DataDog/datadog-agent
Classify a failed CI as either caused by an active incident, flakiness, or a true code regression.
DataDog/datadog-agent
Run a structured discovery session to build an Allium specification through conversation.
DataDog/datadog-agent
Monitor the current PR's GitLab pipeline to completion, then report success, auto-fix, or investigate a failure.
DataDog/datadog-agent
A skill your agent uses when an engineer or manager asks to recap, summarize, or post an update on a Jira Epic — a progress update for an in-progress Epic (how far along it is, what's shipped so…
DataDog/datadog-agent
Explains a lading.yaml config file from the regression test suite, using the lading Rust source as ground truth for field meanings and defaults.
DataDog/datadog-agent
Extract an Allium specification from an existing codebase. An agent skill from DataDog/datadog-agent.
Categories
Write or extend Datadog Agent new-e2e tests, including fakeintake coverage and the GitLab wiring that runs them; derives scope from the current diff when no target is named. Write E2E is an agent skill from DataDog/datadog-agent, published by the product's own GitHub organization. Write or extend Datadog Agent new-e2e tests, including fakeintake coverage and the GitLab wiring that runs them; derives scope from the current diff when no target is named.
Write E2E fits situations like: tasks that involve End-to-end testing.
Run `npx skills add DataDog/datadog-agent --skill write-e2e -a claude-code`. Or copy the skill folder (.agents/skills/write-e2e in DataDog/datadog-agent) into .claude/skills/write-e2e in your project. Claude Code loads it when a task matches its description.
Run `npx skills add DataDog/datadog-agent --skill write-e2e -a codex`. Or copy the skill folder (.agents/skills/write-e2e in DataDog/datadog-agent) into .agents/skills/write-e2e in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add DataDog/datadog-agent --skill write-e2e -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/write-e2e, .gemini/skills/write-e2e, .github/skills/write-e2e and .opencode/skills/write-e2e in your project.
Going by SKILL.md and its folder, Write E2E needs the command-line tools its instructions call (git and apt). Our summary lists: Docker. Its frontmatter pre-approves these tools: Read, Write, Edit, Glob, Grep, Bash, Skill, AskUserQuestion.
SKILL.md names 1 domain. In commands or code: datadoghq.com; the agent is likely to contact it when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Write E2E is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5k tokens (SKILL.md is roughly 20k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 9.1k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Write E2E: Release Lambda Layer (DataDog/datadog-lambda-js, 126 stars), Promotion Branches E2E Test (hardisgroupcom/sfdx-hardis, 401 stars), Testing Test Automation Engineer (chendongqi/OPB-Skills, 125 stars) and Web Application Testing (anthropics/skills, 180k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
DataDog (a GitHub organization, an official publisher) maintains it in DataDog/datadog-agent, which has 3,757 GitHub stars. The repository holds 35 skills in this directory. The repository was last updated on October 8, 2026.
Source: DataDog/datadog-agent on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.