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.
- package/.filedist-package.yml +1 -1
- package/.xdrs/agentme/edrs/application/003-javascript-project-tooling.md +4 -4
- package/.xdrs/agentme/edrs/application/010-golang-project-tooling.md +4 -4
- package/.xdrs/agentme/edrs/application/014-python-project-tooling.md +10 -10
- package/.xdrs/agentme/edrs/application/018-ai-llm-development-standards.md +1 -1
- package/.xdrs/agentme/edrs/application/019-ai-agents-development-standards.md +10 -10
- package/.xdrs/agentme/edrs/application/021-ai-workflow-development-standards.md +10 -13
- package/.xdrs/agentme/edrs/application/025-ai-agent-xdrs-knowledge-layer.md +1 -1
- package/.xdrs/agentme/edrs/application/026-pragmatic-hexagonal-architecture.md +9 -5
- package/.xdrs/agentme/edrs/application/028-ai-eval-standards.md +3 -3
- package/.xdrs/agentme/edrs/application/029-ai-workflow-naming-conventions.md +1 -1
- package/.xdrs/agentme/edrs/application/030-ai-test-types-taxonomy.md +7 -5
- package/.xdrs/agentme/edrs/devops/005-monorepo-structure.md +27 -25
- package/.xdrs/agentme/edrs/devops/006-github-pipelines.md +5 -5
- package/.xdrs/agentme/edrs/devops/008-common-targets.md +34 -34
- package/.xdrs/agentme/edrs/devops/017-tool-execution-and-scripting.md +1 -1
- package/.xdrs/agentme/edrs/devops/027-environment-variable-configuration.md +10 -10
- package/.xdrs/agentme/edrs/governance/013-contributing-guide-requirements.md +35 -9
- package/.xdrs/agentme/edrs/observability/011-service-health-check-endpoint.md +1 -1
- package/.xdrs/agentme/edrs/principles/002-coding-best-practices.md +3 -3
- package/.xdrs/agentme/edrs/principles/004-unit-test-requirements.md +10 -8
- package/.xdrs/agentme/edrs/principles/007-project-quality-standards.md +25 -25
- package/.xdrs/agentme/edrs/principles/009-error-handling.md +1 -1
- package/.xdrs/agentme/edrs/principles/012-continuous-xdr-enrichment.md +27 -9
- package/.xdrs/agentme/edrs/principles/016-cross-language-module-structure.md +1 -1
- package/.xdrs/agentme/edrs/principles/022-secrets-management.md +32 -30
- package/.xdrs/agentme/edrs/principles/023-coding-abstraction-practices.md +4 -4
- package/package.json +2 -2
package/.filedist-package.yml
CHANGED
|
@@ -61,7 +61,7 @@ coverageProvider: 'v8',
|
|
|
61
61
|
coverageDirectory: '.cache/coverage',
|
|
62
62
|
```
|
|
63
63
|
|
|
64
|
-
Builds that miss the threshold
|
|
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 —
|
|
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
|
-
|
|
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
|
|
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
|
|
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/`
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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 —
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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`
|
|
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
|
-
-
|
|
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
|
|
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
|
|
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
|
-
-
|
|
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) |
|
|
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
|
|
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
|
-
| `<
|
|
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 —
|
|
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
|
-
<
|
|
211
|
+
<AGENT_ROLE>
|
|
212
212
|
You are the batch_plan_agent.
|
|
213
|
-
</
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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.)
|
|
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
|
|
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 (
|
|
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 —
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
-
|
|
57
|
-
-
|
|
58
|
-
-
|
|
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
|
-
-
|
|
65
|
-
-
|
|
66
|
-
-
|
|
67
|
-
-
|
|
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
|
|
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`
|
|
77
|
+
A `Makefile` MUST be present at the repository root, in every application folder, and in every module folder.
|
|
78
78
|
|
|
79
|
-
All Makefiles
|
|
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
|
|
81
|
+
Repository, application, and module Makefiles MUST define at minimum: `all`, `build`, `lint`, `test`, and `clean`.
|
|
82
82
|
|
|
83
|
-
Module Makefiles
|
|
83
|
+
Module Makefiles SHOULD also provide `lint-fix` and `install` when the underlying tooling supports them.
|
|
84
84
|
|
|
85
|
-
The root `Makefile`
|
|
86
|
-
The root `setup` target
|
|
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/)
|
|
91
|
-
- A `.mise.toml`
|
|
92
|
-
- Every language runtime or CLI referenced by any module `Makefile`, CI workflow, or README command
|
|
93
|
-
- Contributors and CI run `make setup` after cloning or checkout; this target
|
|
94
|
-
- Agents and contributors
|
|
95
|
-
- When `.mise.toml` exists, all build, test, lint, and code-generation commands
|
|
96
|
-
- If a required tool is missing, the first remediation step
|
|
97
|
-
- Root and module `Makefile` targets
|
|
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`
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|