agentme 0.25.0 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/.filedist-package.yml +1 -1
  2. package/.xdrs/agentme/edrs/application/003-javascript-project-tooling.md +4 -4
  3. package/.xdrs/agentme/edrs/application/010-golang-project-tooling.md +4 -4
  4. package/.xdrs/agentme/edrs/application/014-python-project-tooling.md +10 -10
  5. package/.xdrs/agentme/edrs/application/018-ai-llm-development-standards.md +1 -1
  6. package/.xdrs/agentme/edrs/application/019-ai-agents-development-standards.md +10 -10
  7. package/.xdrs/agentme/edrs/application/021-ai-workflow-development-standards.md +10 -13
  8. package/.xdrs/agentme/edrs/application/025-ai-agent-xdrs-knowledge-layer.md +1 -1
  9. package/.xdrs/agentme/edrs/application/026-pragmatic-hexagonal-architecture.md +9 -5
  10. package/.xdrs/agentme/edrs/application/028-ai-eval-standards.md +3 -3
  11. package/.xdrs/agentme/edrs/application/029-ai-workflow-naming-conventions.md +1 -1
  12. package/.xdrs/agentme/edrs/application/030-ai-test-types-taxonomy.md +7 -5
  13. package/.xdrs/agentme/edrs/devops/005-monorepo-structure.md +27 -25
  14. package/.xdrs/agentme/edrs/devops/006-github-pipelines.md +5 -5
  15. package/.xdrs/agentme/edrs/devops/008-common-targets.md +34 -34
  16. package/.xdrs/agentme/edrs/devops/017-tool-execution-and-scripting.md +1 -1
  17. package/.xdrs/agentme/edrs/devops/027-environment-variable-configuration.md +10 -10
  18. package/.xdrs/agentme/edrs/governance/013-contributing-guide-requirements.md +35 -9
  19. package/.xdrs/agentme/edrs/observability/011-service-health-check-endpoint.md +1 -1
  20. package/.xdrs/agentme/edrs/principles/002-coding-best-practices.md +3 -3
  21. package/.xdrs/agentme/edrs/principles/004-unit-test-requirements.md +10 -8
  22. package/.xdrs/agentme/edrs/principles/007-project-quality-standards.md +25 -25
  23. package/.xdrs/agentme/edrs/principles/009-error-handling.md +1 -1
  24. package/.xdrs/agentme/edrs/principles/012-continuous-xdr-enrichment.md +27 -9
  25. package/.xdrs/agentme/edrs/principles/016-cross-language-module-structure.md +1 -1
  26. package/.xdrs/agentme/edrs/principles/022-secrets-management.md +32 -30
  27. package/.xdrs/agentme/edrs/principles/023-coding-abstraction-practices.md +4 -4
  28. package/package.json +2 -2
@@ -1,5 +1,5 @@
1
1
  sets:
2
- - package: xdrs-core@0.37.2
2
+ - package: xdrs-core@0.38.4
3
3
  # - package: git:https://github.com/flaviostutz/xdrs-core.git@main
4
4
  selector:
5
5
  files:
@@ -61,7 +61,7 @@ coverageProvider: 'v8',
61
61
  coverageDirectory: '.cache/coverage',
62
62
  ```
63
63
 
64
- Builds that miss the threshold must not be merged.
64
+ Builds that miss the threshold MUST NOT be merged.
65
65
 
66
66
  #### Project structure
67
67
 
@@ -105,7 +105,7 @@ Internal source code MUST be organized following [agentme-edr-026](026-pragmatic
105
105
 
106
106
  When a repository contains multiple JavaScript/TypeScript packages, each package MUST live in its own module folder such as `lib/my-package/` or `services/my-service/`, each with its own `Makefile`, `README.md`, `dist/`, and `.cache/`.
107
107
 
108
- All tool caches, incremental state files, and workspace-local config outputs MUST be written under `.cache/`. This applies to every tool without exception. Cache and state paths MUST be declared in the tool's own configuration file — never on the command line — so that the location is enforced regardless of how the tool is invoked:
108
+ All tool caches, incremental state files, and workspace-local config outputs MUST be written under `.cache/`. This applies to every tool without exception. Cache and state paths MUST be declared in the tool's own configuration file — MUST NOT be on the command line — so that the location is enforced regardless of how the tool is invoked:
109
109
 
110
110
  | Tool | Config file | Setting | Value |
111
111
  |------|------------|---------|-------|
@@ -114,7 +114,7 @@ All tool caches, incremental state files, and workspace-local config outputs MUS
114
114
  | **TypeScript** | `tsconfig.json` | `tsBuildInfoFile` | `.cache/tsbuildinfo` |
115
115
  | **Jest coverage** | `jest.config.js` | `coverageDirectory` | `.cache/coverage` |
116
116
 
117
- No tool MUST write cache or state files to the project root, `src/`, or any other directory outside `.cache/`. Passing cache paths as Makefile or CLI flags instead of config-file settings is not allowed.
117
+ Tools MUST NOT write cache or state files to the project root, `src/`, or any other directory outside `.cache/`. Passing cache paths as Makefile or CLI flags instead of config-file settings is not allowed.
118
118
 
119
119
  Contributors and CI MUST invoke the commands below as `make <target>`. The Makefile recipes themselves MUST call the underlying tools through `mise exec -- <tool> ...`.
120
120
 
@@ -144,7 +144,7 @@ Contributors and CI MUST invoke the commands below as `make <target>`. The Makef
144
144
 
145
145
  Each sub-folder under `examples/` is an independent package. The Makefile installs the locally built `.tgz` pack from `lib/dist/` so examples simulate real external usage.
146
146
 
147
- Examples MUST remain outside the module root and MUST consume the package through the packed artifact in `dist/`, never through `../src` imports or other direct source links.
147
+ Examples MUST remain outside the module root and MUST consume the package through the packed artifact in `dist/`. MUST NOT use `../src` imports or other direct source links.
148
148
 
149
149
  Module-specific integration tests that are not just runnable examples belong in `lib/tests_integration/` or a sibling `tests_integration/` when they cover multiple modules.
150
150
 
@@ -30,7 +30,7 @@ A predictable layout and minimal external tooling keep Go projects approachable,
30
30
  | **golangci-lint** | Linting — aggregates many linters in one fast run; configured via `.golangci.yml` |
31
31
  | **monotag** | Version tagging from git history for the `publish` target |
32
32
 
33
- All commands are run exclusively through the Makefile, never ad-hoc. The project root **MUST** define a `.mise.toml` that pins `go`, `golangci-lint`, and any other Go-related CLIs used by the project. Contributors and CI **MUST** bootstrap with `make setup` or `mise install`, then invoke routine work with `make <target>`. Each Makefile recipe **MUST** execute the underlying tool through `mise exec -- <tool> ...`, following [agentme-edr-017](../devops/017-tool-execution-and-scripting.md).
33
+ All commands MUST be run exclusively through the Makefile and MUST NOT be called ad-hoc. The project root **MUST** define a `.mise.toml` that pins `go`, `golangci-lint`, and any other Go-related CLIs used by the project. Contributors and CI **MUST** bootstrap with `make setup` or `mise install`, then invoke routine work with `make <target>`. Each Makefile recipe **MUST** execute the underlying tool through `mise exec -- <tool> ...`, following [agentme-edr-017](../devops/017-tool-execution-and-scripting.md).
34
34
  Direct installation of project-required Go CLIs with `go install ...@latest` as a repair step is **NOT** allowed unless an XDR for that repository explicitly permits it.
35
35
 
36
36
  #### Project structure
@@ -80,7 +80,7 @@ Direct installation of project-required Go CLIs with `go install ...@latest` as
80
80
  - Business logic lives in named feature packages under `app/` (e.g., `app/ownership/`, `app/changes/`). These packages are importable and testable without any CLI or adapter concerns.
81
81
  - `adapters/cli/` packages own flag parsing, output formatting, and the wiring between flags and `app/` functions. No business logic lives in adapter packages.
82
82
  - Outbound adapters live under `adapters/connectors/` with one subfolder per external resource, named descriptively (e.g., `postgres/`, `stripe-api/`, `redis-cache/`).
83
- - `shared/` must contain only infrastructure-agnostic utilities — not business rules or domain logic.
83
+ - `shared/` MUST contain only infrastructure-agnostic utilities — not business rules or domain logic.
84
84
  - Packages are flat by default; sub-packages are only introduced when a feature package itself exceeds ~400 lines or has clearly separable sub-concerns.
85
85
  - Application MAY import from Adapters when it simplifies the design (pragmatic coupling per edr-022 rule 05).
86
86
  - Consumer examples for reusable libraries belong in a sibling `examples/` folder and MUST import the public module path rather than reaching into internal source paths. Because Go libraries are not typically consumed from a local packaged artifact, local example validation may use a temporary module replacement for resolution, but the import path MUST remain the public module path.
@@ -120,7 +120,7 @@ make test
120
120
  make lint
121
121
  ```
