agentme 0.25.0 → 0.25.2

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.
@@ -1,5 +1,5 @@
1
1
  sets:
2
- - package: xdrs-core@0.37.2
2
+ - package: xdrs-core@0.38.3
3
3
  # - package: git:https://github.com/flaviostutz/xdrs-core.git@main
4
4
  selector:
5
5
  files:
@@ -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
 
@@ -37,7 +37,7 @@ 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
 
@@ -101,11 +101,11 @@ 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
 
@@ -159,15 +159,15 @@ Workflows MUST accept the LLM instance as a constructor parameter so that unit t
159
159
 
160
160
  #### 11-state-type-conventions
161
161
 
162
- See [agentme-edr-029](029-ai-workflow-naming-conventions.md) rule `02-state-type-conventions`.
162
+ State types MUST follow the conventions defined in [agentme-edr-029](029-ai-workflow-naming-conventions.md) rule `02-state-type-conventions`.
163
163
 
164
164
  #### 12-workflow-naming-conventions
165
165
 
166
- See [agentme-edr-029](029-ai-workflow-naming-conventions.md) rule `04-workflow-naming-conventions`.
166
+ Workflows MUST be named following the conventions in [agentme-edr-029](029-ai-workflow-naming-conventions.md) rule `04-workflow-naming-conventions`.
167
167
 
168
168
  #### 13-judge-node-output-format
169
169
 
170
- See [agentme-edr-029](029-ai-workflow-naming-conventions.md) rule `03-judge-node-output-format`.
170
+ 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
171
 
172
172
  #### 15-workflow-state-persistence
173
173
 
@@ -200,7 +200,7 @@ result = graph.invoke(input_state, config={"thread_id": "session-123"})
200
200
 
201
201
  #### 16-cross-element-naming-coherence
202
202
 
203
- See [agentme-edr-029](029-ai-workflow-naming-conventions.md) rule `05-cross-element-naming-coherence`.
203
+ 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
204
 
205
205
  ## References
206
206
 
@@ -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
 
@@ -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
 
@@ -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
 
@@ -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 |
@@ -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,7 +67,7 @@ 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
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
 
@@ -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
@@ -195,7 +195,7 @@ A developer can run `make test` at the repo root to test everything, or `cd modu
195
195
 
196
196
  #### 07-quick-reference
197
197
 
198
- Any project following this EDR supports the following actions through the root `Makefile`.
198
+ Any project following this EDR MUST support the following actions through the root `Makefile`.
199
199
 
200
200
  ```sh
201
201
  # install the pinned toolchain and project bootstrap
@@ -25,7 +25,7 @@ Secrets (API keys, passwords, tokens) must never be placed in `.env` files. Thos
25
25
 
26
26
  #### 01-when-to-use-dotenv
27
27
 
28
- Use a `.env` file when either of the following is true:
28
+ A `.env` file MUST be used when either of the following is true:
29
29
 
30
30
  1. **Spawned process needs env vars** — the project launches a process (a deployable service, background worker, or shell script) that reads configuration from OS environment variables such as port numbers or API endpoint URLs.
31
31
  2. **Value must not be committed** — a configuration value used in a YAML config file (see rule 07) is environment-specific or sensitive enough to exclude from version control. In that case, store the value in `.env` and reference it from the YAML file using env var substitution (see rule 08).
@@ -43,13 +43,13 @@ FEATURE_FLAG_NEW_UI=false
43
43
 
44
44
  #### 02-dotenv-not-committed
45
45
 
46
- `.env` must be listed in `.gitignore` and must never be committed to the repository. It is intended for local use in standalone projects and libraries that do not have a formal deployment pipeline.
46
+ `.env` MUST be listed in `.gitignore` and must never be committed to the repository. It is intended for local use in standalone projects and libraries that do not have a formal deployment pipeline.
47
47
 
48
48
  ---
49
49
 
50
50
  #### 03-dotenv-example-committed
51
51
 
