Skip to main content

aube_codes/
warnings.rs

1//! Warning codes (`WARN_AUBE_*`).
2//!
3//! Same shape as `errors`: each constant value matches its
4//! identifier; `ALL` carries the [`crate::CodeMeta`] entries the
5//! generated docs page and self-tests consume. Warnings never
6//! change exit status, so `exit_code` is always `None` here.
7
8use crate::CodeMeta;
9
10// ── pnpmfile / hooks ────────────────────────────────────────────────
11pub const WARN_AUBE_PNPMFILE_NOT_FOUND: &str = "WARN_AUBE_PNPMFILE_NOT_FOUND";
12pub const WARN_AUBE_PNPMFILE_STDERR_FORWARDER: &str = "WARN_AUBE_PNPMFILE_STDERR_FORWARDER";
13pub const WARN_AUBE_HOOK_IMPORTER_MUTATED: &str = "WARN_AUBE_HOOK_IMPORTER_MUTATED";
14pub const WARN_AUBE_HOOK_IMPORTER_ADDED: &str = "WARN_AUBE_HOOK_IMPORTER_ADDED";
15pub const WARN_AUBE_HOOK_IDENTITY_REWRITTEN: &str = "WARN_AUBE_HOOK_IDENTITY_REWRITTEN";
16pub const WARN_AUBE_HOOK_PACKAGE_ADDED: &str = "WARN_AUBE_HOOK_PACKAGE_ADDED";
17
18// ── install lifecycle ───────────────────────────────────────────────
19pub const WARN_AUBE_IGNORED_BUILD_SCRIPTS: &str = "WARN_AUBE_IGNORED_BUILD_SCRIPTS";
20#[rustfmt::skip] pub const WARN_AUBE_SUSPICIOUS_LIFECYCLE_SCRIPT: &str = "WARN_AUBE_SUSPICIOUS_LIFECYCLE_SCRIPT";
21#[rustfmt::skip] pub const WARN_AUBE_WINDOWS_JOB_OBJECT_UNAVAILABLE: &str = "WARN_AUBE_WINDOWS_JOB_OBJECT_UNAVAILABLE";
22pub const WARN_AUBE_MISSING_INTEGRITY: &str = "WARN_AUBE_MISSING_INTEGRITY";
23pub const WARN_AUBE_CACHE_WRITE_FAILED: &str = "WARN_AUBE_CACHE_WRITE_FAILED";
24pub const WARN_AUBE_CLONE_STRATEGY_FALLBACK: &str = "WARN_AUBE_CLONE_STRATEGY_FALLBACK";
25pub const WARN_AUBE_LTHASH_MISMATCH: &str = "WARN_AUBE_LTHASH_MISMATCH";
26pub const WARN_AUBE_DELTA_INVALIDATE_FAILED: &str = "WARN_AUBE_DELTA_INVALIDATE_FAILED";
27pub const WARN_AUBE_GVS_INCOMPATIBLE: &str = "WARN_AUBE_GVS_INCOMPATIBLE";
28pub const WARN_AUBE_GVS_MODE_CHANGED: &str = "WARN_AUBE_GVS_MODE_CHANGED";
29
30// ── settings / config validation ────────────────────────────────────
31pub const WARN_AUBE_INVALID_CONCURRENCY: &str = "WARN_AUBE_INVALID_CONCURRENCY";
32pub const WARN_AUBE_INVALID_TRUST_POLICY: &str = "WARN_AUBE_INVALID_TRUST_POLICY";
33pub const WARN_AUBE_OVERRIDE_MISSING_DEP: &str = "WARN_AUBE_OVERRIDE_MISSING_DEP";
34pub const WARN_AUBE_OVERRIDE_DOLLAR_REF_DEPRECATED: &str =
35    "WARN_AUBE_OVERRIDE_DOLLAR_REF_DEPRECATED";
36pub const WARN_AUBE_INVALID_PEER_PATTERN: &str = "WARN_AUBE_INVALID_PEER_PATTERN";
37pub const WARN_AUBE_INVALID_SAVE_PREFIX: &str = "WARN_AUBE_INVALID_SAVE_PREFIX";
38pub const WARN_AUBE_CONCURRENCY_ENV_INVALID: &str = "WARN_AUBE_CONCURRENCY_ENV_INVALID";
39
40// ── update / prerelease ─────────────────────────────────────────────
41pub const WARN_AUBE_PRERELEASE_CHECK_SKIPPED: &str = "WARN_AUBE_PRERELEASE_CHECK_SKIPPED";
42pub const WARN_AUBE_WORKSPACE_PACKAGE_MISSING_NAME: &str =
43    "WARN_AUBE_WORKSPACE_PACKAGE_MISSING_NAME";
44
45// ── audit / npmrc ───────────────────────────────────────────────────
46pub const WARN_AUBE_AUDIT_FETCH_FAILED: &str = "WARN_AUBE_AUDIT_FETCH_FAILED";
47pub const WARN_AUBE_TOKEN_CHMOD_FAILED: &str = "WARN_AUBE_TOKEN_CHMOD_FAILED";
48
49// ── registry config (trust gates + validation) ──────────────────────
50pub const WARN_AUBE_UNTRUSTED_PROXY: &str = "WARN_AUBE_UNTRUSTED_PROXY";
51pub const WARN_AUBE_UNTRUSTED_STRICT_SSL_DISABLE: &str = "WARN_AUBE_UNTRUSTED_STRICT_SSL_DISABLE";
52pub const WARN_AUBE_INVALID_LOCAL_ADDRESS: &str = "WARN_AUBE_INVALID_LOCAL_ADDRESS";
53pub const WARN_AUBE_INVALID_MAXSOCKETS: &str = "WARN_AUBE_INVALID_MAXSOCKETS";
54pub const WARN_AUBE_UNSCOPED_AUTH_RESCOPED: &str = "WARN_AUBE_UNSCOPED_AUTH_RESCOPED";
55pub const WARN_AUBE_UNTRUSTED_AUTH_ENV: &str = "WARN_AUBE_UNTRUSTED_AUTH_ENV";
56pub const WARN_AUBE_UNTRUSTED_TOKEN_HELPER: &str = "WARN_AUBE_UNTRUSTED_TOKEN_HELPER";
57pub const WARN_AUBE_INVALID_TOKEN_HELPER: &str = "WARN_AUBE_INVALID_TOKEN_HELPER";
58pub const WARN_AUBE_TOKEN_HELPER_SPAWN_FAILED: &str = "WARN_AUBE_TOKEN_HELPER_SPAWN_FAILED";
59pub const WARN_AUBE_TOKEN_HELPER_NON_ZERO_EXIT: &str = "WARN_AUBE_TOKEN_HELPER_NON_ZERO_EXIT";
60
61// ── registry HTTP retries ───────────────────────────────────────────
62pub const WARN_AUBE_HTTP_RETRY_TRANSIENT: &str = "WARN_AUBE_HTTP_RETRY_TRANSIENT";
63pub const WARN_AUBE_HTTP_RETRY_TRANSPORT: &str = "WARN_AUBE_HTTP_RETRY_TRANSPORT";
64pub const WARN_AUBE_HTTP_RETRY_BODY_READ: &str = "WARN_AUBE_HTTP_RETRY_BODY_READ";
65pub const WARN_AUBE_HTTP_RETRY_BODY_DECODE: &str = "WARN_AUBE_HTTP_RETRY_BODY_DECODE";
66
67// ── registry caching / perf ─────────────────────────────────────────
68pub const WARN_AUBE_PACKUMENT_CACHE_WRITE: &str = "WARN_AUBE_PACKUMENT_CACHE_WRITE";
69pub const WARN_AUBE_SLOW_METADATA: &str = "WARN_AUBE_SLOW_METADATA";
70pub const WARN_AUBE_SLOW_TARBALL: &str = "WARN_AUBE_SLOW_TARBALL";
71
72// ── registry TLS / proxy config ─────────────────────────────────────
73pub const WARN_AUBE_INVALID_HTTPS_PROXY: &str = "WARN_AUBE_INVALID_HTTPS_PROXY";
74pub const WARN_AUBE_INVALID_HTTP_PROXY: &str = "WARN_AUBE_INVALID_HTTP_PROXY";
75pub const WARN_AUBE_INVALID_CA: &str = "WARN_AUBE_INVALID_CA";
76pub const WARN_AUBE_INVALID_CAFILE: &str = "WARN_AUBE_INVALID_CAFILE";
77pub const WARN_AUBE_UNREADABLE_CAFILE: &str = "WARN_AUBE_UNREADABLE_CAFILE";
78pub const WARN_AUBE_INVALID_CLIENT_CERT: &str = "WARN_AUBE_INVALID_CLIENT_CERT";
79
80// ── resolver ────────────────────────────────────────────────────────
81pub const WARN_AUBE_UNSUPPORTED_PLATFORM_INSTALL: &str = "WARN_AUBE_UNSUPPORTED_PLATFORM_INSTALL";
82pub const WARN_AUBE_EXOTIC_SUBDEP_SKIPPED: &str = "WARN_AUBE_EXOTIC_SUBDEP_SKIPPED";
83pub const WARN_AUBE_PEER_DEDUPE_COLLISION: &str = "WARN_AUBE_PEER_DEDUPE_COLLISION";
84
85// ── lockfile ────────────────────────────────────────────────────────
86pub const WARN_AUBE_LOCKFILE_MERGE_CONFLICT: &str = "WARN_AUBE_LOCKFILE_MERGE_CONFLICT";
87pub const WARN_AUBE_LOCKFILE_MERGE_CLEANUP_FAILED: &str = "WARN_AUBE_LOCKFILE_MERGE_CLEANUP_FAILED";
88pub const WARN_AUBE_LOCKFILE_CONFLICT_MARKERS: &str = "WARN_AUBE_LOCKFILE_CONFLICT_MARKERS";
89pub const WARN_AUBE_YARN_BERRY_UNSUPPORTED: &str = "WARN_AUBE_YARN_BERRY_UNSUPPORTED";
90
91// ── progress UI ─────────────────────────────────────────────────────
92pub const WARN_AUBE_PROGRESS_OVERFLOW: &str = "WARN_AUBE_PROGRESS_OVERFLOW";
93
94// ── workspace recursion ─────────────────────────────────────────────
95pub const WARN_AUBE_WORKSPACE_TOPO_CYCLE: &str = "WARN_AUBE_WORKSPACE_TOPO_CYCLE";
96
97// ── supply chain (add-time) ─────────────────────────────────────────
98pub const WARN_AUBE_LOW_DOWNLOAD_PACKAGE: &str = "WARN_AUBE_LOW_DOWNLOAD_PACKAGE";
99pub const WARN_AUBE_ADVISORY_CHECK_FAILED: &str = "WARN_AUBE_ADVISORY_CHECK_FAILED";
100pub const WARN_AUBE_OSV_MIRROR_REFRESH_FAILED: &str = "WARN_AUBE_OSV_MIRROR_REFRESH_FAILED";
101pub const WARN_AUBE_OSV_BLOOM_REFRESH_FAILED: &str = "WARN_AUBE_OSV_BLOOM_REFRESH_FAILED";
102pub const WARN_AUBE_SECURITY_SCANNER_FINDING: &str = "WARN_AUBE_SECURITY_SCANNER_FINDING";
103
104// ── node runtime ────────────────────────────────────────────────────
105#[rustfmt::skip] pub const WARN_AUBE_RUNTIME_VERSION_MISMATCH: &str = "WARN_AUBE_RUNTIME_VERSION_MISMATCH";
106pub const WARN_AUBE_RUNTIME_MISE_FALLBACK: &str = "WARN_AUBE_RUNTIME_MISE_FALLBACK";
107#[rustfmt::skip] pub const WARN_AUBE_RUNTIME_PIN_NOT_RECORDED: &str = "WARN_AUBE_RUNTIME_PIN_NOT_RECORDED";
108
109/// Stable category labels that group codes in the generated docs.
110/// Public so the docs generator can iterate them deterministically.
111pub mod category {
112    pub const PNPMFILE_HOOKS: &str = "pnpmfile / hooks";
113    pub const INSTALL_LIFECYCLE: &str = "Install lifecycle";
114    pub const SETTINGS_CONFIG: &str = "Settings / config validation";
115    pub const UPDATE_PRERELEASE: &str = "Update / prerelease";
116    pub const AUDIT_NPMRC: &str = "Audit / npmrc";
117    pub const REGISTRY_CONFIG: &str = "Registry config (trust gates)";
118    pub const HTTP_RETRIES: &str = "Registry HTTP retries";
119    pub const REGISTRY_PERF: &str = "Registry caching / perf";
120    pub const REGISTRY_TLS: &str = "Registry TLS / proxy";
121    pub const RESOLVER: &str = "Resolver";
122    pub const LOCKFILE: &str = "Lockfile";
123    pub const PROGRESS_UI: &str = "Progress UI";
124    pub const WORKSPACE_RECURSION: &str = "Workspace recursion";
125    pub const SUPPLY_CHAIN: &str = "Supply chain (add-time)";
126    pub const NODE_RUNTIME: &str = "Node runtime";
127}
128
129/// Registry of every warning code with its category and description.
130/// Walked by the `generate-error-codes-docs` binary and by the
131/// self-tests in `lib.rs`. New codes must be added here.
132pub const ALL: &[CodeMeta] = &[
133    // pnpmfile / hooks
134    CodeMeta {
135        name: WARN_AUBE_PNPMFILE_NOT_FOUND,
136        category: category::PNPMFILE_HOOKS,
137        description: "A pnpmfile path (CLI arg, workspace setting, global) pointed at a missing file.",
138        exit_code: None,
139    },
140    CodeMeta {
141        name: WARN_AUBE_PNPMFILE_STDERR_FORWARDER,
142        category: category::PNPMFILE_HOOKS,
143        description: "The background task forwarding pnpmfile stderr panicked.",
144        exit_code: None,
145    },
146    CodeMeta {
147        name: WARN_AUBE_HOOK_IMPORTER_MUTATED,
148        category: category::PNPMFILE_HOOKS,
149        description: "A pnpmfile `afterAllResolved` hook mutated `importers[...]`; aube ignored the edit.",
150        exit_code: None,
151    },
152    CodeMeta {
153        name: WARN_AUBE_HOOK_IMPORTER_ADDED,
154        category: category::PNPMFILE_HOOKS,
155        description: "A pnpmfile `afterAllResolved` hook added a new `importers[...]` entry; aube ignored it.",
156        exit_code: None,
157    },
158    CodeMeta {
159        name: WARN_AUBE_HOOK_IDENTITY_REWRITTEN,
160        category: category::PNPMFILE_HOOKS,
161        description: "A pnpmfile hook rewrote a package's `(name, version)` identity; aube reverted the edit.",
162        exit_code: None,
163    },
164    CodeMeta {
165        name: WARN_AUBE_HOOK_PACKAGE_ADDED,
166        category: category::PNPMFILE_HOOKS,
167        description: "A pnpmfile hook added a wholly-new package entry; aube ignored it.",
168        exit_code: None,
169    },
170    // Install lifecycle
171    CodeMeta {
172        name: WARN_AUBE_IGNORED_BUILD_SCRIPTS,
173        category: category::INSTALL_LIFECYCLE,
174        description: "Dep had `preinstall`/`install`/`postinstall` scripts but isn't on the `allowBuilds` allowlist. Run `aube approve-builds`.",
175        exit_code: None,
176    },
177    CodeMeta {
178        name: WARN_AUBE_SUSPICIOUS_LIFECYCLE_SCRIPT,
179        category: category::INSTALL_LIFECYCLE,
180        description: "A dependency's lifecycle script matched a dangerous-shape heuristic (curl|sh, eval+atob, credential-file read, secret-env exfil, exfil endpoint, bare-IP HTTP). Advisory only; the `allowBuilds` allowlist still gates execution. Inspect the script before approving the build.",
181        exit_code: None,
182    },
183    CodeMeta {
184        name: WARN_AUBE_WINDOWS_JOB_OBJECT_UNAVAILABLE,
185        category: category::INSTALL_LIFECYCLE,
186        description: "Windows: couldn't create or assign a kill-on-job-close job object for a lifecycle script. The script still runs, but on abort/failure its grandchildren (node-gyp / MSBuild / node) may be orphaned. Usually caused by a restrictive parent job or enterprise policy.",
187        exit_code: None,
188    },
189    CodeMeta {
190        name: WARN_AUBE_MISSING_INTEGRITY,
191        category: category::INSTALL_LIFECYCLE,
192        description: "Lockfile entry / registry response had no `dist.integrity`; importing without verification. Set `strict-store-integrity=true` to refuse.",
193        exit_code: None,
194    },
195    CodeMeta {
196        name: WARN_AUBE_CACHE_WRITE_FAILED,
197        category: category::INSTALL_LIFECYCLE,
198        description: "Couldn't write a package index to the on-disk cache. Non-fatal.",
199        exit_code: None,
200    },
201    CodeMeta {
202        name: WARN_AUBE_CLONE_STRATEGY_FALLBACK,
203        category: category::INSTALL_LIFECYCLE,
204        description: "`package-import-method=clone` will silently fall back to copy if the filesystem doesn't support reflinks.",
205        exit_code: None,
206    },
207    CodeMeta {
208        name: WARN_AUBE_LTHASH_MISMATCH,
209        category: category::INSTALL_LIFECYCLE,
210        description: "Incremental and full LtHash digests disagreed — homomorphic invariant broken. Real bug signal.",
211        exit_code: None,
212    },
213    CodeMeta {
214        name: WARN_AUBE_DELTA_INVALIDATE_FAILED,
215        category: category::INSTALL_LIFECYCLE,
216        description: "Delta install couldn't invalidate a package directory during cleanup.",
217        exit_code: None,
218    },
219    CodeMeta {
220        name: WARN_AUBE_GVS_INCOMPATIBLE,
221        category: category::INSTALL_LIFECYCLE,
222        description: "A package isn't compatible with aube's global virtual store; installed per-project instead.",
223        exit_code: None,
224    },
225    CodeMeta {
226        name: WARN_AUBE_GVS_MODE_CHANGED,
227        category: category::INSTALL_LIFECYCLE,
228        description: "Switching between gvs-on and gvs-off; removing `node_modules` and reinstalling from scratch.",
229        exit_code: None,
230    },
231    // Settings / config validation
232    CodeMeta {
233        name: WARN_AUBE_INVALID_CONCURRENCY,
234        category: category::SETTINGS_CONFIG,
235        description: "`network-concurrency` or `link-concurrency` was 0 (must be ≥ 1).",
236        exit_code: None,
237    },
238    CodeMeta {
239        name: WARN_AUBE_INVALID_TRUST_POLICY,
240        category: category::SETTINGS_CONFIG,
241        description: "A `trustPolicyExclude` entry was malformed and skipped.",
242        exit_code: None,
243    },
244    CodeMeta {
245        name: WARN_AUBE_OVERRIDE_MISSING_DEP,
246        category: category::SETTINGS_CONFIG,
247        description: "An `overrides` `$ref` pointed at a package not in any of the importer's dependency lists.",
248        exit_code: None,
249    },
250    CodeMeta {
251        name: WARN_AUBE_OVERRIDE_DOLLAR_REF_DEPRECATED,
252        category: category::SETTINGS_CONFIG,
253        description: "An `overrides` entry used pnpm's deprecated `$` version reference syntax.",
254        exit_code: None,
255    },
256    CodeMeta {
257        name: WARN_AUBE_INVALID_PEER_PATTERN,
258        category: category::SETTINGS_CONFIG,
259        description: "A `peerDependencyRules` pattern was unparseable and skipped.",
260        exit_code: None,
261    },
262    CodeMeta {
263        name: WARN_AUBE_INVALID_SAVE_PREFIX,
264        category: category::SETTINGS_CONFIG,
265        description: "`save-prefix` was something other than `^`, `~`, or empty. Falling back to `^`.",
266        exit_code: None,
267    },
268    CodeMeta {
269        name: WARN_AUBE_CONCURRENCY_ENV_INVALID,
270        category: category::SETTINGS_CONFIG,
271        description: "The `AUBE_CONCURRENCY` env var was outside the `[floor, ceiling]` range or non-numeric.",
272        exit_code: None,
273    },
274    // Update / prerelease
275    CodeMeta {
276        name: WARN_AUBE_PRERELEASE_CHECK_SKIPPED,
277        category: category::UPDATE_PRERELEASE,
278        description: "`aube update` couldn't fetch the packument or got a non-semver `latest` tag; preserved-prerelease check skipped for that package.",
279        exit_code: None,
280    },
281    CodeMeta {
282        name: WARN_AUBE_WORKSPACE_PACKAGE_MISSING_NAME,
283        category: category::UPDATE_PRERELEASE,
284        description: "A discovered workspace package had no `name` field, so update skipped local workspace version registration for it.",
285        exit_code: None,
286    },
287    // Audit / npmrc
288    CodeMeta {
289        name: WARN_AUBE_AUDIT_FETCH_FAILED,
290        category: category::AUDIT_NPMRC,
291        description: "`aube audit --ignore-unfixable` couldn't fetch a packument; advisories for that package are kept verbatim.",
292        exit_code: None,
293    },
294    CodeMeta {
295        name: WARN_AUBE_TOKEN_CHMOD_FAILED,
296        category: category::AUDIT_NPMRC,
297        description: "`chmod 0600` on the auth token file failed; the file may be world-readable.",
298        exit_code: None,
299    },
300    // Registry config (trust gates)
301    CodeMeta {
302        name: WARN_AUBE_UNTRUSTED_PROXY,
303        category: category::REGISTRY_CONFIG,
304        description: "A `*-proxy` setting came from a source aube doesn't trust (committed `.npmrc` can't set proxies).",
305        exit_code: None,
306    },
307    CodeMeta {
308        name: WARN_AUBE_UNTRUSTED_STRICT_SSL_DISABLE,
309        category: category::REGISTRY_CONFIG,
310        description: "`strict-ssl=false` came from a source aube doesn't trust. TLS validation stays on.",
311        exit_code: None,
312    },
313    CodeMeta {
314        name: WARN_AUBE_INVALID_LOCAL_ADDRESS,
315        category: category::REGISTRY_CONFIG,
316        description: "`local-address` setting wasn't a valid IP.",
317        exit_code: None,
318    },
319    CodeMeta {
320        name: WARN_AUBE_INVALID_MAXSOCKETS,
321        category: category::REGISTRY_CONFIG,
322        description: "`maxsockets` was 0 or non-numeric.",
323        exit_code: None,
324    },
325    CodeMeta {
326        name: WARN_AUBE_UNSCOPED_AUTH_RESCOPED,
327        category: category::REGISTRY_CONFIG,
328        description: "An unscoped registry credential was pinned to the registry declared by the same config source.",
329        exit_code: None,
330    },
331    CodeMeta {
332        name: WARN_AUBE_UNTRUSTED_AUTH_ENV,
333        category: category::REGISTRY_CONFIG,
334        description: "An auth setting from project-controlled `.npmrc` contained an environment variable reference and was ignored.",
335        exit_code: None,
336    },
337    CodeMeta {
338        name: WARN_AUBE_UNTRUSTED_TOKEN_HELPER,
339        category: category::REGISTRY_CONFIG,
340        description: "`tokenHelper` came from an untrusted source (CVE-2025-69262 class).",
341        exit_code: None,
342    },
343    CodeMeta {
344        name: WARN_AUBE_INVALID_TOKEN_HELPER,
345        category: category::REGISTRY_CONFIG,
346        description: "`tokenHelper` value wasn't a sanitized absolute path.",
347        exit_code: None,
348    },
349    CodeMeta {
350        name: WARN_AUBE_TOKEN_HELPER_SPAWN_FAILED,
351        category: category::REGISTRY_CONFIG,
352        description: "`tokenHelper` couldn't be spawned.",
353        exit_code: None,
354    },
355    CodeMeta {
356        name: WARN_AUBE_TOKEN_HELPER_NON_ZERO_EXIT,
357        category: category::REGISTRY_CONFIG,
358        description: "`tokenHelper` exited non-zero.",
359        exit_code: None,
360    },
361    // Registry HTTP retries
362    CodeMeta {
363        name: WARN_AUBE_HTTP_RETRY_TRANSIENT,
364        category: category::HTTP_RETRIES,
365        description: "Retrying after a transient HTTP status (429, 5xx).",
366        exit_code: None,
367    },
368    CodeMeta {
369        name: WARN_AUBE_HTTP_RETRY_TRANSPORT,
370        category: category::HTTP_RETRIES,
371        description: "Retrying after a transport / connection error.",
372        exit_code: None,
373    },
374    CodeMeta {
375        name: WARN_AUBE_HTTP_RETRY_BODY_READ,
376        category: category::HTTP_RETRIES,
377        description: "Retrying after a response-body read error (timeout, partial body).",
378        exit_code: None,
379    },
380    CodeMeta {
381        name: WARN_AUBE_HTTP_RETRY_BODY_DECODE,
382        category: category::HTTP_RETRIES,
383        description: "Retrying after a JSON decode error on the response body.",
384        exit_code: None,
385    },
386    // Registry caching / perf
387    CodeMeta {
388        name: WARN_AUBE_PACKUMENT_CACHE_WRITE,
389        category: category::REGISTRY_PERF,
390        description: "Couldn't write a packument to the on-disk cache after a successful fetch. Non-fatal; next install will refetch.",
391        exit_code: None,
392    },
393    CodeMeta {
394        name: WARN_AUBE_SLOW_METADATA,
395        category: category::REGISTRY_PERF,
396        description: "One or more packument fetches exceeded `fetchWarnTimeoutMs`. Emitted as a grouped summary so a burst of slow fetches produces one warning, not one per fetch.",
397        exit_code: None,
398    },
399    CodeMeta {
400        name: WARN_AUBE_SLOW_TARBALL,
401        category: category::REGISTRY_PERF,
402        description: "A tarball download fell below `fetchMinSpeedKiBps`.",
403        exit_code: None,
404    },
405    // Registry TLS / proxy
406    CodeMeta {
407        name: WARN_AUBE_INVALID_HTTPS_PROXY,
408        category: category::REGISTRY_TLS,
409        description: "`https-proxy` URL didn't parse.",
410        exit_code: None,
411    },
412    CodeMeta {
413        name: WARN_AUBE_INVALID_HTTP_PROXY,
414        category: category::REGISTRY_TLS,
415        description: "`http-proxy` URL didn't parse.",
416        exit_code: None,
417    },
418    CodeMeta {
419        name: WARN_AUBE_INVALID_CA,
420        category: category::REGISTRY_TLS,
421        description: "Per-registry CA PEM didn't parse.",
422        exit_code: None,
423    },
424    CodeMeta {
425        name: WARN_AUBE_INVALID_CAFILE,
426        category: category::REGISTRY_TLS,
427        description: "`cafile` couldn't be parsed as a PEM bundle.",
428        exit_code: None,
429    },
430    CodeMeta {
431        name: WARN_AUBE_UNREADABLE_CAFILE,
432        category: category::REGISTRY_TLS,
433        description: "`cafile` couldn't be read from disk.",
434        exit_code: None,
435    },
436    CodeMeta {
437        name: WARN_AUBE_INVALID_CLIENT_CERT,
438        category: category::REGISTRY_TLS,
439        description: "Per-registry client `cert`/`key` PEM pair didn't parse.",
440        exit_code: None,
441    },
442    // Resolver
443    CodeMeta {
444        name: WARN_AUBE_UNSUPPORTED_PLATFORM_INSTALL,
445        category: category::RESOLVER,
446        description: "A required (non-optional) dep declared a platform aube doesn't satisfy; installing anyway.",
447        exit_code: None,
448    },
449    CodeMeta {
450        name: WARN_AUBE_EXOTIC_SUBDEP_SKIPPED,
451        category: category::RESOLVER,
452        description: "An optional or peer dep used an exotic specifier and was skipped under `blockExoticSubdeps=true`.",
453        exit_code: None,
454    },
455    CodeMeta {
456        name: WARN_AUBE_PEER_DEDUPE_COLLISION,
457        category: category::RESOLVER,
458        description: "`dedupe-peers=true` would have collapsed a distinct peer-variant; preserved the longer form to avoid dropping it.",
459        exit_code: None,
460    },
461    // Lockfile
462    CodeMeta {
463        name: WARN_AUBE_LOCKFILE_MERGE_CONFLICT,
464        category: category::LOCKFILE,
465        description: "Branch-lockfile merge had conflicting entries for the same dep_path; one was chosen.",
466        exit_code: None,
467    },
468    CodeMeta {
469        name: WARN_AUBE_LOCKFILE_MERGE_CLEANUP_FAILED,
470        category: category::LOCKFILE,
471        description: "After a successful merge, removing one of the merged branch lockfiles failed.",
472        exit_code: None,
473    },
474    CodeMeta {
475        name: WARN_AUBE_LOCKFILE_CONFLICT_MARKERS,
476        category: category::LOCKFILE,
477        description: "The active lockfile contains Git conflict markers; aube is regenerating it from package.json.",
478        exit_code: None,
479    },
480    CodeMeta {
481        name: WARN_AUBE_YARN_BERRY_UNSUPPORTED,
482        category: category::LOCKFILE,
483        description: "A Yarn Berry `patch:` / `portal:` / `exec:` protocol — or any unrecognized protocol — was found in `yarn.lock`. Entry was skipped.",
484        exit_code: None,
485    },
486    // Progress UI
487    CodeMeta {
488        name: WARN_AUBE_PROGRESS_OVERFLOW,
489        category: category::PROGRESS_UI,
490        description: "Install progress numerator exceeded the resolved-package denominator. Display clamps to total; the warning surfaces the bookkeeping mismatch so the underlying race can be diagnosed.",
491        exit_code: None,
492    },
493    // Workspace recursion
494    CodeMeta {
495        name: WARN_AUBE_WORKSPACE_TOPO_CYCLE,
496        category: category::WORKSPACE_RECURSION,
497        description: "Topological sort of `aube run -r` / `aube exec -r` selected packages found a dependency cycle. Cycle members run in workspace-listing order after the rest of the topo-sorted set.",
498        exit_code: None,
499    },
500    // Supply chain (add-time)
501    CodeMeta {
502        name: WARN_AUBE_LOW_DOWNLOAD_PACKAGE,
503        category: category::SUPPLY_CHAIN,
504        description: "`aube add` flagged a package whose weekly downloads fall below `lowDownloadThreshold`. Interactive sessions prompt for confirmation; non-interactive contexts fail with `ERR_AUBE_LOW_DOWNLOAD_PACKAGE` unless `--allow-low-downloads` is passed.",
505        exit_code: None,
506    },
507    CodeMeta {
508        name: WARN_AUBE_ADVISORY_CHECK_FAILED,
509        category: category::SUPPLY_CHAIN,
510        description: "OSV `MAL-*` advisory check couldn't reach the API. With `advisoryCheck=on` (default) install continues; with `advisoryCheck=required` install fails closed.",
511        exit_code: None,
512    },
513    CodeMeta {
514        name: WARN_AUBE_OSV_MIRROR_REFRESH_FAILED,
515        category: category::SUPPLY_CHAIN,
516        description: "OSV advisory mirror used by `advisoryCheckOnInstall` failed to refresh (download, ETag, or zip parse error). With `advisoryCheckOnInstall=on` install proceeds against the previously cached index if any; with `advisoryCheckOnInstall=required` install fails closed with `ERR_AUBE_ADVISORY_CHECK_FAILED`.",
517        exit_code: None,
518    },
519    CodeMeta {
520        name: WARN_AUBE_OSV_BLOOM_REFRESH_FAILED,
521        category: category::SUPPLY_CHAIN,
522        description: "OSV bloom-filter prefilter used by `advisoryBloomCheck` failed to refresh (download or format-decode error). With `advisoryBloomCheck=on` install proceeds against the previously cached filter if any; with `advisoryBloomCheck=required` install fails closed with `ERR_AUBE_ADVISORY_CHECK_FAILED`.",
523        exit_code: None,
524    },
525    CodeMeta {
526        name: WARN_AUBE_SECURITY_SCANNER_FINDING,
527        category: category::SUPPLY_CHAIN,
528        description: "User-configured `securityScanner` returned a `warn`-level advisory. Install continues — only `fatal`-level advisories block.",
529        exit_code: None,
530    },
531    // Node runtime
532    CodeMeta {
533        name: WARN_AUBE_RUNTIME_VERSION_MISMATCH,
534        category: category::NODE_RUNTIME,
535        description: "The active Node.js doesn't satisfy the project's runtime requirement and `onFail: \"warn\"` keeps execution on the unsatisfying version.",
536        exit_code: None,
537    },
538    CodeMeta {
539        name: WARN_AUBE_RUNTIME_MISE_FALLBACK,
540        category: category::NODE_RUNTIME,
541        description: "`runtimeInstaller=auto` tried delegating a Node.js install to mise but mise failed; aube fell back to its own nodejs.org download.",
542        exit_code: None,
543    },
544    CodeMeta {
545        name: WARN_AUBE_RUNTIME_PIN_NOT_RECORDED,
546        category: category::NODE_RUNTIME,
547        description: "`devEngines.runtime` resolved to an exact Node.js version but the project's lockfile format (npm/yarn/bun) has no runtime entry shape, so the pin wasn't recorded. Subsequent runs re-resolve the range.",
548        exit_code: None,
549    },
550];