122
122
 
123
- The Makefile recipes themselves must use `mise exec --` for the underlying tool commands.
123
+ The Makefile recipes themselves MUST use `mise exec --` for the underlying tool commands.
124
124
 
125
125
  #### Cross-platform binary distribution
126
126
 
@@ -148,7 +148,7 @@ All tool caches, incremental state files, and build outputs MUST be written unde
148
148
  | **golangci-lint cache** | `GOLANGCI_LINT_CACHE` env var | `export GOLANGCI_LINT_CACHE := $(CURDIR)/.cache/golangci-lint` |
149
149
  | **Test coverage output** | `-coverprofile` flag in `test` target | `.cache/coverage.out` |
150
150
 
151
- No tool MUST write cache or state files to the project root or any directory outside `.cache/`. Passing cache paths as per-recipe environment overrides instead of top-level Makefile exports is not allowed.
151
+ Tools MUST NOT write cache or state files to the project root or any directory outside `.cache/`. Passing cache paths as per-recipe environment overrides instead of top-level Makefile exports is not allowed.
152
152
 
153
153
  #### Linting
154
154
 
@@ -34,13 +34,13 @@ A single dependency manager, isolated package internals under `lib/`, and a stan
34
34
  | **pytest-cov** | Coverage reporting and threshold enforcement |
35
35
  | **pip-audit** | Dependency CVE audit |
36
36
 
37
- All routine commands must run through the project `Makefile`, never by calling `uv`, `ruff`, `pytest`, or `ty` directly in docs, CI, or daily development workflows.
37
+ All routine commands MUST run through the project `Makefile`. MUST NOT call `uv`, `ruff`, `pytest`, or `ty` directly in docs, CI, or daily development workflows.
38
38
 
39
39
  The repository root MUST define a `.mise.toml` that pins Python and uv. Contributors and CI MUST bootstrap with `make setup` or `mise install`, then invoke routine work with `make <target>`. Each Makefile recipe MUST execute the underlying tool through `mise exec -- <tool> ...`, following [agentme-edr-017](../devops/017-tool-execution-and-scripting.md). Using routine project CLI commands directly outside the Makefile contract is not allowed.
40
40
 
41
- The root `.venv/` is the canonical environment location for both the library and all examples. Subdirectory commands must set `UV_PROJECT_ENVIRONMENT` to the workspace root `.venv/` instead of creating nested virtual environments.
41
+ The root `.venv/` is the canonical environment location for both the library and all examples. Subdirectory commands MUST set `UV_PROJECT_ENVIRONMENT` to the workspace root `.venv/` instead of creating nested virtual environments.
42
42
 
43
- All tool caches, incremental state files, and workspace-local outputs MUST be written under `.cache/`. Cache paths MUST be declared in the tool's own configuration file — never on the command line or as Makefile CLI flags — so the location is enforced regardless of how the tool is invoked. Configure the following in `lib/pyproject.toml`:
43
+ All tool caches, incremental state files, and workspace-local outputs MUST be written under `.cache/`. Cache paths MUST be declared in the tool's own configuration file — MUST NOT be on the command line or as Makefile CLI flags — so the location is enforced regardless of how the tool is invoked. Configure the following in `lib/pyproject.toml`:
44
44
 
45
45
  | Tool | Config section | Setting | Value |
46
46
  |------|---------------|---------|-------|
@@ -50,7 +50,7 @@ All tool caches, incremental state files, and workspace-local outputs MUST be wr
50
50
  | **coverage HTML** | `[tool.coverage.html]` | `directory` | `".cache/coverage-html"` |
51
51
  | **uv** | `[tool.uv]` in `lib/pyproject.toml` | `cache-dir` | `".cache/uv"` |
52
52
 
53
- No tool MUST write cache or state files to the project root, `src/`, `tests/`, or any directory outside `.cache/`. Passing cache paths as CLI flags or Makefile recipe-level env overrides instead of `pyproject.toml` settings is not allowed.
53
+ Tools MUST NOT write cache or state files to the project root, `src/`, `tests/`, or any directory outside `.cache/`. Passing cache paths as CLI flags or Makefile recipe-level env overrides instead of `pyproject.toml` settings is not allowed.
54
54
 
55
55
  #### Project structure
56
56
 
@@ -98,7 +98,7 @@ Use the `lib/src/` layout for import safety and packaging clarity. Keep tests un
98
98
 
99
99
  Internal source code MUST be organized following [agentme-edr-026](026-pragmatic-hexagonal-architecture.md): `adapters/` (inbound and outbound I/O boundaries), `app/` (business logic), and `shared/` (infrastructure-agnostic utilities).
100
100
 
101
- Libraries and shared utilities must include an `examples/` folder and wire example execution into the root `test` flow, following [agentme-edr-007](../principles/007-project-quality-standards.md). Each example directory is its own Python project with its own `pyproject.toml`, and examples must import the library as a consumer would rather than reaching back into `lib/src/` with relative imports. Local example verification must install the wheel built into `lib/dist/`; do not use editable or path-based dependencies back to `lib/`.
101
+ Libraries and shared utilities MUST include an `examples/` folder and wire example execution into the root `test` flow, following [agentme-edr-007](../principles/007-project-quality-standards.md). Each example directory is its own Python project with its own `pyproject.toml`, and examples MUST import the library as a consumer would rather than reaching back into `lib/src/` with relative imports. Local example verification MUST install the wheel built into `lib/dist/`; do not use editable or path-based dependencies back to `lib/`.
102
102
 