52
- A `.env.example` file must be committed alongside `.env`. It contains all the same variable names with placeholder or illustrative values — no real URLs, credentials, or server names. This file documents what configuration is expected without exposing real values.
52
+ A `.env.example` file MUST be committed alongside `.env`. It contains all the same variable names with placeholder or illustrative values — no real URLs, credentials, or server names. This file documents what configuration is expected without exposing real values.
53
53
 
54
54
  Example `.env.example`:
55
55
  ```
@@ -62,7 +62,7 @@ FEATURE_FLAG_NEW_UI=false
62
62
 
63
63
  #### 04-stage-specific-dotenv-committed
64
64
 
65
- Stage-specific overrides must use the naming convention `.env.[stage]` (e.g., `.env.production`, `.env.staging`, `.env.test`). These files may be committed to the repository because they carry deployment-stage configuration rather than local developer configuration. They are used during deployment pipelines where the stage is known and explicit.
65
+ Stage-specific overrides MUST use the naming convention `.env.[stage]` (e.g., `.env.production`, `.env.staging`, `.env.test`). These files may be committed to the repository because they carry deployment-stage configuration rather than local developer configuration. They are used during deployment pipelines where the stage is known and explicit.
66
66
 
67
67
  The generic `.env` must still not be committed. The distinction is: `.env` is for local, ad-hoc, standalone use; `.env.[stage]` is for deployment pipelines with a defined environment identity.
68
68
 
@@ -70,7 +70,7 @@ The generic `.env` must still not be committed. The distinction is: `.env` is fo
70
70
 
71
71
  #### 05-load-in-makefile-before-processes
72
72
 
73
- When `.env` defines variables consumed by shell scripts or spawned processes, the Makefile must load and export them before invoking those processes. Use the following pattern at the top of the relevant Makefile or in a shared include:
73
+ When `.env` defines variables consumed by shell scripts or spawned processes, the Makefile MUST load and export them before invoking those processes. Use the following pattern at the top of the relevant Makefile or in a shared include:
74
74
 
75
75
  ```makefile
76
76
  ifneq (,$(wildcard .env))
@@ -85,7 +85,7 @@ This ensures all variables in `.env` are available as environment variables to e
85
85
 
86
86
  #### 06-no-application-level-dotenv-loading
87
87
 
88
- Applications must not load `.env` files directly inside their own code using dotenv libraries or equivalent mechanisms. Configuration must enter the process exclusively as OS-level environment variables, set before the process is launched (by the Makefile, a shell script, CI, or a container runtime).
88
+ Applications MUST NOT load `.env` files directly inside their own code using dotenv libraries or equivalent mechanisms. Configuration must enter the process exclusively as OS-level environment variables, set before the process is launched (by the Makefile, a shell script, CI, or a container runtime).
89
89
 
90
90
  Prohibited patterns:
91
91
 
@@ -114,7 +114,7 @@ This rule prevents two parallel loading paths — OS env and file-based env —
114
114
 
115
115
  #### 07-cli-adapters-use-yaml-config
116
116
 
117
- CLI adapters with multiple configuration attributes must use a YAML config file rather than env vars or flags for those attributes. This applies whenever configuration is nested, repetitive, or too verbose for flags alone.
117
+ CLI adapters with multiple configuration attributes MUST use a YAML config file rather than env vars or flags for those attributes. This applies whenever configuration is nested, repetitive, or too verbose for flags alone.
118
118
 
119
119
  The CLI layer is responsible for loading and parsing the YAML file and passing the resolved values to the application layer. The application layer must not read the config file directly.
120
120
 
@@ -131,7 +131,7 @@ max_retries: 3
131
131
 
132
132
  #### 08-env-var-substitution-in-config-files
133
133
 
134
- When a YAML config file contains a value that must not be committed (such as a real endpoint URL, a username, or any other environment-specific value), that value must be expressed as an environment variable reference using `${VAR_NAME}` syntax, and the actual value must be defined in `.env`.
134
+ When a YAML config file contains a value that MUST NOT be committed (such as a real endpoint URL, a username, or any other environment-specific value), that value must be expressed as an environment variable reference using `${VAR_NAME}` syntax, and the actual value must be defined in `.env`.
135
135
 
