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_INVALID_PEER_PATTERN: &str = "WARN_AUBE_INVALID_PEER_PATTERN";
35pub const WARN_AUBE_INVALID_SAVE_PREFIX: &str = "WARN_AUBE_INVALID_SAVE_PREFIX";
36pub const WARN_AUBE_CONCURRENCY_ENV_INVALID: &str = "WARN_AUBE_CONCURRENCY_ENV_INVALID";
37
38// ── update / prerelease ─────────────────────────────────────────────
39pub const WARN_AUBE_PRERELEASE_CHECK_SKIPPED: &str = "WARN_AUBE_PRERELEASE_CHECK_SKIPPED";
40pub const WARN_AUBE_WORKSPACE_PACKAGE_MISSING_NAME: &str =
41    "WARN_AUBE_WORKSPACE_PACKAGE_MISSING_NAME";
42
43// ── audit / npmrc ───────────────────────────────────────────────────
44pub const WARN_AUBE_AUDIT_FETCH_FAILED: &str = "WARN_AUBE_AUDIT_FETCH_FAILED";
45pub const WARN_AUBE_TOKEN_CHMOD_FAILED: &str = "WARN_AUBE_TOKEN_CHMOD_FAILED";
46
47// ── registry config (trust gates + validation) ──────────────────────
48pub const WARN_AUBE_UNTRUSTED_PROXY: &str = "WARN_AUBE_UNTRUSTED_PROXY";
49pub const WARN_AUBE_UNTRUSTED_STRICT_SSL_DISABLE: &str = "WARN_AUBE_UNTRUSTED_STRICT_SSL_DISABLE";
50pub const WARN_AUBE_INVALID_LOCAL_ADDRESS: &str = "WARN_AUBE_INVALID_LOCAL_ADDRESS";
51pub const WARN_AUBE_INVALID_MAXSOCKETS: &str = "WARN_AUBE_INVALID_MAXSOCKETS";
52pub const WARN_AUBE_UNSCOPED_AUTH_RESCOPED: &str = "WARN_AUBE_UNSCOPED_AUTH_RESCOPED";
53pub const WARN_AUBE_UNTRUSTED_TOKEN_HELPER: &str = "WARN_AUBE_UNTRUSTED_TOKEN_HELPER";
54pub const WARN_AUBE_INVALID_TOKEN_HELPER: &str = "WARN_AUBE_INVALID_TOKEN_HELPER";
55pub const WARN_AUBE_TOKEN_HELPER_SPAWN_FAILED: &str = "WARN_AUBE_TOKEN_HELPER_SPAWN_FAILED";
56pub const WARN_AUBE_TOKEN_HELPER_NON_ZERO_EXIT: &str = "WARN_AUBE_TOKEN_HELPER_NON_ZERO_EXIT";
57
58// ── registry HTTP retries ───────────────────────────────────────────
59pub const WARN_AUBE_HTTP_RETRY_TRANSIENT: &str = "WARN_AUBE_HTTP_RETRY_TRANSIENT";
60pub const WARN_AUBE_HTTP_RETRY_TRANSPORT: &str = "WARN_AUBE_HTTP_RETRY_TRANSPORT";
61pub const WARN_AUBE_HTTP_RETRY_BODY_READ: &str = "WARN_AUBE_HTTP_RETRY_BODY_READ";
62pub const WARN_AUBE_HTTP_RETRY_BODY_DECODE: &str = "WARN_AUBE_HTTP_RETRY_BODY_DECODE";
63
64// ── registry caching / perf ─────────────────────────────────────────
65pub const WARN_AUBE_PACKUMENT_CACHE_WRITE: &str = "WARN_AUBE_PACKUMENT_CACHE_WRITE";
66pub const WARN_AUBE_SLOW_METADATA: &str = "WARN_AUBE_SLOW_METADATA";
67pub const WARN_AUBE_SLOW_TARBALL: &str = "WARN_AUBE_SLOW_TARBALL";
68
69// ── registry TLS / proxy config ─────────────────────────────────────
70pub const WARN_AUBE_INVALID_HTTPS_PROXY: &str = "WARN_AUBE_INVALID_HTTPS_PROXY";
71pub const WARN_AUBE_INVALID_HTTP_PROXY: &str = "WARN_AUBE_INVALID_HTTP_PROXY";
72pub const WARN_AUBE_INVALID_CA: &str = "WARN_AUBE_INVALID_CA";
73pub const WARN_AUBE_INVALID_CAFILE: &str = "WARN_AUBE_INVALID_CAFILE";
74pub const WARN_AUBE_UNREADABLE_CAFILE: &str = "WARN_AUBE_UNREADABLE_CAFILE";
75pub const WARN_AUBE_INVALID_CLIENT_CERT: &str = "WARN_AUBE_INVALID_CLIENT_CERT";
76
77// ── resolver ────────────────────────────────────────────────────────
78pub const WARN_AUBE_UNSUPPORTED_PLATFORM_INSTALL: &str = "WARN_AUBE_UNSUPPORTED_PLATFORM_INSTALL";
79pub const WARN_AUBE_EXOTIC_SUBDEP_SKIPPED: &str = "WARN_AUBE_EXOTIC_SUBDEP_SKIPPED";
80pub const WARN_AUBE_PEER_DEDUPE_COLLISION: &str = "WARN_AUBE_PEER_DEDUPE_COLLISION";
81
82// ── lockfile ────────────────────────────────────────────────────────
83pub const WARN_AUBE_LOCKFILE_MERGE_CONFLICT: &str = "WARN_AUBE_LOCKFILE_MERGE_CONFLICT";
84pub const WARN_AUBE_LOCKFILE_MERGE_CLEANUP_FAILED: &str = "WARN_AUBE_LOCKFILE_MERGE_CLEANUP_FAILED";
85pub const WARN_AUBE_LOCKFILE_CONFLICT_MARKERS: &str = "WARN_AUBE_LOCKFILE_CONFLICT_MARKERS";
86pub const WARN_AUBE_YARN_BERRY_UNSUPPORTED: &str = "WARN_AUBE_YARN_BERRY_UNSUPPORTED";
87
88// ── progress UI ─────────────────────────────────────────────────────
89pub const WARN_AUBE_PROGRESS_OVERFLOW: &str = "WARN_AUBE_PROGRESS_OVERFLOW";
90
91// ── workspace recursion ─────────────────────────────────────────────
92pub const WARN_AUBE_WORKSPACE_TOPO_CYCLE: &str = "WARN_AUBE_WORKSPACE_TOPO_CYCLE";
93
94// ── supply chain (add-time) ─────────────────────────────────────────
95pub const WARN_AUBE_LOW_DOWNLOAD_PACKAGE: &str = "WARN_AUBE_LOW_DOWNLOAD_PACKAGE";
96pub const WARN_AUBE_ADVISORY_CHECK_FAILED: &str = "WARN_AUBE_ADVISORY_CHECK_FAILED";
97pub const WARN_AUBE_OSV_MIRROR_REFRESH_FAILED: &str = "WARN_AUBE_OSV_MIRROR_REFRESH_FAILED";
98pub const WARN_AUBE_OSV_BLOOM_REFRESH_FAILED: &str = "WARN_AUBE_OSV_BLOOM_REFRESH_FAILED";
99pub const WARN_AUBE_SECURITY_SCANNER_FINDING: &str = "WARN_AUBE_SECURITY_SCANNER_FINDING";
100
101/// Stable category labels that group codes in the generated docs.
102/// Public so the docs generator can iterate them deterministically.
103pub mod category {
104    pub const PNPMFILE_HOOKS: &str = "pnpmfile / hooks";
105    pub const INSTALL_LIFECYCLE: &str = "Install lifecycle";
106    pub const SETTINGS_CONFIG: &str = "Settings / config validation";
107    pub const UPDATE_PRERELEASE: &str = "Update / prerelease";
108    pub const AUDIT_NPMRC: &str = "Audit / npmrc";
109    pub const REGISTRY_CONFIG: &str = "Registry config (trust gates)";
110    pub const HTTP_RETRIES: &str = "Registry HTTP retries";
111    pub const REGISTRY_PERF: &str = "Registry caching / perf";
112    pub const REGISTRY_TLS: &str = "Registry TLS / proxy";
113    pub const RESOLVER: &str = "Resolver";
114    pub const LOCKFILE: &str = "Lockfile";
115    pub const PROGRESS_UI: &str = "Progress UI";
116    pub const WORKSPACE_RECURSION: &str = "Workspace recursion";
117    pub const SUPPLY_CHAIN: &str = "Supply chain (add-time)";
118}
119
120/// Registry of every warning code with its category and description.
121/// Walked by the `generate-error-codes-docs` binary and by the
122/// self-tests in `lib.rs`. New codes must be added here.
123pub const ALL: &[CodeMeta] = &[
124    // pnpmfile / hooks
125    CodeMeta {
126        name: WARN_AUBE_PNPMFILE_NOT_FOUND,
127        category: category::PNPMFILE_HOOKS,
128        description: "A pnpmfile path (CLI arg, workspace setting, global) pointed at a missing file.",
129        exit_code: None,
130    },
131    CodeMeta {
132        name: WARN_AUBE_PNPMFILE_STDERR_FORWARDER,
133        category: category::PNPMFILE_HOOKS,
134        description: "The background task forwarding pnpmfile stderr panicked.",
135        exit_code: None,
136    },
137    CodeMeta {
138        name: WARN_AUBE_HOOK_IMPORTER_MUTATED,
139        category: category::PNPMFILE_HOOKS,
140        description: "A pnpmfile `afterAllResolved` hook mutated `importers[...]`; aube ignored the edit.",
141        exit_code: None,
142    },
143    CodeMeta {
144        name: WARN_AUBE_HOOK_IMPORTER_ADDED,
145        category: category::PNPMFILE_HOOKS,
146        description: "A pnpmfile `afterAllResolved` hook added a new `importers[...]` entry; aube ignored it.",
147        exit_code: None,
148    },
149    CodeMeta {
150        name: WARN_AUBE_HOOK_IDENTITY_REWRITTEN,
151        category: category::PNPMFILE_HOOKS,
152        description: "A pnpmfile hook rewrote a package's `(name, version)` identity; aube reverted the edit.",
153        exit_code: None,
154    },
155    CodeMeta {
156        name: WARN_AUBE_HOOK_PACKAGE_ADDED,
157        category: category::PNPMFILE_HOOKS,
158        description: "A pnpmfile hook added a wholly-new package entry; aube ignored it.",
159        exit_code: None,
160    },
161    // Install lifecycle
162    CodeMeta {
163        name: WARN_AUBE_IGNORED_BUILD_SCRIPTS,
164        category: category::INSTALL_LIFECYCLE,
165        description: "Dep had `preinstall`/`install`/`postinstall` scripts but isn't on the `allowBuilds` allowlist. Run `aube approve-builds`.",
166        exit_code: None,
167    },
168    CodeMeta {
169        name: WARN_AUBE_SUSPICIOUS_LIFECYCLE_SCRIPT,
170        category: category::INSTALL_LIFECYCLE,
171        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.",
172        exit_code: None,
173    },
174    CodeMeta {
175        name: WARN_AUBE_WINDOWS_JOB_OBJECT_UNAVAILABLE,
176        category: category::INSTALL_LIFECYCLE,
177        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.",
178        exit_code: None,
179    },
180    CodeMeta {
181        name: WARN_AUBE_MISSING_INTEGRITY,
182        category: category::INSTALL_LIFECYCLE,
183        description: "Lockfile entry / registry response had no `dist.integrity`; importing without verification. Set `strict-store-integrity=true` to refuse.",
184        exit_code: None,
185    },
186    CodeMeta {
187        name: WARN_AUBE_CACHE_WRITE_FAILED,
188        category: category::INSTALL_LIFECYCLE,
189        description: "Couldn't write a package index to the on-disk cache. Non-fatal.",
190        exit_code: None,
191    },
192    CodeMeta {
193        name: WARN_AUBE_CLONE_STRATEGY_FALLBACK,
194        category: category::INSTALL_LIFECYCLE,
195        description: "`package-import-method=clone` will silently fall back to copy if the filesystem doesn't support reflinks.",
196        exit_code: None,
197    },
198    CodeMeta {
199        name: WARN_AUBE_LTHASH_MISMATCH,
200        category: category::INSTALL_LIFECYCLE,
201        description: "Incremental and full LtHash digests disagreed — homomorphic invariant broken. Real bug signal.",
202        exit_code: None,
203    },
204    CodeMeta {
205        name: WARN_AUBE_DELTA_INVALIDATE_FAILED,
206        category: category::INSTALL_LIFECYCLE,
207        description: "Delta install couldn't invalidate a package directory during cleanup.",
208        exit_code: None,
209    },
210    CodeMeta {
211        name: WARN_AUBE_GVS_INCOMPATIBLE,
212        category: category::INSTALL_LIFECYCLE,
213        description: "A package isn't compatible with aube's global virtual store; installed per-project instead.",
214        exit_code: None,
215    },
216    CodeMeta {
217        name: WARN_AUBE_GVS_MODE_CHANGED,
218        category: category::INSTALL_LIFECYCLE,
219        description: "Switching between gvs-on and gvs-off; removing `node_modules` and reinstalling from scratch.",
220        exit_code: None,
221    },
222    // Settings / config validation
223    CodeMeta {
224        name: WARN_AUBE_INVALID_CONCURRENCY,
225        category: category::SETTINGS_CONFIG,
226        description: "`network-concurrency` or `link-concurrency` was 0 (must be ≥ 1).",
227        exit_code: None,
228    },
229    CodeMeta {
230        name: WARN_AUBE_INVALID_TRUST_POLICY,
231        category: category::SETTINGS_CONFIG,
232        description: "A `trustPolicyExclude` entry was malformed and skipped.",
233        exit_code: None,
234    },
235    CodeMeta {
236        name: WARN_AUBE_OVERRIDE_MISSING_DEP,
237        category: category::SETTINGS_CONFIG,
238        description: "An `overrides` `$ref` pointed at a package not in any of the importer's dependency lists.",
239        exit_code: None,
240    },
241    CodeMeta {
242        name: WARN_AUBE_INVALID_PEER_PATTERN,
243        category: category::SETTINGS_CONFIG,
244        description: "A `peerDependencyRules` pattern was unparseable and skipped.",
245        exit_code: None,
246    },
247    CodeMeta {
248        name: WARN_AUBE_INVALID_SAVE_PREFIX,
249        category: category::SETTINGS_CONFIG,
250        description: "`save-prefix` was something other than `^`, `~`, or empty. Falling back to `^`.",
251        exit_code: None,
252    },
253    CodeMeta {
254        name: WARN_AUBE_CONCURRENCY_ENV_INVALID,
255        category: category::SETTINGS_CONFIG,
256        description: "The `AUBE_CONCURRENCY` env var was outside the `[floor, ceiling]` range or non-numeric.",
257        exit_code: None,
258    },
259    // Update / prerelease
260    CodeMeta {
261        name: WARN_AUBE_PRERELEASE_CHECK_SKIPPED,
262        category: category::UPDATE_PRERELEASE,
263        description: "`aube update` couldn't fetch the packument or got a non-semver `latest` tag; preserved-prerelease check skipped for that package.",
264        exit_code: None,
265    },
266    CodeMeta {
267        name: WARN_AUBE_WORKSPACE_PACKAGE_MISSING_NAME,
268        category: category::UPDATE_PRERELEASE,
269        description: "A discovered workspace package had no `name` field, so update skipped local workspace version registration for it.",
270        exit_code: None,
271    },
272    // Audit / npmrc
273    CodeMeta {
274        name: WARN_AUBE_AUDIT_FETCH_FAILED,
275        category: category::AUDIT_NPMRC,
276        description: "`aube audit --ignore-unfixable` couldn't fetch a packument; advisories for that package are kept verbatim.",
277        exit_code: None,
278    },
279    CodeMeta {
280        name: WARN_AUBE_TOKEN_CHMOD_FAILED,
281        category: category::AUDIT_NPMRC,
282        description: "`chmod 0600` on the auth token file failed; the file may be world-readable.",
283        exit_code: None,
284    },
285    // Registry config (trust gates)
286    CodeMeta {
287        name: WARN_AUBE_UNTRUSTED_PROXY,
288        category: category::REGISTRY_CONFIG,
289        description: "A `*-proxy` setting came from a source aube doesn't trust (committed `.npmrc` can't set proxies).",
290        exit_code: None,
291    },
292    CodeMeta {
293        name: WARN_AUBE_UNTRUSTED_STRICT_SSL_DISABLE,
294        category: category::REGISTRY_CONFIG,
295        description: "`strict-ssl=false` came from a source aube doesn't trust. TLS validation stays on.",
296        exit_code: None,
297    },
298    CodeMeta {
299        name: WARN_AUBE_INVALID_LOCAL_ADDRESS,
300        category: category::REGISTRY_CONFIG,
301        description: "`local-address` setting wasn't a valid IP.",
302        exit_code: None,
303    },
304    CodeMeta {
305        name: WARN_AUBE_INVALID_MAXSOCKETS,
306        category: category::REGISTRY_CONFIG,
307        description: "`maxsockets` was 0 or non-numeric.",
308        exit_code: None,
309    },
310    CodeMeta {
311        name: WARN_AUBE_UNSCOPED_AUTH_RESCOPED,
312        category: category::REGISTRY_CONFIG,
313        description: "An unscoped registry credential was pinned to the registry declared by the same config source.",
314        exit_code: None,
315    },
316    CodeMeta {
317        name: WARN_AUBE_UNTRUSTED_TOKEN_HELPER,
318        category: category::REGISTRY_CONFIG,
319        description: "`tokenHelper` came from an untrusted source (CVE-2025-69262 class).",
320        exit_code: None,
321    },
322    CodeMeta {
323        name: WARN_AUBE_INVALID_TOKEN_HELPER,
324        category: category::REGISTRY_CONFIG,
325        description: "`tokenHelper` value wasn't a sanitized absolute path.",
326        exit_code: None,
327    },
328    CodeMeta {
329        name: WARN_AUBE_TOKEN_HELPER_SPAWN_FAILED,
330        category: category::REGISTRY_CONFIG,
331        description: "`tokenHelper` couldn't be spawned.",
332        exit_code: None,
333    },
334    CodeMeta {
335        name: WARN_AUBE_TOKEN_HELPER_NON_ZERO_EXIT,
336        category: category::REGISTRY_CONFIG,
337        description: "`tokenHelper` exited non-zero.",
338        exit_code: None,
339    },
340    // Registry HTTP retries
341    CodeMeta {
342        name: WARN_AUBE_HTTP_RETRY_TRANSIENT,
343        category: category::HTTP_RETRIES,
344        description: "Retrying after a transient HTTP status (429, 5xx).",
345        exit_code: None,
346    },
347    CodeMeta {
348        name: WARN_AUBE_HTTP_RETRY_TRANSPORT,
349        category: category::HTTP_RETRIES,
350        description: "Retrying after a transport / connection error.",
351        exit_code: None,
352    },
353    CodeMeta {
354        name: WARN_AUBE_HTTP_RETRY_BODY_READ,
355        category: category::HTTP_RETRIES,
356        description: "Retrying after a response-body read error (timeout, partial body).",
357        exit_code: None,
358    },
359    CodeMeta {
360        name: WARN_AUBE_HTTP_RETRY_BODY_DECODE,
361        category: category::HTTP_RETRIES,
362        description: "Retrying after a JSON decode error on the response body.",
363        exit_code: None,
364    },
365    // Registry caching / perf
366    CodeMeta {
367        name: WARN_AUBE_PACKUMENT_CACHE_WRITE,
368        category: category::REGISTRY_PERF,
369        description: "Couldn't write a packument to the on-disk cache after a successful fetch. Non-fatal; next install will refetch.",
370        exit_code: None,
371    },
372    CodeMeta {
373        name: WARN_AUBE_SLOW_METADATA,
374        category: category::REGISTRY_PERF,
375        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.",
376        exit_code: None,
377    },
378    CodeMeta {
379        name: WARN_AUBE_SLOW_TARBALL,
380        category: category::REGISTRY_PERF,
381        description: "A tarball download fell below `fetchMinSpeedKiBps`.",
382        exit_code: None,
383    },
384    // Registry TLS / proxy
385    CodeMeta {
386        name: WARN_AUBE_INVALID_HTTPS_PROXY,
387        category: category::REGISTRY_TLS,
388        description: "`https-proxy` URL didn't parse.",
389        exit_code: None,
390    },
391    CodeMeta {
392        name: WARN_AUBE_INVALID_HTTP_PROXY,
393        category: category::REGISTRY_TLS,
394        description: "`http-proxy` URL didn't parse.",
395        exit_code: None,
396    },
397    CodeMeta {
398        name: WARN_AUBE_INVALID_CA,
399        category: category::REGISTRY_TLS,
400        description: "Per-registry CA PEM didn't parse.",
401        exit_code: None,
402    },
403    CodeMeta {
404        name: WARN_AUBE_INVALID_CAFILE,
405        category: category::REGISTRY_TLS,
406        description: "`cafile` couldn't be parsed as a PEM bundle.",
407        exit_code: None,
408    },
409    CodeMeta {
410        name: WARN_AUBE_UNREADABLE_CAFILE,
411        category: category::REGISTRY_TLS,
412        description: "`cafile` couldn't be read from disk.",
413        exit_code: None,
414    },
415    CodeMeta {
416        name: WARN_AUBE_INVALID_CLIENT_CERT,
417        category: category::REGISTRY_TLS,
418        description: "Per-registry client `cert`/`key` PEM pair didn't parse.",
419        exit_code: None,
420    },
421    // Resolver
422    CodeMeta {
423        name: WARN_AUBE_UNSUPPORTED_PLATFORM_INSTALL,
424        category: category::RESOLVER,
425        description: "A required (non-optional) dep declared a platform aube doesn't satisfy; installing anyway.",
426        exit_code: None,
427    },
428    CodeMeta {
429        name: WARN_AUBE_EXOTIC_SUBDEP_SKIPPED,
430        category: category::RESOLVER,
431        description: "An optional or peer dep used an exotic specifier and was skipped under `blockExoticSubdeps=true`.",
432        exit_code: None,
433    },
434    CodeMeta {
435        name: WARN_AUBE_PEER_DEDUPE_COLLISION,
436        category: category::RESOLVER,
437        description: "`dedupe-peers=true` would have collapsed a distinct peer-variant; preserved the longer form to avoid dropping it.",
438        exit_code: None,
439    },
440    // Lockfile
441    CodeMeta {
442        name: WARN_AUBE_LOCKFILE_MERGE_CONFLICT,
443        category: category::LOCKFILE,
444        description: "Branch-lockfile merge had conflicting entries for the same dep_path; one was chosen.",
445        exit_code: None,
446    },
447    CodeMeta {
448        name: WARN_AUBE_LOCKFILE_MERGE_CLEANUP_FAILED,
449        category: category::LOCKFILE,
450        description: "After a successful merge, removing one of the merged branch lockfiles failed.",
451        exit_code: None,
452    },
453    CodeMeta {
454        name: WARN_AUBE_LOCKFILE_CONFLICT_MARKERS,
455        category: category::LOCKFILE,
456        description: "The active lockfile contains Git conflict markers; aube is regenerating it from package.json.",
457        exit_code: None,
458    },
459    CodeMeta {
460        name: WARN_AUBE_YARN_BERRY_UNSUPPORTED,
461        category: category::LOCKFILE,
462        description: "A Yarn Berry `patch:` / `portal:` / `exec:` protocol — or any unrecognized protocol — was found in `yarn.lock`. Entry was skipped.",
463        exit_code: None,
464    },
465    // Progress UI
466    CodeMeta {
467        name: WARN_AUBE_PROGRESS_OVERFLOW,
468        category: category::PROGRESS_UI,
469        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.",
470        exit_code: None,
471    },
472    // Workspace recursion
473    CodeMeta {
474        name: WARN_AUBE_WORKSPACE_TOPO_CYCLE,
475        category: category::WORKSPACE_RECURSION,
476        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.",
477        exit_code: None,
478    },
479    // Supply chain (add-time)
480    CodeMeta {
481        name: WARN_AUBE_LOW_DOWNLOAD_PACKAGE,
482        category: category::SUPPLY_CHAIN,
483        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.",
484        exit_code: None,
485    },
486    CodeMeta {
487        name: WARN_AUBE_ADVISORY_CHECK_FAILED,
488        category: category::SUPPLY_CHAIN,
489        description: "OSV `MAL-*` advisory check couldn't reach the API. With `advisoryCheck=on` (default) install continues; with `advisoryCheck=required` install fails closed.",
490        exit_code: None,
491    },
492    CodeMeta {
493        name: WARN_AUBE_OSV_MIRROR_REFRESH_FAILED,
494        category: category::SUPPLY_CHAIN,
495        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`.",
496        exit_code: None,
497    },
498    CodeMeta {
499        name: WARN_AUBE_OSV_BLOOM_REFRESH_FAILED,
500        category: category::SUPPLY_CHAIN,
501        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`.",
502        exit_code: None,
503    },
504    CodeMeta {
505        name: WARN_AUBE_SECURITY_SCANNER_FINDING,
506        category: category::SUPPLY_CHAIN,
507        description: "User-configured `securityScanner` returned a `warn`-level advisory. Install continues — only `fatal`-level advisories block.",
508        exit_code: None,
509    },
510];