Generator / Templates / Search service
AGENTS.md for Search service
Elasticsearch backed search with a primary database. This AGENTS.md template combines 105 rules from 11 packs and runs to 139 lines.
Open this template in the AGENTS.md generatorWhat is inside
- Agent behavior 18 rules
- Logging 8 rules
- Testing 12 rules
- Git and pull requests 12 rules
- Security 14 rules
- Workflow and tooling 12 rules
- Verification and CI feedback 5 rules
- API design 8 rules
- PostgreSQL and SQL 7 rules
- Elasticsearch and OpenSearch 5 rules
- Flyway and Liquibase 4 rules
The generated AGENTS.md
This is the file the generator produces for the Search service preset, before you add your project name and commands.
# AGENTS.md
## Agent behavior
- For changes touching more than three files, outline the plan and wait for confirmation before editing.
- Ask a clarifying question when requirements are ambiguous instead of guessing.
- Keep diffs small and focused on the request; do not refactor unrelated code.
- Run the relevant tests, linter and type checker before reporting a task as done, and report failures honestly.
- Never delete, skip or loosen a failing test to make it pass; fix the cause.
- Do not add new dependencies without explicit approval; prefer the standard library and existing packages.
- Do not edit generated or vendored files; change the source and regenerate.
- Never read, print or commit secrets, .env files or credentials.
- Read the relevant code and tests before proposing a change; do not edit files you have not read.
- Fix the root cause rather than suppressing the symptom with a workaround or silenced warning.
- Do not add lint or type suppressions to get a clean run; fix the underlying issue.
- Report failing tests, skipped steps and unverified claims plainly; never claim success without evidence.
- Verify library APIs in the installed version or its docs before using them; do not invent functions.
- Do not change public behavior, file formats or APIs unless the task asks for it.
- Never hardcode values or special-case inputs to satisfy a test.
- If an approach fails twice, stop and ask instead of trying increasingly invasive workarounds.
- Before editing a directory, read the nearest AGENTS.md and follow it over the root file where they differ.
- Preserve unrelated working tree changes. Never revert or rewrite edits you did not make.
## Logging
- Emit logs as structured JSON, one object per line, with timestamp, level, message and context fields.
- Use levels consistently: error for failures needing action, warn for recoverable problems, info for lifecycle events, debug for diagnostics.
- Never log secrets, tokens, passwords or personal data; redact before logging.
- Remove debug prints and console.log calls before finishing; use the project logger.
- Log errors once, at the boundary that handles them, with enough context to reproduce.
- Log timestamps in UTC using ISO 8601.
- Keep log messages static and put variable data in structured fields.
- Do not log inside tight loops or at info level for every request detail.
## Testing
- Add or update tests for every behavior change and bug fix.
- For bug fixes, write a failing test that reproduces the bug before fixing it.
- Prefer many fast unit tests, fewer integration tests and a small number of end-to-end tests.
- Mock only external boundaries (network, clock, filesystem); use real collaborators otherwise.
- Keep tests deterministic: no real time, randomness or network without control.
- Keep tests independent; no shared mutable state or required execution order.
- Structure tests as arrange, act, assert with one behavior per test.
- Build test data with small factories instead of large shared fixtures.
- Treat a flaky test as a bug: find the cause instead of adding retries or sleeps.
- Use snapshot tests only for small stable outputs and review snapshot diffs carefully.
- Test public behavior rather than private functions or implementation details.
- Make assertions specific enough that the test fails if the behavior breaks.
## Git and pull requests
- Write commit messages in Conventional Commits format (feat:, fix:, docs:, refactor:, test:, chore:) and mark breaking changes with ! or a BREAKING CHANGE footer.
- Keep pull requests small and focused on one change.
- Write commit subjects in the imperative mood, 72 characters or fewer.
- Never force-push to shared branches and never rewrite published history.
- Run lint, type check and tests before committing.
- Never commit secrets, build output or large binaries.
- Describe motivation, approach and testing in the pull request description.
- Make each commit one logical change that builds and passes tests.
- Do not amend or rebase commits that are already pushed to a shared branch.
- Add build output, local env files and editor files to .gitignore instead of committing them.
- Open pull requests only when CI is green and the diff is self-reviewed.
- Never bypass commit hooks or signing with --no-verify unless explicitly instructed.
## Security
- Load secrets from environment variables or a secret manager; never hardcode them.
- Use parameterized queries and safe APIs; never build SQL, shell commands or HTML by string concatenation with user input.
- Enforce authentication and authorization on the server for every protected operation.
- Pin dependency versions, commit lockfiles and review new packages before adding them.
- Grant the minimum permissions needed for tokens, service accounts and containers.
- Use well-reviewed cryptographic libraries; never invent your own algorithms or store plain passwords.
- Encode output for its context and avoid injecting raw HTML; sanitize rich text with a vetted library.
- Protect state-changing browser requests with CSRF tokens or SameSite cookies.
- Configure CORS with explicit origins; never reflect arbitrary origins with credentials.
- Use HttpOnly, Secure, SameSite cookies and rotate session identifiers on login.
- Validate and allow-list URLs before fetching user-supplied addresses to prevent SSRF.
- Hash passwords with Argon2id, or scrypt or bcrypt where it is unavailable, with a unique salt; never use fast hashes such as SHA-256.
- Run secret scanning in CI and rotate any credential that has been exposed.
- Validate untrusted input against a schema. Never run eval, exec or unpickling on it.
## Workflow and tooling
- Run tools through the project scripts (npm run, make, task) instead of invoking underlying binaries directly, so flags and environments match CI.
- Run the single aggregate check command (for example pre-commit or a lint script) before finishing; fix every failure and re-run until it passes.
- Run the specific test files related to your change first, and run the full suite only before handing off.
- Before editing a directory, read the README and any nested AGENTS.md that applies to it.
- Put throwaway scripts and experiment output in a gitignored scratch directory and delete them when done.
- After switching branches or pulling dependency changes, reinstall and rebuild before running tests.
- When CI fails, find the exact failing job and command, reproduce it locally, then fix the cause instead of re-running blindly.
- Stop any dev servers or watchers you started once you are done.
- Ask before running destructive or irreversible commands such as dropping databases, deleting branches, rm -rf or force operations.
- Prefer existing scripts, generators and templates in the repo over writing new ad hoc tooling.
- When the repository documents skills or runbooks for a task (migrations, releases, dependency bumps), follow them instead of improvising.
- Never start long-running dev servers or watchers in the foreground. Use targeted one-shot commands.
## Verification and CI feedback
- Run the narrowest relevant test first, then widen to the package and workspace checks as confidence grows.
- Run the project formatter and linter on changed files before committing, using the repo scripts or hooks.
- For a bug fix, reproduce the failure first, then show the regression test failing without the fix and passing with it.
- Report a task as done only after running the checks that prove it. If you could not run them, say so.
- Before finishing, re-read the full diff as a reviewer with no knowledge of this session and fix what would confuse them.
## API design
- Model APIs around plural nouns (/orders/{id}) and use HTTP methods for actions instead of verbs in paths.
- Return accurate status codes: 2xx for success, 4xx for caller mistakes, 5xx for server faults.
- Return errors in one consistent shape with a machine-readable code, a human message and a request ID.
- Never change a published API incompatibly; add a new version or a new field instead.
- Paginate list endpoints with cursors or limit and offset, and bound the maximum page size.
- Validate requests and responses against the declared schema and reject unknown fields where appropriate.
- Use one casing for JSON fields across the API and ISO 8601 UTC timestamps.
- Do not expose database IDs, stack traces or internal error text through the API.
## PostgreSQL and SQL conventions
- Change the schema only through versioned migrations that can run on production data.
- Index foreign keys and frequently filtered columns, and check query plans with EXPLAIN.
- Enforce NOT NULL, UNIQUE, CHECK and foreign key constraints in the schema.
- Wrap multi-statement changes in transactions and keep them short.
- Use timestamptz for time values and store them in UTC.
- Create indexes on large tables with CREATE INDEX CONCURRENTLY.
- Use a connection pool and size it to the database limits.
## Elasticsearch and OpenSearch conventions
- Define explicit mappings and choose keyword or text deliberately instead of relying on dynamic mapping.
- Treat the search index as derived data that can be rebuilt from the primary store.
- Paginate beyond 10,000 hits with search_after, using a point in time for stable order, instead of large from and size values.
- Query through index aliases so you can reindex and swap without downtime.
- Index in batches with the bulk API and handle per-item failures.
## Flyway and Liquibase conventions
- Never edit a migration that has been applied anywhere; add a new migration instead.
- Use ordered version numbers and descriptive names, and keep one logical change per migration.
- Write migrations so the previous application version still works, and drop old columns in a later release.
- Run migrations against a production-like copy in CI before releasing.
How to use it
- Save the text as
AGENTS.mdin your repository root, or export it as CLAUDE.md, a Cursor rule or Copilot instructions in the generator. - Add your install, dev, build, test and lint commands. Commands are the most useful lines in the file.
- Delete rules that do not match your project. Shorter files are followed more reliably.
- For a monorepo, add a nested file per folder in the generator.
Related guides
- What is AGENTS.md?
- AGENTS.md vs CLAUDE.md
- AGENTS.md best practices
- AGENTS.md for monorepos
- Keep AGENTS.md up to date
More AGENTS.md templates
- .NET APIASP.NET Core API with xUnit.
- AI agentAutonomous agent with tools.
- AI SDK appNext.js app with the Vercel AI SDK, structured output and tools.
- Android with ComposeNative Android app.
- Angular appStandalone components and signals.
- Astro content siteStatic-first Astro site with Tailwind and SEO.
- Bazel monorepoMulti-language repo built and tested with Bazel.
- Browser extensionManifest V3 extension.