136
136
  This keeps the YAML file committable while keeping the environment-specific value out of the repository.
137
137
 
@@ -46,7 +46,7 @@ src/
46
46
 
47
47
  #### 02-apply-template-method-pattern
48
48
 
49
- When a function's main logic contains well-defined sections and **any individual section exceeds ~20 lines**, extract each section into its own named function. The outer function becomes an orchestrator that calls the extracted helpers in sequence.
49
+ When a function's main logic contains well-defined sections and **any individual section exceeds ~20 lines**, each section MUST be extracted into its own named function. The outer function becomes an orchestrator that calls the extracted helpers in sequence.
50
50
 
51
51
  **Example (Python):**
52
52
 
@@ -110,13 +110,13 @@ Every change to a public interface, behavior, or configuration option MUST be re
110
110
 
111
111
  #### 05-declare-types-in-file-where-used
112
112
 
113
- If a type (struct, interface, class, typedef, etc.) is used in only **one** file, declare it in that same file. Move a type to a shared module only when it is referenced in two or more files.
113
+ Types used in only **one** file MUST be declared in that same file. Move a type to a shared module only when it is referenced in two or more files.
114
114
 
115
115
  ---
116
116
 
117
117
  #### 06-keep-test-files-next-to-source
118
118
 
119
- Where the language ecosystem supports it (e.g. JavaScript/TypeScript, Go, Rust), place test files **beside** the source file they cover and use a consistent naming convention rather than mirroring the source tree in a separate `tests/` folder.
119
+ Where the language ecosystem supports it (e.g. JavaScript/TypeScript, Go, Rust), test files MUST be placed **beside** the source file they cover and use a consistent naming convention rather than mirroring the source tree in a separate `tests/` folder.
120
120
 
121
121
  **Recommended naming conventions:**
122
122
 
@@ -21,7 +21,7 @@ What unit testing practices should be followed to ensure tests are meaningful, r
21
21
 
22
22
  #### 01-must-have-at-least-one-assertion-per-test
23
23
 
24
- ```typescript
24
+ Every test MUST have at least one assertion that validates the expected behavior.
25
25
  // bad — no assertion; passes even when code is broken
26
26
  it("processes the order", () => { processOrder(mockOrder); });
27
27
 
@@ -36,7 +36,7 @@ it("processes the order and returns a confirmation id", () => {
36
36
 
37
37
  #### 02-must-run-offline
38
38
 
39
- Unit tests must not depend on any external resources: no network calls, no running databases, no external APIs, no file system paths outside the repo. Tests must pass with only static code available.
39
+ Unit tests MUST NOT depend on any external resources: no network calls, no running databases, no external APIs, no file system paths outside the repo. Tests must pass with only static code available.
40
40
 
41
41
  ```typescript
42
42
  // bad — hits a real HTTP endpoint
@@ -64,13 +64,13 @@ export default defineConfig({
64
64
  });
65
65
  ```
66
66
 
67
- Builds that miss the threshold must not be merged.
67
+ Builds that miss the threshold MUST NOT be merged.
68
68
 
69
69
  ---
70
70
 
71
71
  #### 04-must-place-test-files-alongside-source
72
72
 
73
- Test files must live next to the source file they test, in the same directory, following the convention of the language/framework:
73
+ Test files MUST live next to the source file they test, in the same directory, following the convention of the language/framework:
74
74
 
75
75
  | Language | Pattern | Example |
76
76
  |----------|---------|-------|
@@ -96,7 +96,7 @@ Do not flatten or reorganize paths when using a separate test folder.
96
96
 
97
97
  #### 05-should-extract-shared-setup
98
98
 
99
- When setup logic is repeated across two or more test files, centralize it (`src/test-utils/`, `internal/testutil/`, `tests/conftest.py`).
99
+ When setup logic is repeated across two or more test files, it SHOULD be centralized (`src/test-utils/`, `internal/testutil/`, `tests/conftest.py`).
100
100
 
101
101
  ```typescript
102
102
  // src/test-utils/order-factory.ts