103
103
  Python keeps unit tests under `lib/tests/` by default because that remains the more common and maintainable convention for typed/package-based projects than co-locating tests beside every source file. Integration tests belong in `lib/tests_integration/`, and benchmark harnesses belong in `lib/tests_benchmark/` when they are more than a single micro-benchmark helper.
104
104
 
@@ -114,7 +114,7 @@ When ty runs from `lib/`, it auto-discovers the virtual environment via the `VIR
114
114
 
115
115
  Ruff is the default formatter and linter. Do not add Black, isort, or Flake8 unless another XDR for that repository explicitly requires them.
116
116
 
117
- All Python projects must configure the following sections in `lib/pyproject.toml`. The cache-related settings are mandatory per the `.cache/` policy above:
117
+ All Python projects MUST configure the following sections in `lib/pyproject.toml`. The cache-related settings are mandatory per the `.cache/` policy above:
118
118
 
119
119
  ```toml
120
120
  [tool.pytest.ini_options]
@@ -155,11 +155,11 @@ ignore = ["ANN002", "ANN003", "ANN401", "D100", "D101", "D102", "D103", "D104",
155
155
  ignore-overlong-task-comments = true
156
156
  ```
157
157
 
158
- Adjust `target-version` to match the project's minimum supported Python version. The `cache-dir` keeps Ruff's cache under `.cache/ruff` alongside other tool caches. The `src` list must include every directory that contains importable Python code. The `select` list enables a broad set of rules covering style, correctness, performance, security, and documentation. The `ignore` list suppresses rules that are either too noisy or conflict with the chosen docstring style.
158
+ Adjust `target-version` to match the project's minimum supported Python version. The `cache-dir` keeps Ruff's cache under `.cache/ruff` alongside other tool caches. The `src` list MUST include every directory that contains importable Python code. The `select` list enables a broad set of rules covering style, correctness, performance, security, and documentation. The `ignore` list suppresses rules that are either too noisy or conflict with the chosen docstring style.
159
159
 
160
- ty must run on every lint pass. The default rule set is the minimum baseline; projects may enable stricter rules as the codebase matures.
160
+ ty MUST run on every lint pass. The default rule set is the minimum baseline; projects may enable stricter rules as the codebase matures.
161
161
 
162
- Pytest coverage must fail below 80% line and branch coverage, following [agentme-edr-004](../principles/004-unit-test-requirements.md).
162
+ Pytest coverage MUST fail below 80% line and branch coverage, following [agentme-edr-004](../principles/004-unit-test-requirements.md).
163
163
 
164
164
  #### Makefile targets
165
165
 
@@ -198,7 +198,7 @@ The root `Makefile` is the only contract for CI and contributors. It delegates l
198
198
  | `dev` | Same as `run`, optionally with repository-specific dev defaults |
199
199
  | `publish` | `mise exec -- uv publish --project .` after versioning and packaging are complete |
200
200
 
201
- The root `Makefile` must remain the only contract for CI and contributors, in line with [agentme-edr-008](../devops/008-common-targets.md).
201
+ The root `Makefile` MUST remain the only contract for CI and contributors, in line with [agentme-edr-008](../devops/008-common-targets.md).
202
202
 
203
203
  ## Considered Options
204
204
 
@@ -51,7 +51,7 @@ Every component that interacts with an LLM MUST be classified as exactly one of
51
51
  All direct LLM calls MUST use **LangChain** via the `langchain` packages.
52
52
 
53
53
  - Use `langchain-openai` as the provider integration layer. It supports both OpenAI and Azure OpenAI.
54
- - **Always configure LLM providers using explicit library attributes** such as `api_key`, `base_url`, `model`, `api_version`, etc. Never rely on environment variables for LLM configuration.
54
+ - LLM providers MUST be configured using explicit library attributes such as `api_key`, `base_url`, `model`, `api_version`, etc. MUST NOT rely on environment variables for LLM configuration.
55
55
  - Configuration MUST be passed via constructor parameters or configuration objects, making dependencies explicit and testable.
56
56
 
57
57
  **Example of explicit configuration:**
@@ -46,11 +46,11 @@ When an agent requires a **local sandbox** — an isolated environment where the
46
46
  Use deepagents sandbox whenever ANY of the following is true:
47
47
  - The agent needs to execute shell commands or scripts in a controlled environment.
48
48
  - The agent needs to list, read, or search files across multiple directories at runtime.
49
- - The agent operates on user-supplied or generated file trees that must not escape a sandboxed boundary.
49
+ - The agent operates on user-supplied or generated file trees that MUST NOT escape a sandboxed boundary.
50
50
 
51
51
  **Integration requirements:**
52
52
 
53
- - The sandbox MUST always be initialized with `virtual_mode=True` to prevent the agent from reading or writing files outside the mounted workspace. Omitting this flag allows the agent unrestricted host filesystem access, which is a security violation.
53
+ - The sandbox MUST be initialized with `virtual_mode=True` to prevent the agent from reading or writing files outside the mounted workspace. Omitting this flag allows the agent unrestricted host filesystem access, which is a security violation.
54
54
  - Initialize the sandbox at the start of the agent run and shut it down in the same `try/finally` block.
55
55
  - Pass the sandbox handle into the agent's state so all tool calls share the same sandbox instance.
56
56
  - If the host-side code needs to pass files into the sandbox (e.g. generated config or input data), create a temporary directory with `tempfile.mkdtemp()`, write the files there, and mount it into the sandbox. Clean it up in the `finally` block.
@@ -108,11 +108,11 @@ When agents are used as nodes in workflows, the node name MUST use the `_agent`
108
108
 
109
109
  #### 05-agent-composition
110
110
 
111
- When multiple agents are needed:
111
+ When multiple agents are needed, one of these composition patterns MUST be chosen:
112
112
 
113
113
  - **Single agent with multiple tools:** Use when tools share a common goal and context (e.g., a code analysis agent with `read_file`, `search_code`, and `analyze_pattern` tools).
114
114
  - **Multiple agents as workflow nodes:** Use when agents have distinct responsibilities and outputs that feed into each other. Orchestrate them using LangGraph per [agentme-edr-021](021-ai-workflow-development-standards.md).
115
- - Do NOT create nested agent loops (agent calling agent autonomously). Use workflows for multi-agent orchestration.
115
+ - Nested agent loops (agent calling agent autonomously) MUST NOT be created. Use workflows for multi-agent orchestration.
116
116
 
117
117
  **Decision criteria:**
118
118
 
@@ -120,11 +120,11 @@ When multiple agents are needed:
120
120
  |---|---|
121
121
  | Single agent + tools | All tools serve the same goal; agent completes in one session |
122
122
  | Multiple workflow-orchestrated agents | Each agent has a distinct goal; outputs flow between agents; deterministic sequencing needed |
123
- | Nested agents (FORBIDDEN) | Never always use workflow orchestration instead |
123
+ | Nested agents (FORBIDDEN) | MUST NOT use nested agents; MUST use workflow orchestration instead |
124
124
 
125
125
  #### 06-agent-system-prompt-structure
126
126
 
127
- Every agent system prompt MUST follow this XML-section template. Sections must appear in this order. Required sections must always be present; optional sections may be omitted when they genuinely do not apply; never reorder them.
127
+ Every agent system prompt MUST follow this XML-section template. Sections MUST appear in this order. Required sections MUST be present; optional sections may be omitted when they genuinely do not apply; MUST NOT be reordered.
128
128
 
129
129
  ```xml
130
130
  [specific task description to the agent. if not defined use the default prompt "Execute your objective taking into consideration the inputs provided and all the sections described below"]
@@ -189,7 +189,7 @@ The current OS is: [operating system name].
189
189
  |---|---|---|
190
190
  | `<SYSTEM_CONTEXT>` | Optional | Runtime environment context injected at invocation time (e.g., current date in YYYY-MM-DD, OS). Include whenever the agent may need temporal or environment awareness. Time MUST NOT be included — it changes every second and breaks prompt caching. |
191
191
  | `<OBJECTIVE>` | Required | One or two sentences summarising the agent's main deliverable. |
192
- | `<ROLE>` | Required | Agent persona and expertise. When inside a workflow, MUST reference its node name from `<WORKFLOW_CONTEXT>`. |
192
+ | `<AGENT_ROLE>` | Required | Agent persona and expertise. When inside a workflow, MUST reference its node name from `<WORKFLOW_CONTEXT>`. |
193
193
  | `<INPUT>` | Required | List ALL inputs. For workflow agents: workflow-level inputs first, then agent-specific inputs. |
194
194
  | `<STEPS>` | Optional | Include when the agent follows a non-trivial numbered sequence of steps. |
195
195
  | `<TOOL_GUIDANCE>` | Optional | Include when tool use order or conditions need explicit direction. |
@@ -200,7 +200,7 @@ The current OS is: [operating system name].
200
200
  **Formatting rules:**
201
201
 
202
202
  - MUST use XML tags to delimit every section.
203
- - The content of each section MUST start on the line immediately after the opening tag — never inline with it.
203
+ - The content of each section MUST start on the line immediately after the opening tag — MUST NOT be inline with it.
204
204
  - Each closing tag MUST be followed by a blank line before the next opening tag, so sections are visually separated.
205
205
 
206
206
  ```xml
@@ -208,9 +208,9 @@ The current OS is: [operating system name].
208
208
  Produce a plan for the current batch of files.
209
209
  </OBJECTIVE>
210
210
 
211
- <ROLE>
211
+ <AGENT_ROLE>
212
212
  You are the batch_plan_agent.
213
- </ROLE>
213
+ </AGENT_ROLE>
214
214
  ```
215
215
 
216
216
  #### 07-agent-output-format
@@ -37,11 +37,11 @@ Use **MLflow** for all workflow observability and evaluation:
37
37
 
38
38
  #### 04-dataset-driven-accuracy-measurement
39
39
 
40
- Eval dataset and implementation requirements are defined in [agentme-edr-028](028-ai-eval-standards.md). Testing requirements (when evals are required, release gates) are defined in [agentme-edr-007](../principles/007-project-quality-standards.md) rule `09-ai-project-testing-requirements`.
40
+ Projects MUST follow the eval dataset and implementation requirements defined in [agentme-edr-028](028-ai-eval-standards.md). Testing requirements (when evals are required, release gates) are defined in [agentme-edr-007](../principles/007-project-quality-standards.md) rule `09-ai-project-testing-requirements`.
41
41
 
42
42
  #### 05-flow-documentation
43
43
 
44
- Each workflow MUST be documented as a **Mermaid graph** in a `README.md`. The diagram must match the LangGraph `StateGraph` definition:
44
+ Each workflow MUST be documented as a **Mermaid graph** in a `README.md`. The diagram MUST match the LangGraph `StateGraph` definition:
45
45
 
46
46
  - Use `graph TD` or `graph LR` direction.
47
47
  - Label each node with its Python function name.
@@ -101,20 +101,17 @@ lib/src/<package_name>/
101
101
 
102
102
  #### 08-workflow-evals
103
103
 
104
- Eval folder structure and script requirements are defined in [agentme-edr-028](028-ai-eval-standards.md).
104
+ Projects MUST follow the eval folder structure and script requirements defined in [agentme-edr-028](028-ai-eval-standards.md).
105
105
 
106
106
  #### 09-node-naming-conventions
107
107
 
108
- See [agentme-edr-029](029-ai-workflow-naming-conventions.md) rule `01-node-naming-conventions`.
108
+ Nodes MUST follow the naming conventions defined in [agentme-edr-029](029-ai-workflow-naming-conventions.md) rule `01-node-naming-conventions`.
109
109
 
110
110
  #### 10-workflow-unit-testing
111
111
 
112
- All LLM calls within workflow nodes are external API calls and MUST be mocked in unit tests per [agentme-edr-018](018-ai-llm-development-standards.md) rule `04-unit-test-mocking`. Workflow unit tests must run fully offline with no real LLM provider calls.
112
+ All LLM calls within workflow nodes are external API calls and MUST be mocked in unit tests per [agentme-edr-018](018-ai-llm-development-standards.md) rule `04-unit-test-mocking`. Workflow unit tests MUST run fully offline with no real LLM provider calls.
113
113
 
114
- Choose the mock utility based on what the node under test expects from the model:
115
-
116
- - Use **`FakeListChatModel`** when nodes only read `AIMessage.content` (e.g. a routing node that checks a text label).
117
- - Use **`GenericFakeChatModel`** when any node in the workflow expects tool calls, structured outputs, or when the workflow contains `_agent` nodes that drive a tool-invocation loop.
114
+ Choose the mock utility per [agentme-edr-018](018-ai-llm-development-standards.md) rule `04-unit-test-mocking`. For workflows containing `_agent` nodes that drive a tool-invocation loop, MUST use `GenericFakeChatModel`.
118
115
 
119
116
  **Example — workflow with plain-text LLM nodes:**
120
117
 
@@ -159,15 +156,15 @@ Workflows MUST accept the LLM instance as a constructor parameter so that unit t
159
156
 
160
157
  #### 11-state-type-conventions
161
158
 
162
- See [agentme-edr-029](029-ai-workflow-naming-conventions.md) rule `02-state-type-conventions`.
159
+ State types MUST follow the conventions defined in [agentme-edr-029](029-ai-workflow-naming-conventions.md) rule `02-state-type-conventions`.
163
160
 
164
161
  #### 12-workflow-naming-conventions
165
162
 
166
- See [agentme-edr-029](029-ai-workflow-naming-conventions.md) rule `04-workflow-naming-conventions`.
163
+ Workflows MUST be named following the conventions in [agentme-edr-029](029-ai-workflow-naming-conventions.md) rule `04-workflow-naming-conventions`.
167
164
 
168
165
  #### 13-judge-node-output-format
169
166
 
170
- See [agentme-edr-029](029-ai-workflow-naming-conventions.md) rule `03-judge-node-output-format`.
167
+ Judge nodes MUST use the output format defined in [agentme-edr-029](029-ai-workflow-naming-conventions.md) rule `03-judge-node-output-format`.
171
168
 
172
169
  #### 15-workflow-state-persistence
173
170
 
@@ -200,7 +197,7 @@ result = graph.invoke(input_state, config={"thread_id": "session-123"})
200
197
 
201
198
  #### 16-cross-element-naming-coherence
202
199
 
203
- See [agentme-edr-029](029-ai-workflow-naming-conventions.md) rule `05-cross-element-naming-coherence`.
200
+ All workflow elements MUST maintain naming coherence as defined in [agentme-edr-029](029-ai-workflow-naming-conventions.md) rule `05-cross-element-naming-coherence`.
204
201
 
205
202
  ## References
206
203
 
@@ -79,7 +79,7 @@ Follow [agentme-edr-019 rule 02-local-sandbox](019-ai-agents-development-standar
79
79
  | `lib/data/.xdrs/` | XDRS Policy and Skill documents | `/.xdrs/` (read-only) |
80
80
  | Generated at startup | `AGENTS.md` instructing the agent to consult XDRS | `/AGENTS.md` (read-only) |
81
81
 
82
- XDRS documents MUST always be mounted at `/.xdrs/`. `AGENTS.md` MUST always be placed at the sandbox root (`/AGENTS.md`).
82
+ XDRS documents MUST be mounted at `/.xdrs/`. `AGENTS.md` MUST be placed at the sandbox root (`/AGENTS.md`).
83
83
 
84
84
  Example XDRS mount additions:
85
85
 
@@ -21,7 +21,7 @@ How should application source code be organized to separate business logic from
21
21
 
22
22
  #### 01-three-layer-separation
23
23
 
24
- Every application is conceptually divided into three layers:
24
+ Every application MUST be organized into these three conceptual layers:
25
25
 
26
26
  | Layer | Description |
27
27
  |-------|-------------|
@@ -31,6 +31,8 @@ Every application is conceptually divided into three layers:
31
31
 
32
32
  #### 02-adapter-naming-conventions
33
33
 
34
+ Adapters MUST follow these naming conventions:
35
+
34
36
  **Inbound adapters** receive external requests or events and trigger application logic. Each gets a flat folder under `adapters/`:
35
37
 
36
38
  - `cli/` — command-line interface entry point
@@ -50,7 +52,7 @@ Every application is conceptually divided into three layers:
50
52
  #### 03-application-layer-rules
51
53
 
52
54
  - Expose functionality as typed library interfaces
53
- - All inputs must be explicitly passed as typed parameters
55
+ - All inputs MUST be explicitly passed as typed parameters
54
56
  - No global variables, no direct environment variable access in `app/` or `shared/`
55
57
  - Business logic with well-defined input/output behavior
56
58
  - Group related logic into subfolders (aggregation roots)
@@ -66,6 +68,8 @@ Kafka message → adapters/kafka/ → app/process-event → adapters/con
66
68
 
67
69
  #### 04-mandatory-folder-structure
68
70
 
71
+ All projects MUST follow this folder structure:
72
+
69
73
  ```text
70
74
  mysystem/
71
75
  Makefile # targets to run different inbound interfaces (e.g. run-http, run-cli)
@@ -97,7 +101,7 @@ mysystem/
97
101
 
98
102
  #### 06-bootstrap-and-entry-points
99
103
 
100
- - Each inbound adapter folder (`cli/`, `http/`, `grpc/`, etc.) contains the bootstrap and entry point for that interface
104
+ - Each inbound adapter folder (`cli/`, `http/`, `grpc/`, etc.) MUST contain the bootstrap and entry point for that interface
101
105
  - The project root Makefile must have targets to run the different inbound interfaces following [agentme-edr-008](../devops/008-common-targets.md) extension conventions (e.g. `run-http`, `run-grpc`)
102
106
  - Bootstrap code lives in the adapter that receives inbound requests, not in a separate wiring layer
103
107
 
@@ -135,7 +139,7 @@ When a mock implementation needs to be **reused across multiple tests or importe
135
139
  - Single-test use → define the mock inline inside the test file (per rule `09` example; no file needed)
136
140
  - Reusable across multiple tests OR used from `eval.py` → define in a separate `_mock` file
137
141
 
138
- **Scope:** applies to any source file in `adapters/connectors/`, `app/`, or `shared/`. MUST NOT be used for inbound adapters (`cli/`, `http/`, `grpc/`) — those are entry points and are never mocked (rule `09`).
142
+ **Scope:** applies to any source file in `adapters/connectors/`, `app/`, or `shared/`. MUST NOT be used for inbound adapters (`cli/`, `http/`, `grpc/`) — those are entry points and MUST NOT be mocked (rule `09`).
139
143
 
140
144
  **Naming:** insert `_mock` immediately before the file extension:
141
145
 
@@ -151,7 +155,7 @@ When a mock implementation needs to be **reused across multiple tests or importe
151
155
 
152
156
  **Mock contract:**
153
157
  - MUST accept a `fixtures` parameter (constructor argument or factory function argument); the value is whatever `mock_fixtures[key]` contains from the dataset entry — its internal structure is opaque and interpreted by the mock implementation
154
- - MUST NOT fall back to real external calls under any circumstance — if a call cannot be satisfied from the provided fixtures, MUST raise an explicit error (never silently return `null`, `undefined`, or an empty value)
158
+ - MUST NOT fall back to real external calls under any circumstance — if a call cannot be satisfied from the provided fixtures, MUST raise an explicit error (MUST NOT silently return `null`, `undefined`, or an empty value)
155
159
 
156
160
  ## References
157
161
 
@@ -88,8 +88,8 @@ Each `eval.py` script MUST:
88
88
 
89
89
  - Load the golden dataset from `golden_dataset/` in the same eval folder, following [agentme-edr-024](024-ml-dataset-structure.md) and the entry envelope in [agentme-edr-030](030-ai-test-types-taxonomy.md) rule `02` (one JSON file per entry, `test_types` array, `input`, `expected_output`, optional `mock_fixtures`).
90
90
  - Accept a required `--type=<test_type>|all` CLI argument and filter entries whose `test_types` array contains the requested value; `--type=all` includes every entry.
91
- - Iterate **entry-first**: for each entry in the filtered set, invoke the real component exactly once; then score that single `actual_output` for every `test_types` value the entry carries that falls within the current `--type` scope — never invoke the component more than once per entry per run.
92
- - When an entry contains `mock_fixtures` ([agentme-edr-030](030-ai-test-types-taxonomy.md) rule `02`), configure each named mock adapter with its fixture data BEFORE invoking the component for that entry. Each entry MUST use fresh mock instances so fixture state does not bleed across entries. `mock_fixtures` applies to all test types including `human`. `mock_fixtures` MUST NOT configure LLM adapters — the LLM call MUST always be real (see [agentme-edr-030](030-ai-test-types-taxonomy.md) rule `03`). How mock adapters are discovered and instantiated is left to the project; see [agentme-edr-026](026-pragmatic-hexagonal-architecture.md) rule `10` for the `_mock` file naming and placement convention.
91
+ - Iterate **entry-first**: for each entry in the filtered set, invoke the real component exactly once; then score that single `actual_output` for every `test_types` value the entry carries that falls within the current `--type` scope — MUST NOT invoke the component more than once per entry per run.
92
+ - When an entry contains `mock_fixtures` ([agentme-edr-030](030-ai-test-types-taxonomy.md) rule `02`), configure each named mock adapter with its fixture data BEFORE invoking the component for that entry. Each entry MUST use fresh mock instances so fixture state does not bleed across entries. `mock_fixtures` applies to all test types including `human`. `mock_fixtures` MUST NOT configure LLM adapters — the LLM call MUST be real (see [agentme-edr-030](030-ai-test-types-taxonomy.md) rule `03`). How mock adapters are discovered and instantiated is left to the project; see [agentme-edr-026](026-pragmatic-hexagonal-architecture.md) rule `10` for the `_mock` file naming and placement convention.
93
93
  - Run every component invocation against **real LLM providers** (not mocked responses), to capture model drift.
94
94
  - For `human` entries: invoke the component to capture `actual_output`, export each entry's `input`, `expected_output.human_test` instructions, and `actual_output` into a manual-review checklist (`report-human.md`). MUST NOT invoke an automated scorer and MUST NOT enforce a pass/fail threshold for it. Other `test_types` on the same entry (e.g. `functional`) are still scored automatically.
95
95
  - After all entries are processed, compute aggregate metrics per test type, log them to a local MLflow experiment (see rule `04`), write one `report-<type>.md` per evaluated test type (rule `03`), and exit with a non-zero status when any metric falls below its defined threshold per [agentme-edr-007](../principles/007-project-quality-standards.md) rule `07-statistical-models-must-have-eval-targets`. The `human` type has no threshold and does not trigger a non-zero exit.
@@ -235,7 +235,7 @@ Where $\hat{p}$ is observed accuracy and $n$ is sample count. Accuracy and F1 ar
235
235
  - MLflow run: experiment `workflow-document-review/eval-basic`, tag `test_types=functional` — view with `mlflow ui`
236
236
  ```
237
237
 
238
- **`human` type artifact:** instead of `report-human.md` with metrics, `--type=human` produces a checklist artifact (still named `report-human.md`) listing, per entry, its `input`, `expected_output.human_test` instructions, and the captured `actual_output` — with no Overall Results table, threshold, or PASS/FAIL section, since this type is never auto-scored.
238
+ **`human` type artifact:** instead of `report-human.md` with metrics, `--type=human` produces a checklist artifact (still named `report-human.md`) listing, per entry, its `input`, `expected_output.human_test` instructions, and the captured `actual_output` — with no Overall Results table, threshold, or PASS/FAIL section, since this type MUST NOT be auto-scored.
239
239
 
240
240
  #### 04-eval-mlflow-unique-port
241
241
 
@@ -46,7 +46,7 @@ def code_reviewer_agent(state): ...
46
46
  graph.add_node("code_reviewer_agent", code_reviewer_agent)
47
47
  ```
48
48
 
49
- Names MUST NOT use generic labels such as `node1`, `process`, or `run`. Each name must clearly express what action the node performs.
49
+ Names MUST NOT use generic labels such as `node1`, `process`, or `run`. Each name MUST clearly express what action the node performs.
50
50
 
51
51
  Judge nodes use a **prefix** convention instead of a suffix: the name MUST start with `evaluate_` followed by the subject being judged (e.g. `evaluate_progress`, `evaluate_quality`, `evaluate_completeness`, `evaluate_relevance`). This makes judge nodes immediately distinguishable from all other node types at a glance.
52
52
 
@@ -21,7 +21,7 @@ Each test type is named with its group, objective, mocking constraint, applicabi
21
21
 
22
22
  #### 01-golden-dataset-concept
23
23
 
24
- A **golden dataset** comprises all eval case entries used to test an AI component (LLM, Agent, or Workflow tier); each entry is labeled with the `test_types` (rule `04`) it applies to. It is the dataset consumed by [agentme-edr-028](028-ai-eval-standards.md) evals and stored as one JSON file per entry per [agentme-edr-024](024-ml-dataset-structure.md) rule `04`, at `evals/<component>/eval-<name>/golden_dataset/`.
24
+ Projects MUST use a golden dataset to test AI components. A **golden dataset** comprises all eval case entries used to test an AI component (LLM, Agent, or Workflow tier); each entry is labeled with the `test_types` (rule `04`) it applies to. It is the dataset consumed by [agentme-edr-028](028-ai-eval-standards.md) evals and stored as one JSON file per entry per [agentme-edr-024](024-ml-dataset-structure.md) rule `04`, at `evals/<component>/eval-<name>/golden_dataset/`.
25
25
 
26
26
  #### 02-golden-dataset-entry-envelope
27
27
 
@@ -41,8 +41,8 @@ Every golden dataset entry (a JSON file in `golden_dataset/data/`) MUST have thi
41
41
 
42
42
  - `test_types` — array, values MUST come from rule `04`'s enum, MUST contain at least one value. An entry MAY carry more than one value additively (e.g. `["functional", "smoke", "human"]`) — no test type excludes another.
43
43
  - `input` — for Prompt-tier components, a raw prompt string or the prompt template's input parameters object; for Agent/Workflow-tier components, the input attributes object passed to the component.
44
- - `expected_output` — the fields used to score the entry under each of its automated `test_types`: output attributes for an LLM-as-judge rubric, a target for vector-similarity scoring, or exact attribute values for strict comparison. When `human` is one of the entry's `test_types`, `expected_output` MUST additionally include a `human_test` string field with manual-verification instructions (e.g. `"check for ethical issues, verify record change in system X"`) — this supplements, and never replaces, the entry's automated scoring fields.
45
- - `mock_fixtures` — optional object; keys identify the adapter or external system to mock (SHOULD match the connector folder name under `adapters/connectors/<name>` for readability, though not enforced), values are any valid JSON interpreted by the mock implementation. When present, eval.py MUST configure each named mock adapter with its fixture data BEFORE invoking the component for that entry; each entry MUST use fresh mock instances to prevent state from bleeding across entries. `mock_fixtures` applies to all `test_types` including `human` — the component is still invoked for human entries to capture `actual_output`. `mock_fixtures` MUST NOT include keys for LLM adapters: all golden dataset test types are rated `mocks disallowed for LLM calls` (rule `03`), so the LLM call MUST always be real; LLM provider mocking belongs exclusively to unit tests via [agentme-edr-018](018-ai-llm-development-standards.md) rule `04`. See [agentme-edr-026](026-pragmatic-hexagonal-architecture.md) rule `10` for the `_mock` file naming and placement convention.
44
+ - `expected_output` — the fields used to score the entry under each of its automated `test_types`: output attributes for an LLM-as-judge rubric, a target for vector-similarity scoring, or exact attribute values for strict comparison. When `human` is one of the entry's `test_types`, `expected_output` MUST additionally include a `human_test` string field with manual-verification instructions (e.g. `"check for ethical issues, verify record change in system X"`) — this supplements, and MUST NOT replace, the entry's automated scoring fields.
45
+ - `mock_fixtures` — optional object; keys identify the adapter or external system to mock (SHOULD match the connector folder name under `adapters/connectors/<name>` for readability, though not enforced), values are any valid JSON interpreted by the mock implementation. When present, eval.py MUST configure each named mock adapter with its fixture data BEFORE invoking the component for that entry; each entry MUST use fresh mock instances to prevent state from bleeding across entries. `mock_fixtures` applies to all `test_types` including `human` — the component is still invoked for human entries to capture `actual_output`. `mock_fixtures` MUST NOT include keys for LLM adapters: all golden dataset test types are rated `mocks disallowed for LLM calls` (rule `03`), so the LLM call MUST be real; LLM provider mocking belongs exclusively to unit tests via [agentme-edr-018](018-ai-llm-development-standards.md) rule `04`. See [agentme-edr-026](026-pragmatic-hexagonal-architecture.md) rule `10` for the `_mock` file naming and placement convention.
46
46
  - The dataset's `dataset.schema.json` MUST require `test_types`, `input`, and `expected_output`, and SHOULD declare `mock_fixtures` as optional (`"type": "object", "additionalProperties": {}`), per [agentme-edr-024](024-ml-dataset-structure.md) rule `04`.
47
47
 
48
48
  #### 03-mocks-allowed-values
@@ -61,6 +61,8 @@ A golden dataset entry's `test_types` array MUST only use these values: `safety`
61
61
 
62
62
  #### 05-test-type-taxonomy
63
63
 
64
+ Test types MUST be selected from this taxonomy. Each test type is named with its group, objective, mocking constraint, applicability, and relevance:
65
+
64
66
  | Test Type Name | Group | Test Objective | Mocks Allowed | When to Apply | Relevance – Business | Relevance – Development Team | Priority (1-5) |
65
67
  |---|---|---|---|---|---|---|---|
66
68
  | Safety/content eval | Safety & adversarial | Detect harmful, biased, or policy-violating output | mocks disallowed for LLM calls | Any user-facing release | Avoids reputational harm; acceptable-use compliance | Automated content gate before merge/release | 5 |
@@ -79,11 +81,11 @@ A golden dataset entry's `test_types` array MUST only use these values: `safety`
79
81
 
80
82
  #### 06-priority-and-relevance-are-descriptive-only
81
83
 
82
- Priority, Relevance, and When to Apply in rule `05` are guidance for prioritization conversations — they do NOT mandate which test types a project must implement, nor their thresholds. [agentme-edr-007](../principles/007-project-quality-standards.md) rule `09` remains the only tier-level testing requirement in force (Workflow unit tests + functional evals). Once a project chooses to implement and threshold a test type, [agentme-edr-028](028-ai-eval-standards.md) rule `02`'s failing-threshold behavior applies uniformly, regardless of this table's priority rating — a project may enforce fairness at 70% and functional at 90%, or skip fairness entirely; that choice is a project/business decision, not one this Policy makes.
84
+ Priority, Relevance, and When to Apply in rule `05` are guidance for prioritization conversations — they MUST NOT be treated as mandating which test types a project must implement, nor their thresholds. [agentme-edr-007](../principles/007-project-quality-standards.md) rule `09` remains the only tier-level testing requirement in force (Workflow unit tests + functional evals). Once a project chooses to implement and threshold a test type, [agentme-edr-028](028-ai-eval-standards.md) rule `02`'s failing-threshold behavior applies uniformly, regardless of this table's priority rating — a project may enforce fairness at 70% and functional at 90%, or skip fairness entirely; that choice is a project/business decision, not one this Policy makes.
83
85
 
84
86
  #### 07-smoke-is-distinct-from-test-smoke
85
87
 
86
- The `smoke` test type (surfaced as the `eval-smoke` Makefile target, a fast subset of the golden-dataset functional eval) is a different concept from [agentme-edr-008](../devops/008-common-targets.md)'s existing `test-smoke` target (a fast subset of code-level tests). Both may exist in the same project; do not conflate them.
88
+ The `smoke` test type (surfaced as the `eval-smoke` Makefile target, a fast subset of the golden-dataset functional eval) is a different concept from [agentme-edr-008](../devops/008-common-targets.md)'s existing `test-smoke` target (a fast subset of code-level tests). Both MAY exist in the same project; teams MUST NOT conflate them.
87
89
 
88
90
  ## References
89
91
 
@@ -53,60 +53,60 @@ Module folder responsibilities, artifact locations, and test-folder conventions
53
53
  #### 02-application-folders
54
54
 
55
55
  - Represent a cohesive unit with its own lifecycle (e.g., `mymobileapp`, `graph-visualizer`).
56
- - **MUST** depend only on resources in `/shared/`. Direct cross-application dependencies are forbidden; use published artifacts (container images, published libraries) instead.
57
- - **MUST** contain a `README.md` with: purpose, architecture overview, how to build, and how to run.
58
- - **MAY** contain `examples/`, `tests_integration/`, and `tests_benchmark/` when those artifacts apply to multiple modules inside the application.
56
+ - MUST depend only on resources in `/shared/`. Direct cross-application dependencies are forbidden; use published artifacts (container images, published libraries) instead.
57
+ - MUST contain a `README.md` with: purpose, architecture overview, how to build, and how to run.
58
+ - MAY contain `examples/`, `tests_integration/`, and `tests_benchmark/` when those artifacts apply to multiple modules inside the application.
59
59
 
60
60
  #### 03-module-folders
61
61
 
62
62
  - A module is a subfolder inside an application that is independently compilable and produces a build artifact.
63
63
  - May depend on sibling modules within the same application or on `/shared/` resources.
64
- - **MUST NOT** depend on modules from other applications.
65
- - **MUST** contain its own `Makefile`, `README.md`, and language/tooling configuration.
66
- - **MUST** keep build outputs under `dist/` and persistent caches under `.cache/`, following [agentme-edr-016](../principles/016-cross-language-module-structure.md).
67
- - **MUST NOT** keep consumer examples inside the module folder; those belong in a sibling `examples/` folder at the nearest parent aggregation root.
64
+ - MUST NOT depend on modules from other applications.
65
+ - MUST contain its own `Makefile`, `README.md`, and language/tooling configuration.
66
+ - MUST keep build outputs under `dist/` and persistent caches under `.cache/`, following [agentme-edr-016](../principles/016-cross-language-module-structure.md).
67
+ - MUST NOT keep consumer examples inside the module folder; those belong in a sibling `examples/` folder at the nearest parent aggregation root.
68
68
 
69
69
  #### 04-naming-conventions
70
70
 
71
- - All folder and file names **MUST** be **lowercase**.
71
+ - All folder and file names MUST be lowercase.
72
72
  - Use hyphens (`-`) to separate words (e.g., `data-loader`, `graph-visualizer`).
73
73
  - Avoid abbreviations unless universally understood in the domain (e.g., `cli`, `api`).
74
74
 
75
75
  #### 05-makefiles-at-every-level
76
76
 
77
- A `Makefile` **MUST** be present at the repository root, in every application folder, and in every module folder.
77
+ A `Makefile` MUST be present at the repository root, in every application folder, and in every module folder.
78
78
 
79
- All Makefiles **MUST** use the shared target vocabulary from [agentme-edr-008](008-common-targets.md).
79
+ All Makefiles MUST use the shared target vocabulary from [agentme-edr-008](008-common-targets.md).
80
80
 
81
- Repository, application, and module Makefiles **MUST** define at minimum: `all`, `build`, `lint`, `test`, and `clean`.
81
+ Repository, application, and module Makefiles MUST define at minimum: `all`, `build`, `lint`, `test`, and `clean`.
82
82
 
83
- Module Makefiles **SHOULD** also provide `lint-fix` and `install` when the underlying tooling supports them.
83
+ Module Makefiles SHOULD also provide `lint-fix` and `install` when the underlying tooling supports them.
84
84
 
85
- The root `Makefile` **MUST** also define a `setup` target that guides a new contributor to prepare their machine.
86
- The root `setup` target **MUST** run `mise install` and any small repository bootstrap required before routine targets work.
85
+ The root `Makefile` MUST also define a `setup` target that guides a new contributor to prepare their machine.
86
+ The root `setup` target MUST run `mise install` and any small repository bootstrap required before routine targets work.
87
87
 
88
88
  #### 06-mise-for-tooling-management
89
89
 
90
- - [Mise](https://mise.jdx.dev/) **MUST** be used to pin all tool versions (compilers, runtimes, CLI tools).
91
- - A `.mise.toml` **MUST** exist at the repository root.
92
- - Every language runtime or CLI referenced by any module `Makefile`, CI workflow, or README command **MUST** be pinned in `.mise.toml`.
93
- - Contributors and CI run `make setup` after cloning or checkout; this target must call `mise install`.
94
- - Agents and contributors **MUST** check `.mise.toml` before using a system-installed compiler, runtime, or CLI.
95
- - When `.mise.toml` exists, all build, test, lint, and code-generation commands **MUST** run through `make <target>`, and the Makefile recipes **MUST** execute the underlying tools via `mise exec -- <command>`, following [agentme-edr-017](017-tool-execution-and-scripting.md).
96
- - If a required tool is missing, the first remediation step **MUST** be to update `.mise.toml` or run `mise install`, not to install ad-hoc global tools with language-specific installers such as `go install`, `npm install -g`, `pip install --user`, or `cargo install`.
97
- - Root and module `Makefile` targets **MUST** work when invoked as plain `make <target>` after `make setup`.
90
+ - [Mise](https://mise.jdx.dev/) MUST be used to pin all tool versions (compilers, runtimes, CLI tools).
91
+ - A `.mise.toml` MUST exist at the repository root.
92
+ - Every language runtime or CLI referenced by any module `Makefile`, CI workflow, or README command MUST be pinned in `.mise.toml`.
93
+ - Contributors and CI run `make setup` after cloning or checkout; this target MUST call `mise install`.
94
+ - Agents and contributors MUST check `.mise.toml` before using a system-installed compiler, runtime, or CLI.
95
+ - When `.mise.toml` exists, all build, test, lint, and code-generation commands MUST run through `make <target>`, and the Makefile recipes MUST execute the underlying tools via `mise exec -- <command>`, following [agentme-edr-017](017-tool-execution-and-scripting.md).
96
+ - If a required tool is missing, the first remediation step MUST be to update `.mise.toml` or run `mise install`, not to install ad-hoc global tools with language-specific installers such as `go install`, `npm install -g`, `pip install --user`, or `cargo install`.
97
+ - Root and module `Makefile` targets MUST work when invoked as plain `make <target>` after `make setup`.
98
98
 
99
99
  #### 07-root-readme
100
100
 
101
- The root `README.md` **MUST** include: overview, machine setup, quickstart, and a repository map.
101
+ The root `README.md` MUST include: overview, machine setup, quickstart, and a repository map.
102
102
 
103
103
  #### 08-root-gitignore
104
104
 
105
- The repository root **MUST** ignore `dist/` and `.cache/` so module artifacts and tool caches are never committed accidentally.
105
+ The repository root MUST ignore `dist/` and `.cache/` so module artifacts and tool caches MUST NOT be committed accidentally.
106
106
 
107
107
  #### 09-git-tagging-and-artifact-versioning
108
108
 
109
- All releases **MUST** be tagged using the format `<module-name>/<semver>` (e.g., `graphvisualizer/renderer/1.0.0`, `shared/libs/mylib/2.1.0`).
109
+ All releases MUST be tagged using the format `<module-name>/<semver>` (e.g., `graphvisualizer/renderer/1.0.0`, `shared/libs/mylib/2.1.0`).
110
110
 
111
111
  `<module-name>` is preferably the path-like identifier of the module being released. A custom name is allowed but the folder name is strongly preferred.
112
112
 
@@ -114,6 +114,8 @@ All releases **MUST** be tagged using the format `<module-name>/<semver>` (e.g.,
114
114
 
115
115
  #### 11-summary-of-requirements
116
116
 
117
+ All requirements marked 'Yes' MUST be met. The table below summarizes the mandatory requirements:
118
+
117
119
  | Requirement | Scope | Mandatory |
118
120
  |---|---|---|
119
121
  | Lowercase folder/file names | All | Yes |
@@ -29,7 +29,7 @@ Separating these concerns eliminates accidental publishes from CI runs, ensures
29
29
  | `release.yml` | `workflow_dispatch` | Tag the next version using monotag |
30
30
  | `publish.yml` | `push` of tags matching `*` | Publish artifacts for the tagged version |
31
31
 
32
- All workflows run on `ubuntu-latest`. Tool versions MUST be managed by Mise via `jdx/mise-action`. Projects should have a .mise.toml file to configure it
32
+ All workflows run on `ubuntu-latest`. Tool versions MUST be managed by Mise via `jdx/mise-action`. Projects SHOULD have a `.mise.toml` file to configure it
33
33
 
34
34
  ---
35
35
 
@@ -37,7 +37,7 @@ All workflows run on `ubuntu-latest`. Tool versions MUST be managed by Mise via
37
37
 
38
38
  File: `.github/workflows/ci.yml`
39
39
 
40
- Triggered on every PR targeting `main` and every push to `main`. Runs the standard `build`, `lint`, and `test` targets from the root Makefile and fails the workflow if any step exits non-zero.
40
+ Projects MUST configure this workflow, triggered on every PR targeting `main` and every push to `main`. It runs the standard `build`, `lint`, and `test` targets from the root Makefile and fails the workflow if any step exits non-zero.
41
41
 
42
42
  ```yaml
43
43
  name: ci
@@ -67,9 +67,9 @@ jobs:
67
67
 
68
68
  File: `.github/workflows/release.yml`
69
69
 
70
- Manually dispatched (`workflow_dispatch`). Calculates the next semantic version tag using **monotag** and pushes that tag to the repository. Pushing the tag then automatically triggers the publish workflow.
70
+ Projects MUST use this manually dispatched (`workflow_dispatch`) workflow. It calculates the next semantic version tag using **monotag** and pushes that tag to the repository. Pushing the tag then automatically triggers the publish workflow.
71
71
 
72
- The checkout step **must** use `fetch-depth: 0` so monotag can traverse the full commit history to determine the correct next version.
72
+ The checkout step MUST use `fetch-depth: 0` so monotag can traverse the full commit history to determine the correct next version.
73
73
 
74
74
  ```yaml
75
75
  name: release
@@ -112,7 +112,7 @@ jobs:
112
112
 
113
113
  File: `.github/workflows/publish.yml`
114
114
 
115
- Triggered exclusively when a tag matching `v*.*.*` is pushed to the repository. This ensures only explicitly tagged commits produce published artifacts. Runs `make publish` against the tagged commit.
115
+ Projects MUST configure this workflow, triggered exclusively when a tag matching `v*.*.*` is pushed to the repository. This ensures only explicitly tagged commits produce published artifacts. Runs `make publish` against the tagged commit.
116
116
 
117
117
  ```yaml
118
118
  name: publish