Repository navigation
mendr v0.2.4-alpha — repository audit hardening
Pre-releasemendr v0.2.4-alpha
Focused hardening release driven by the first audits run outside this
project: five public repositories (Browser Use, Mem0, CrewAI, Agno, LiteLLM),
run on Windows PowerShell with v0.2.3-alpha. Every Review finding was read in
the code; the defects that surfaced are fixed here and the same five
repositories were re-run.
This is an alpha. Nothing is applied and nothing is merged by any command.
v0.2.3-alpha is unchanged and remains valid for what it contained.
What the five repositories showed
| repository | Patch | Review before → after | informational before → after |
|---|---|---|---|
| browser-use | 0 | 2 → 2 | 28 → 28 |
| mem0 | 0 | 4 → 3 | 8 → 7 |
| crewAI | 0 | 3 → 3 | 58 → 58 |
| agno | 0 | 1 → 2 | 23 → 22 |
| litellm | 0 | 19 → 3 | 57 → 73 |
- Zero PATCH ELIGIBLE findings, before and after. None of these codebases
passes a literal model id to a first-party provider SDK request that resolves
in the same file; their requests go through their own wrappers, routers or
Azure. That is the correct answer, and it was confirmed by reading every
first-party request shape in the five repositories. - Every remaining Review finding is a genuine runtime default or a deployable
configuration value, each one confirmed in code: a tool's default image
model that reachesimages.generate, a provider class default that reaches
the SDK, a Helm chart's default model, a CLI default, a moderation hook's
default, a GitHub workflow'smodel:input. - Sixteen review candidates in LiteLLM were not selectors and are now
informational: cookbook and example-config directories, a form field's
placeholder text (120 rows from one schema file), a gitignored developer
config, a CI/QA fixture config carrying mock flags, model literals handed to
tokenizers, cost calculators and logging payloads, and a capability-probe
sentinel inside a parameter-mapping helper. - Thirteen genuine defaults in Mem0 and one in Agno had been filed as
informational and are now review candidates:this.model = config.model || "…",getattr(config, "model", "…"),os.environ.get("…_MODEL", "…"),
DEFAULT_CONFIG = { model: … }, amodels/-prefixed id, and anidfield on
an embedder class.
The claim from v0.2.3-alpha stands and is not widened: zero incorrect PATCH
ELIGIBLE findings across the current validation corpus, which is now the
twelve repositories of the previous release plus these five. It is not a claim
of zero false positives anywhere.
What changed
- Templates and fixtures.
.env.example,*.example.*,*.sample.*,
*-template.*,example_*.yaml,cookbook/,benchmarks/,notebooks/,
example_*/andsample_*/directories, JSON Schema files, a config the
repository's own.gitignorenames, and a config carrying mock-testing flags
are informational. A fake-key or fake-model entry inside a real config demotes
that entry only. - Router
model_listidiom.model_namebesidelitellm_paramsis the
client-facing alias; the siblingmodel:is the selector. UI metadata keys
(*_placeholder,*_hint,label,description) never select. - Never a selector: model ids passed to tokenizer or encoding helpers; local
model assignments, parameter defaults and lookup fallbacks inside pricing,
cost, tokenizer, logging, metrics ormap_*_paramshelpers; a response's own
modelfield being read back. A traced request in the same function still
wins over any of these name rules. - Genuine defaults are review candidates: assignment expressions
(this.model = …), lookup fallbacks on a model-named key,model:inside a
default-configuration object or dict (unless it is catalog-shaped),idon a
model/embedder class, andmodels/orpublishers/google/models/prefixed
ids. - Report. An informational reference now says "No migration action
required from this reference. Monitor provider status." — never "migrate
now". A registry date with no provider notice on file is printed as
"registry date YYYY-MM-DD (N d past), UNVERIFIED" and the next action asks
you to verify it with the provider; it is never called OVERDUE. Informational
references are collapsed to a count and the first five by default;
--verboselists them all and--jsonalways carries everything. Each
location in the JSON now carries its owndisposition
(patch/review/informational) beside the model-level decision. - Windows. The report is plain ASCII whenever stdout is not a terminal on
Windows (Tee-Object, a file, a variable) or the terminal is not known to be
UTF-8;--plainforces it anywhere andMENDR_UNICODE=1forces glyphs.
Progress lines go to stderr only when stderr is a terminal, so PowerShell 5.1
no longer wraps them in NativeCommandError;--quiet/--no-progress
silence them everywhere.
Acceptance gate (all met on the five repositories)
- Zero incorrect PATCH ELIGIBLE findings.
- Zero example, template or catalog files elevated to Review.
- Genuine runtime defaults remain Review, with evidence.
- No contradictory instructions; no unverified date presented as overdue.
- Clean Windows PowerShell output through Tee-Object, exit code 0, no errors.
- Byte-identical results across repeated runs.
Honest limits — unchanged from v0.2.3-alpha
- JavaScript, JSX, MJS and CJS are not analyzed. Disclosed on every run.
- Report comprehension has not been validated with external partners. The
five repositories above were run by this project, not by their maintainers.
That measurement is still the next milestone. - Live provider reconciliation is incomplete; the runtime connectors remain
optional preview. Do not connect an organization Admin key to evaluate mendr. - A configuration finding is a candidate, never a proven runtime control.
- Test and spec files are counted but their ids are not examined, by rule.
- Registry facts are never edited by a model. The
@YYYYMMDDVertex spelling of
Anthropic ids (claude-sonnet-4@20250514) is not yet normalized to the
-YYYYMMDDregistry form; it is on the registry list.
Install
npx github:ajitheee/mendr#v0.2.4-alpha audit .On Windows, if you pipe or capture the output, it is already plain ASCII.
--verbose prints every informational reference; --json carries everything.
For design partners
Run it on a repository you own and tell us six things: any wrong finding (file
and line); any retiring model you know you depend on that it missed; whether the
summary and next action were clear on first read; any installation friction;
whether you would let it run on a schedule; and what a migration PR would have
to prove before you merged it.