@@ -109,7 +109,7 @@ export function makeOrder(overrides: Partial<Order> = {}): Order {
109
109
 
110
110
  #### 06-should-avoid-mocks
111
111
 
112
- Use the lowest-cost alternative that exercises real behavior:
112
+ Tests SHOULD use the lowest-cost alternative that exercises real behavior:
113
113
 
114
114
  1. **Real implementation** — always prefer this
115
115
  2. **In-memory / lightweight fake** — e.g. in-memory DB, stub HTTP server
@@ -23,7 +23,7 @@ These standards form a non-negotiable baseline. Individual projects may raise th
23
23
 
24
24
  #### 01-readme-must-have-getting-started
25
25
 
26
- `README.md` must include a **Getting Started** section in the first 20 lines with the minimal steps to install and use the project.
26
+ `README.md` MUST include a **Getting Started** section in the first 20 lines with the minimal steps to install and use the project.
27
27
 
28
28
  **Required content:**
29
29
  - Installation or setup command(s)
@@ -52,7 +52,7 @@ myFunction({ input: "value" });
52
52
 
53
53
  #### 02-unit-tests-must-run-on-every-release
54
54
 
55
- A unit test suite must run automatically before every release. Failing tests must block the release — no silent skips or overrides.
55
+ A unit test suite MUST run automatically before every release. Failing tests must block the release — no silent skips or overrides.
56
56
 
57
57
  **Requirements:**
58
58
  - A `make test` target must exist and run the full suite
@@ -67,7 +67,7 @@ A unit test suite must run automatically before every release. Failing tests mus
67
67
 
68
68
  #### 03-project-must-comply-with-xdrs
69
69
 
70
- All XDRs that apply to the project's scope (as listed in [.xdrs/index.md](../../../index.md)) must be followed. A deviation requires a project-local XDR documenting the override.
70
+ All XDRs that apply to the project's scope (as listed in [.xdrs/index.md](../../../index.md)) MUST be followed. A deviation requires a project-local XDR documenting the override.
71
71
 
72
72
  **Requirements:**
73
73
  - Review applicable XDRs before any significant implementation
@@ -77,7 +77,7 @@ All XDRs that apply to the project's scope (as listed in [.xdrs/index.md](../../
77
77
 
78
78
  #### 04-project-must-have-linting
79
79
 
80
- Projects larger than 10 files or 200 lines of code must have a linter configured and actively enforced. Lint failures block CI builds.
80
+ Projects larger than 10 files or 200 lines of code MUST have a linter configured and actively enforced. Lint failures block CI builds.
81
81
 
82
82
  **Requirements:**
83
83
  - `make lint` runs the linter with zero-warning tolerance
@@ -93,7 +93,7 @@ Projects larger than 10 files or 200 lines of code must have a linter configured
93
93
 
94
94
  #### 05-project-structure-must-be-clear
95
95
 
96
- Directory and file layout must be self-explanatory: source code, tests, configuration, and examples must be clearly separated and named.
96
+ Directory and file layout MUST be self-explanatory: source code, tests, configuration, and examples must be clearly separated and named.
97
97
 
98
98
  **Requirements:**
99
99
  - Directory names must reflect their purpose (`src/`, `lib/`, `tests/`, `examples/`, `docs/`)
@@ -118,7 +118,7 @@ Directory and file layout must be self-explanatory: source code, tests, configur
118
118
 
119
119
  #### 06-libraries-must-have-runnable-examples
120
120
 
121
- Projects that are libraries or shared utilities must include an `examples/` directory. Each subdirectory represents a usage scenario and must be independently runnable. Examples that are "offline" (require no external credentials, no running servers, no paid APIs, and no environment-specific configuration outside the repository) must be executed as part of `make test`. Examples that depend on external entities may be left out of `make test`.
121
+ Projects that are libraries or shared utilities MUST include an `examples/` directory. Each subdirectory represents a usage scenario and must be independently runnable. Examples that are "offline" (require no external credentials, no running servers, no paid APIs, and no environment-specific configuration outside the repository) must be executed as part of `make test`. Examples that depend on external entities may be left out of `make test`.
122
122
 
123
123
  **Requirements:**
124
124
  - `examples/` must contain at least one subdirectory per major usage scenario
@@ -170,7 +170,7 @@ all:
170
170
 
171
171
  #### 07-statistical-models-must-have-eval-targets
172
172
 
173
- Projects that contain statistical models (e.g., ML models, LLM-based evaluators, classifiers, ranking systems, or any component whose output quality is measured probabilistically) must define measurable performance thresholds and verify them automatically.
173
+ Projects that contain statistical models (e.g., ML models, LLM-based evaluators, classifiers, ranking systems, or any component whose output quality is measured probabilistically) MUST define measurable performance thresholds and verify them automatically.
174
174
 
175
175
  **Requirements:**
176
176
  - A `make eval` target must exist and execute all performance evaluations
@@ -29,7 +29,7 @@ All implementation practices derive from three guiding principles:
29
29
 
30
30
  #### 01-no-secrets-on-disk
31
31
 
32
- Secrets must never be stored on the disk of a developer machine or server. This includes `.env` files (even when gitignored), plaintext config files, embedded in source code, or any other file-based storage.
32
+ Secrets MUST NEVER be stored on the disk of a developer machine or server. This includes `.env` files (even when gitignored), plaintext config files, embedded in source code, or any other file-based storage.
33
33
 
34
34
  The only acceptable local persistence is through the operating system's native secret manager (e.g., macOS Keychain, Windows Credential Manager, Linux Secret Service).
35
35
 
@@ -37,7 +37,7 @@ The only acceptable local persistence is through the operating system's native s
37
37
 
38
38
  #### 02-local-dev-uses-native-keychain
39
39
 
40
- During local development, secrets must be stored and retrieved using the native OS secret manager. Use cross-platform libraries to keep the code OS-agnostic:
40
+ During local development, secrets MUST be stored and retrieved using the native OS secret manager. Use cross-platform libraries to keep the code OS-agnostic:
41
41
 
42
42
  | Language | Library |
43
43
  |----------|---------|
@@ -51,7 +51,7 @@ The "group" (service name) defaults to the module name. The secret identifier sh
51
51
 
52
52
  #### 03-fallback-lookup-order
53
53
 
54
- Secret fetching must implement a fallback chain in the following order:
54
+ Secret fetching MUST implement a fallback chain in the following order:
55
55
 
56
56
  1. **Native OS keychain** — attempt to retrieve the secret using the local keychain library (used during local development).
57
57
  2. **Cloud secret manager** — if not found locally, fetch from the configured cloud secret manager (AWS Secrets Manager, Azure Key Vault, etc.) (used in cloud environments).
@@ -66,13 +66,13 @@ Secret 'db-password' could not be found in keychain under group 'mymodule' or in
66
66
 
67
67
  #### 04-secret-fetching-in-connector
68
68
 
69
- The secret fetching logic (including the fallback chain from rule 03) must live in a dedicated "connector" module or function. This isolates secret-access concerns from business logic and provides a single point to configure secret sources, caching policy, and error handling.
69
+ The secret fetching logic (including the fallback chain from rule 03) MUST live in a dedicated "connector" module or function. This isolates secret-access concerns from business logic and provides a single point to configure secret sources, caching policy, and error handling.
70
70
 
71
71
  ---
72
72
 
73
73
  #### 05-setup-secrets-makefile-target
74
74
 
75
- Every module that requires secrets must expose a `setup-secrets` Makefile target. This target:
75
+ Every module that requires secrets MUST expose a `setup-secrets` Makefile target. This target:
76
76
 
77
77
  - Prompts the user for each required secret value interactively.
78
78
  - If the user provides an empty value, the existing secret is not updated.
@@ -120,13 +120,13 @@ In library code (Python, JS/TS, Go), continue using the cross-platform libraries
120
120
 
121
121
  #### 06-never-log-or-leak-secrets
122
122
 
123
- Secrets must never be logged under any circumstance or sent to any service that is not clearly the intended consumer of that secret (authentication, encryption, etc.). This applies to all log levels including debug and trace. Error messages must reference the secret name or identifier, never its value.
123
+ Secrets MUST NEVER be logged under any circumstance or sent to any service that is not clearly the intended consumer of that secret (authentication, encryption, etc.). This applies to all log levels including debug and trace. Error messages must reference the secret name or identifier, never its value.
124
124
 
125
125
  ---
126
126
 
127
127
  #### 07-prefer-dynamic-fetching
128
128
 
129
- Wherever possible, fetch secrets dynamically from the secret manager at the time of use. Avoid storing secrets in global variables or caching them indefinitely. Dynamic fetching through a specialized service enables:
129
+ Wherever possible, secrets SHOULD be fetched dynamically from the secret manager at the time of use. Avoid storing secrets in global variables or caching them indefinitely. Dynamic fetching through a specialized service enables:
130
130
 
131
131
  - Automatic password rotation without redeployment.
132
132
  - Immediate propagation of rotated secrets.
@@ -138,7 +138,7 @@ Short-lived caching (e.g., a few minutes) is acceptable when performance require
138
138
 
139
139
  #### 08-prefer-fetching-at-point-of-use
140
140
 
141
- Prefer fetching the secret inside the function that directly needs it rather than passing it through multiple layers as a function argument. This minimizes the exposure surface by reducing the number of code paths that handle the raw secret value.
141
+ Developers SHOULD prefer fetching the secret inside the function that directly needs it rather than passing it through multiple layers as a function argument. This minimizes the exposure surface by reducing the number of code paths that handle the raw secret value.
142
142
 
143
143
  Passing secrets via function arguments is acceptable when the consuming function cannot access the connector directly, but the default design should fetch at the point of use.
144
144
 
@@ -27,7 +27,7 @@ Prefer functional programming: pure functions with clear input → processing
27
27
 
28
28
  #### 02-prefer-explicit-calls-over-indirections
29
29
 
30
- A sequence of direct calls to libraries and resources makes logic straightforward. Avoid:
30
+ Developers SHOULD prefer a sequence of direct calls to libraries and resources to keep logic straightforward. Avoid:
31
31
 
32
32
  - Aspect-oriented programming (AOP)
33
33
  - Implicit context injection / dependency injection containers
@@ -103,7 +103,7 @@ function createServerConfig(opts: Partial<ServerOpts>): ServerConfig {
103
103
 
104
104
  #### 05-abstractions-for-business-logic-are-encouraged
105
105
 
106
- Extracting domain logic into a named function is **encouraged** when it:
106
+ Developers SHOULD extract domain logic into a named function when it:
107
107
 
108
108
  - Encapsulates a business rule so the reader does not need to parse low-level conditions to understand domain intent.
109
109
  - Communicates intent at a glance, making compound conditions or multi-step checks self-describing.
@@ -122,6 +122,6 @@ if (event.status === 'active' && event.role !== 'guest' && event.quota > 0) { ..
122
122
 
123
123
  #### 06-idiomatic-framework-patterns-are-exempt
124
124
 
125
- React hooks, higher-order components, middleware chains, and similar patterns established by the framework in use are **not** considered unnecessary abstraction. The reader already expects them, and fighting the framework's idioms creates more confusion than it removes.
125
+ React hooks, higher-order components, middleware chains, and similar patterns established by the framework in use MUST NOT be treated as unnecessary abstraction. The reader already expects them, and fighting the framework's idioms creates more confusion than it removes.
126
126
 
127
127
  This exemption does not override other rules — a trivial wrapper inside a hook is still prohibited.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentme",
3
- "version": "0.25.0",
3
+ "version": "0.25.2",
4
4
  "description": "",
5
5
  "dependencies": {
6
6
  "filedist": "^0.39.0"
@@ -18,6 +18,6 @@
18
18
  "url": "https://github.com/flaviostutz/agentme.git"
19
19
  },
20
20
  "devDependencies": {
21
- "xdrs-core": "^0.37.1"
21
+ "xdrs-core": "^0.38.0"
22
22
  }
23
23
  }