fallow 3.27.0 → 3.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -261,7 +261,7 @@ export type IssueAction = (FixAction | SuppressLineAction | SuppressFileAction |
261
261
  * Discriminant string for [`FixAction`]. Kebab-case per the JSON output
262
262
  * contract.
263
263
  */
264
- export type FixActionType = ("remove-export" | "delete-file" | "remove-dependency" | "move-dependency" | "remove-enum-member" | "remove-class-member" | "resolve-import" | "install-dependency" | "remove-duplicate" | "move-to-dev" | "move-to-prod" | "refactor-cycle" | "refactor-re-export-cycle" | "refactor-boundary" | "export-type" | "remove-catalog-entry" | "remove-empty-catalog-group" | "update-catalog-reference" | "add-catalog-entry" | "remove-catalog-reference" | "remove-dependency-override" | "fix-dependency-override" | "resolve-policy-violation" | "move-to-server-module" | "split-mixed-barrel" | "hoist-directive" | "wire-server-action" | "provide-inject" | "use-load-data" | "render-component" | "use-component-prop" | "emit-component-event" | "wire-svelte-event" | "resolve-route-collision" | "resolve-dynamic-segment-name-conflict" | "add-suppression-reason" | "remove-stale-suppression")
264
+ export type FixActionType = ("remove-export" | "delete-file" | "remove-dependency" | "move-dependency" | "remove-enum-member" | "remove-class-member" | "resolve-import" | "install-dependency" | "remove-duplicate" | "move-to-dev" | "move-to-prod" | "refactor-cycle" | "refactor-re-export-cycle" | "refactor-boundary" | "export-type" | "migrate-deprecated-export" | "remove-catalog-entry" | "remove-empty-catalog-group" | "update-catalog-reference" | "add-catalog-entry" | "remove-catalog-reference" | "remove-dependency-override" | "fix-dependency-override" | "resolve-policy-violation" | "move-to-server-module" | "split-mixed-barrel" | "hoist-directive" | "wire-server-action" | "provide-inject" | "use-load-data" | "render-component" | "use-component-prop" | "emit-component-event" | "wire-svelte-event" | "resolve-route-collision" | "resolve-dynamic-segment-name-conflict" | "add-suppression-reason" | "remove-stale-suppression")
265
265
  /**
266
266
  * Singleton discriminant for [`SuppressLineAction`].
267
267
  */
@@ -301,6 +301,27 @@ export type AddToConfigValue = (string | IgnoreExportsRule[] | {
301
301
  * hold `Option<AuditIntroduced>`. Renders to the JSON wire as a bare boolean.
302
302
  */
303
303
  export type AuditIntroduced = boolean
304
+ /**
305
+ * Gate severity of one finding after rule resolution.
306
+ *
307
+ * It is the severity that `rules` and the matching `overrides[].rules` give
308
+ * the finding for its path. `--fail-on-issues` raises `warn` to `error`. A
309
+ * finding whose rule is `off` is not reported, so there is no `off` value.
310
+ * The type is separate from the health `severity` band, which ranks a
311
+ * finding and does not gate it.
312
+ *
313
+ * The `fallow dead-code` findings gate fails when a finding is `error`.
314
+ * Other gates (regression, stale baseline) decide on their own inputs. Two
315
+ * commands differ: the `fallow audit` `new-only` gate fails only on introduced
316
+ * findings, so an inherited `error` finding does not fail the audit, and the
317
+ * combined command (`fallow` without a subcommand) exits 0 for machine
318
+ * formats.
319
+ *
320
+ * Complexity findings carry the same type. The `complexity-cyclomatic`,
321
+ * `complexity-cognitive` and `complexity-crap` rules set it, and the
322
+ * `fallow health` findings gate and the audit verdict read it.
323
+ */
324
+ export type EffectiveSeverity = ("error" | "warn")
304
325
  /**
305
326
  * A per-finding caveat on a dead-code verdict that a file this run never
306
327
  * fully analyzed can distort.
@@ -325,6 +346,10 @@ export type AuditIntroduced = boolean
325
346
  * caveat" rather than as an error.
326
347
  */
327
348
  export type ReachabilityCaveat = ("incomplete-file-analysis" | "incomplete-import-graph")
349
+ /**
350
+ * How a consumer references a deprecated export.
351
+ */
352
+ export type DeprecatedConsumerKind = ("named-import" | "default-import" | "namespace-import" | "re-export" | "dynamic-import" | "side-effect-import")
328
353
  /**
329
354
  * Where in package.json a dependency is listed.
330
355
  *
@@ -420,6 +445,22 @@ export type DependencyOverrideMisconfigReason = ("unparsable-key" | "empty-value
420
445
  * from counts.
421
446
  */
422
447
  export type BaselineStalenessAdvisory = ("none" | "zero-overlap" | "partial")
448
+ /**
449
+ * One channel that narrowed a run to part of the project.
450
+ *
451
+ * Serialized as kebab-case inside `scope_reasons` and published as an OPEN
452
+ * set, the same tolerate-unknown contract `gate_outcomes` keys carry: a name
453
+ * this build does not emit means "some narrowing", not an error.
454
+ *
455
+ * Which names a command can emit differs per command, because the three
456
+ * narrowing predicates see different state. `dead-code` reads the flags
457
+ * themselves and can name every channel. `dupes` and `health` see an already
458
+ * resolved changed-file set and report `changed-files`, because at that point
459
+ * the flag that produced it is gone. `health` reports `workspace` for both
460
+ * `--workspace` and `--changed-workspaces` for the same reason. A consumer
461
+ * must therefore not assume a given command emits a given name.
462
+ */
463
+ export type ScopeReason = ("diff" | "changed-since" | "changed-files" | "workspace" | "changed-workspaces" | "scope" | "file" | "issue-type-filter" | "production")
423
464
  /**
424
465
  * Status of a regression-check pass.
425
466
  */
@@ -428,6 +469,29 @@ export type RegressionStatus = ("pass" | "exceeded" | "skipped")
428
469
  * Interpretation of [`RegressionResult::tolerance`].
429
470
  */
430
471
  export type RegressionToleranceKind = ("absolute" | "percentage")
472
+ /**
473
+ * What became of one request on this run.
474
+ *
475
+ * Two-valued today. The value set is OPEN so a later `partial` needs no bump,
476
+ * and it is deliberately not added now: nothing emits it, and a permanently
477
+ * unused value reads as a measurement nobody takes.
478
+ */
479
+ export type RequestStatus = ("applied" | "not-applied")
480
+ /**
481
+ * What a request governs, and therefore what its failure means.
482
+ *
483
+ * Published on every entry so a consumer selects on the class rather than on
484
+ * a name list. Without it the one sentence a consumer can write for the whole
485
+ * object ("the report is wider than requested") is false for any request that
486
+ * does not narrow, which is how a failed `--sarif-file` write came to be
487
+ * reported as an unscoped run. A request name added later carries its own
488
+ * class, so a consumer written today keeps saying the right thing about it.
489
+ *
490
+ * The value set is OPEN, like the names and the statuses: read a class this
491
+ * build does not recognise as "some request", not as an error, and do not read
492
+ * it as `scope`.
493
+ */
494
+ export type RequestEffect = ("scope" | "artifact")
431
495
  /**
432
496
  * A diagnostic about a workspace-discovery candidate.
433
497
  *
@@ -570,6 +634,103 @@ kind: "excluded-by-default-ignore"
570
634
  */
571
635
  excluded_file_count: number
572
636
  kind: "no-source-files-analyzed"
637
+ } | {
638
+ /**
639
+ * Scoring error text.
640
+ */
641
+ error: string
642
+ kind: "file-scores-unavailable"
643
+ } | {
644
+ /**
645
+ * Which input stopped it, as a kebab-case token: `not-a-repository`,
646
+ * `no-commits`, `invalid-since` or `churn-file-unreadable`. The set is
647
+ * open.
648
+ *
649
+ * The cause decides the remedy, which is why it is on the wire: a run
650
+ * outside a repository is fixed by running fallow inside one, a
651
+ * branch without a commit by committing, a malformed `--since` by
652
+ * respelling the flag, and a churn file that changed under the run by
653
+ * rerunning it. A consumer reading only the kind would offer the first
654
+ * remedy for all four.
655
+ */
656
+ cause: string
657
+ kind: "hotspots-skipped"
658
+ } | {
659
+ /**
660
+ * `true` when the run also asked for ownership attribution, which a
661
+ * shallow clone skews further by inflating single-author dominance.
662
+ */
663
+ ownership_requested: boolean
664
+ kind: "shallow-clone"
665
+ } | {
666
+ kind: "unpinned-clock"
667
+ } | {
668
+ /**
669
+ * Which input failed, as a kebab-case token: `invalid-bot-pattern` or
670
+ * `codeowners-parse-failed`. The set is open.
671
+ */
672
+ cause: string
673
+ /**
674
+ * Underlying error text.
675
+ */
676
+ error: string
677
+ kind: "ownership-unavailable"
678
+ } | {
679
+ /**
680
+ * Filesystem or JSON error text.
681
+ */
682
+ error: string
683
+ kind: "trend-snapshot-unreadable"
684
+ } | {
685
+ /**
686
+ * The plugin that read the config, as it labels itself:
687
+ * `module-federation` for a standalone `module-federation.config.*`,
688
+ * or the bundler plugin (`webpack`, `rspack`, `rsbuild`, `vite`) that
689
+ * read the same options inline from its own config.
690
+ */
691
+ plugin: string
692
+ /**
693
+ * The config key that was present and not fully readable (`exposes`,
694
+ * `remotes`), or the Module Federation runtime function whose
695
+ * argument was not readable (`registerRemotes`, `loadRemote`, `init`,
696
+ * `createInstance`). The set is open.
697
+ */
698
+ key: string
699
+ /**
700
+ * Why it could not be read, as a kebab-case token:
701
+ * `not-object-literal`, `array-form`, `spread`,
702
+ * `unreadable-entries`, `unrecognized-call`,
703
+ * `import-target-unreadable` or `dynamic-argument`. The set is open.
704
+ *
705
+ * The reason decides the remedy, which is why it is on the wire: a
706
+ * value that is not an object literal is fixed by writing one, while
707
+ * unreadable entries are fixed by naming those entries in the config
708
+ * option the message points at.
709
+ */
710
+ reason: string
711
+ kind: "plugin-config-unreadable"
712
+ } | {
713
+ /**
714
+ * The plugin that read the config, as it labels itself (`nuxt`).
715
+ */
716
+ plugin: string
717
+ /**
718
+ * The config key whose effect is not modeled (`components`,
719
+ * `imports`), or the virtual module a file reads (`#components`,
720
+ * `#imports`). The set is open.
721
+ */
722
+ key: string
723
+ /**
724
+ * Why the effect is not modeled, as a kebab-case token:
725
+ * `key-effect-not-modeled` when the key's own value is the reason,
726
+ * `config-property-unreadable` when a top-level property of the same
727
+ * config file could not be read statically, so no surface in it can
728
+ * be classified at all. The set is open.
729
+ */
730
+ reason: string
731
+ kind: "plugin-effect-not-modeled"
732
+ } | {
733
+ kind: "coverage-auto-detected"
573
734
  })
574
735
  /**
575
736
  * Discriminant for [`CloneGroupAction::kind`]. Mirrors the action types
@@ -641,6 +802,10 @@ export type HealthFindingActionType = ("refactor-function" | "add-tests" | "incr
641
802
  * Coverage model used for CRAP score computation.
642
803
  */
643
804
  export type CoverageModel = ("static_binary" | "static_estimated" | "istanbul")
805
+ /**
806
+ * Input format of the measured coverage behind `CoverageModel::Istanbul`.
807
+ */
808
+ export type CoverageInputFormat = ("istanbul" | "v8")
644
809
  /**
645
810
  * Whether CRAP findings in the report used one coverage-source kind or a mix.
646
811
  */
@@ -1092,7 +1257,7 @@ export type SecurityUrlShape = ("fixed-origin-dynamic-path" | "dynamic-origin")
1092
1257
  */
1093
1258
  export type SecurityRuntimeState = ("runtime-hot" | "runtime-cold" | "never-executed" | "low-traffic" | "coverage-unavailable" | "runtime-unknown")
1094
1259
  /**
1095
- * Defensive control family detected on a source to sink path.
1260
+ * Family of a control pattern observed in a file on an import trace.
1096
1261
  */
1097
1262
  export type SecurityControlKind = ("sanitization" | "validation" | "authentication" | "authorization")
1098
1263
  /**
@@ -1140,7 +1305,7 @@ export type FeatureFlagActionType = ("investigate-flag" | "suppress-line")
1140
1305
  * Independently-versioned wire-version newtype for the brief envelope.
1141
1306
  * Serializes as the integer `REVIEW_BRIEF_SCHEMA_VERSION`.
1142
1307
  */
1143
- export type ReviewBriefSchemaVersion = 10
1308
+ export type ReviewBriefSchemaVersion = 11
1144
1309
  /**
1145
1310
  * The exactly-three shippable decision categories (the SOLID-3). No cut category
1146
1311
  * (abstraction / deletion / convention / irreversibility) is representable: this
@@ -1357,13 +1522,13 @@ base_snapshot_skipped?: (boolean | null)
1357
1522
  summary: AuditSummary
1358
1523
  attribution: AuditAttribution
1359
1524
  /**
1360
- * Every gate this run ARMED, keyed by name, absent when it armed none.
1361
- * Each entry is the same rule that decides the exit code, so a CI
1362
- * integration reads the verdict instead of guessing from a process status
1363
- * it usually cannot see. A gate fails the build when `status` is `fail`
1364
- * AND `enforced` is true. Armed, not evaluated: fallow's default severity
1365
- * rules fail a run with no flag at all, so an absent object means "no gate
1366
- * was asked for", never "nothing failed". See [`crate::GateOutcomes`].
1525
+ * The verdict of every gate this run evaluated, keyed by name. The CLI
1526
+ * always emits it, with the command's default exit rule in it also when
1527
+ * no flag armed a gate, so a CI integration reads the verdict instead of
1528
+ * guessing from a process status it usually cannot see. A gate fails the
1529
+ * build when `status` is `fail` AND `enforced` is true. The typed
1530
+ * programmatic API runs no CLI gate and leaves it absent. See
1531
+ * [`crate::GateOutcomes`].
1367
1532
  */
1368
1533
  gate_outcomes?: (GateOutcomes | null)
1369
1534
  /**
@@ -1449,24 +1614,25 @@ styling_inherited: number
1449
1614
  duplication_demoted: number
1450
1615
  }
1451
1616
  /**
1452
- * Every gate a run ARMED, keyed by name.
1617
+ * The verdict of every gate a run evaluated, keyed by name.
1453
1618
  *
1454
- * Armed, not evaluated: a gate is armed by a flag or by config, never merely
1455
- * because the rule behind it exists. Fallow's default severity rules fail a
1456
- * run with no flag at all, so a `dead-code` run can exit 1 carrying no object
1457
- * whatsoever. Read an absent object as "no gate was asked for", never as
1458
- * "nothing failed".
1619
+ * A gate is armed by a flag or by config. The default exit rule of a command
1620
+ * is always in the object, also when no flag armed a gate:
1621
+ * `error-severity-findings` on `dead-code`, `check` and the combined run
1622
+ * (with `health-findings` when the combined run analyzed health),
1623
+ * `health-findings` on `health`, `security-advisory` on `security` and
1624
+ * `audit-verdict` on `audit`. A reader of the JSON sees a failing run without
1625
+ * the exit code. `dupes` has no default exit rule, so a `dupes` run that armed
1626
+ * no gate carries no object and always exits 0.
1459
1627
  *
1460
- * Absent from an envelope whenever it is empty, so a run that armed no gate is
1461
- * byte-identical to one produced before this object existed. An empty object
1462
- * is never emitted: it would assert that gates were armed and none tripped,
1463
- * which is a different and false claim.
1628
+ * An empty object is never emitted. The typed programmatic API runs no CLI
1629
+ * gate and leaves the object absent.
1464
1630
  *
1465
1631
  * The names this build can emit are `error-severity-findings`, `regression`,
1466
1632
  * `stale-baseline`, `duplication-threshold`, `health-min-score`,
1467
1633
  * `health-min-severity`, `health-findings`, `health-coverage-gaps`,
1468
- * `health-runtime-coverage`, `security`, `security-advisory`, `audit-verdict`
1469
- * and `type-aware-require`. The set is OPEN: a name a consumer does not
1634
+ * `health-runtime-coverage`, `security`, `security-advisory`, `audit-verdict`,
1635
+ * `type-aware-require` and `parse-error`. The set is OPEN: a name a consumer does not
1470
1636
  * recognise means "some gate", not an error.
1471
1637
  */
1472
1638
  export interface GateOutcomes {
@@ -1493,15 +1659,17 @@ export interface GateOutcome {
1493
1659
  status: GateStatus
1494
1660
  /**
1495
1661
  * True when a `fail` from this gate makes the run exit non-zero. False
1496
- * when the verdict is published for information only, because the gate was
1497
- * never armed or because the run was told never to fail.
1662
+ * when the verdict is published for information only: the gate was never
1663
+ * armed, the run was told never to fail, or the combined machine formats
1664
+ * exit 0 for the gate.
1498
1665
  */
1499
1666
  enforced: boolean
1500
1667
  /**
1501
1668
  * The measured value the gate compared, when there is one: the duplication
1502
- * percentage, the health score, or the number of findings at or above the
1503
- * severity floor. Whole numbers are carried as JSON numbers, so a count of
1504
- * three reads as `3.0`. Absent for gates that compare no number.
1669
+ * percentage, the health score, the number of findings at or above the
1670
+ * severity floor, or the number of files in `files`. Whole numbers are
1671
+ * carried as JSON numbers, so a count of three reads as `3.0`. Absent for
1672
+ * gates that compare no number.
1505
1673
  */
1506
1674
  observed?: (number | null)
1507
1675
  /**
@@ -1519,6 +1687,34 @@ threshold?: (number | null)
1519
1687
  * object. Absent for gates whose numbers speak for themselves.
1520
1688
  */
1521
1689
  threshold_label?: (string | null)
1690
+ /**
1691
+ * The files the gate judged, for a gate that judges files rather than a
1692
+ * number. Only `parse-error` sets it: one item per file that did not
1693
+ * parse cleanly, sorted by path. Absent when the list is empty.
1694
+ */
1695
+ files?: GateFile[]
1696
+ }
1697
+ /**
1698
+ * One file a file-judging gate names, with the reason the gate counted it.
1699
+ *
1700
+ * Today only `parse-error` emits it. The item carries the same facts as the
1701
+ * `source-parse-degraded` entry in `workspace_diagnostics[]` for that file,
1702
+ * so a consumer can act on the gate without a join.
1703
+ */
1704
+ export interface GateFile {
1705
+ /**
1706
+ * The file path, relative to the project root, with `/` separators.
1707
+ */
1708
+ path: string
1709
+ /**
1710
+ * The number of parser errors for the file.
1711
+ */
1712
+ error_count: number
1713
+ /**
1714
+ * True when the parser stopped in the file instead of recovering, so the
1715
+ * analysis saw only the part before the error.
1716
+ */
1717
+ panicked: boolean
1522
1718
  }
1523
1719
  /**
1524
1720
  * Metric and rule definitions emitted under `_meta` when `--explain` is
@@ -2484,6 +2680,12 @@ unused_types: UnusedTypeFinding[]
2484
2680
  * typed `actions` array natively.
2485
2681
  */
2486
2682
  private_type_leaks: PrivateTypeLeakFinding[]
2683
+ /**
2684
+ * Exports marked `@deprecated` that still have at least one consumer in
2685
+ * a reachable file. Wrapped in [`DeprecatedExportInUseFinding`]. Opt-in: the
2686
+ * `deprecated-exports-in-use` rule defaults to `off`.
2687
+ */
2688
+ deprecated_exports_in_use?: DeprecatedExportInUseFinding[]
2487
2689
  /**
2488
2690
  * Dependencies listed in package.json but never imported. Wrapped in
2489
2691
  * [`UnusedDependencyFinding`] so each entry carries a typed `actions`
@@ -2811,15 +3013,25 @@ baseline_staleness?: (BaselineStaleness | null)
2811
3013
  */
2812
3014
  regression?: (RegressionResult | null)
2813
3015
  /**
2814
- * Every gate this run ARMED, keyed by name, absent when it armed none.
2815
- * Each entry is the same rule that decides the exit code, so a CI
2816
- * integration reads the verdict instead of guessing from a process status
2817
- * it usually cannot see. A gate fails the build when `status` is `fail`
2818
- * AND `enforced` is true. Armed, not evaluated: fallow's default severity
2819
- * rules fail a run with no flag at all, so an absent object means "no gate
2820
- * was asked for", never "nothing failed". See [`crate::GateOutcomes`].
3016
+ * The verdict of every gate this run evaluated, keyed by name. The CLI
3017
+ * always emits it, with the command's default exit rule in it also when
3018
+ * no flag armed a gate, so a CI integration reads the verdict instead of
3019
+ * guessing from a process status it usually cannot see. A gate fails the
3020
+ * build when `status` is `fail` AND `enforced` is true. The typed
3021
+ * programmatic API runs no CLI gate and leaves it absent. See
3022
+ * [`crate::GateOutcomes`].
2821
3023
  */
2822
3024
  gate_outcomes?: (GateOutcomes | null)
3025
+ /**
3026
+ * Every narrowing or shaping request this run RECEIVED, keyed by name,
3027
+ * absent when it was asked for nothing. An entry whose `status` is not
3028
+ * `applied` means the run could not do what it was asked and reported
3029
+ * something WIDER instead, so what follows is a valid report of a scope
3030
+ * nobody requested. Honoured requests are published too, with
3031
+ * `status: "applied"`, so an absent object means "nothing was asked for",
3032
+ * never "nothing failed". See [`crate::RequestOutcomes`].
3033
+ */
3034
+ request_outcomes?: (RequestOutcomes | null)
2823
3035
  /**
2824
3036
  * `_meta` block with docs and rule definitions, when `--explain` was
2825
3037
  * passed.
@@ -2838,10 +3050,12 @@ _meta?: (Meta | null)
2838
3050
  * `source-parse-degraded`;
2839
3051
  * - dead-code analysis, from the dependency-catalog and override
2840
3052
  * detectors: `malformed-pnpm-workspace-yaml`,
2841
- * `bun-lockb-override-resolution-skipped`.
3053
+ * `bun-lockb-override-resolution-skipped`;
3054
+ * - framework plugins, while they read their own build configs:
3055
+ * `plugin-config-unreadable`, `plugin-effect-not-modeled`.
2842
3056
  *
2843
- * Analysis-stage kinds therefore reach only the envelopes whose run
2844
- * includes a dead-code analyze pass, never a standalone
3057
+ * Analysis-stage and plugin-stage kinds therefore reach only the envelopes
3058
+ * whose run includes a dead-code analyze pass, never a standalone
2845
3059
  * `fallow dupes --format json`. `path` is project-root-relative with
2846
3060
  * forward slashes; the array is omitted when empty. The same list is
2847
3061
  * repeated on each top-level command's envelope so single-command
@@ -2924,6 +3138,10 @@ unused_types: number
2924
3138
  * Public exports whose signature references same-file private types.
2925
3139
  */
2926
3140
  private_type_leaks: number
3141
+ /**
3142
+ * Exports marked `@deprecated` that are still referenced.
3143
+ */
3144
+ deprecated_exports_in_use: number
2927
3145
  /**
2928
3146
  * Combined count of unused entries across `dependencies`,
2929
3147
  * `devDependencies`, and `optionalDependencies`. The per-section
@@ -3105,6 +3323,13 @@ actions: IssueAction[]
3105
3323
  * the merge-base. `None` when serialized directly from Rust.
3106
3324
  */
3107
3325
  introduced?: (AuditIntroduced | null)
3326
+ /**
3327
+ * Gate severity of this finding after `rules` and `overrides[].rules`
3328
+ * resolve for its path. CI formats read it for the annotation, SARIF
3329
+ * and CodeClimate level. Absent in output from older versions. Not
3330
+ * part of the finding identity, baseline keys or fingerprints.
3331
+ */
3332
+ effective_severity?: (EffectiveSeverity | null)
3108
3333
  /**
3109
3334
  * Advisory caveats on the reachability verdict behind this finding.
3110
3335
  * Sorted, deduplicated, and omitted from the wire when empty, so a run
@@ -3308,6 +3533,17 @@ span_start: number
3308
3533
  * Whether this finding comes from a barrel/index re-export rather than the source definition.
3309
3534
  */
3310
3535
  is_re_export: boolean
3536
+ /**
3537
+ * Whether the export's leading JSDoc carries `@deprecated`. Absent from
3538
+ * the wire when false.
3539
+ */
3540
+ deprecated?: boolean
3541
+ /**
3542
+ * Plain-text message of the `@deprecated` tag, capped at
3543
+ * [`DEPRECATED_REASON_MAX_CHARS`] characters. Absent when the export is
3544
+ * not deprecated or the tag carries no text.
3545
+ */
3546
+ deprecated_reason?: (string | null)
3311
3547
  /**
3312
3548
  * Suggested next steps. Always emitted (possibly empty for
3313
3549
  * forward-compat).
@@ -3322,6 +3558,13 @@ semantic?: (SemanticCandidateDecision | null)
3322
3558
  * the merge-base.
3323
3559
  */
3324
3560
  introduced?: (AuditIntroduced | null)
3561
+ /**
3562
+ * Gate severity of this finding after `rules` and `overrides[].rules`
3563
+ * resolve for its path. CI formats read it for the annotation, SARIF
3564
+ * and CodeClimate level. Absent in output from older versions. Not
3565
+ * part of the finding identity, baseline keys or fingerprints.
3566
+ */
3567
+ effective_severity?: (EffectiveSeverity | null)
3325
3568
  /**
3326
3569
  * Advisory caveats on the reachability verdict behind this finding.
3327
3570
  * Sorted, deduplicated, and omitted from the wire when empty. Never gates
@@ -3365,6 +3608,17 @@ span_start: number
3365
3608
  * Whether this finding comes from a barrel/index re-export rather than the source definition.
3366
3609
  */
3367
3610
  is_re_export: boolean
3611
+ /**
3612
+ * Whether the export's leading JSDoc carries `@deprecated`. Absent from
3613
+ * the wire when false.
3614
+ */
3615
+ deprecated?: boolean
3616
+ /**
3617
+ * Plain-text message of the `@deprecated` tag, capped at
3618
+ * [`DEPRECATED_REASON_MAX_CHARS`] characters. Absent when the export is
3619
+ * not deprecated or the tag carries no text.
3620
+ */
3621
+ deprecated_reason?: (string | null)
3368
3622
  /**
3369
3623
  * Suggested next steps. Always emitted (possibly empty for
3370
3624
  * forward-compat).
@@ -3379,6 +3633,13 @@ semantic?: (SemanticCandidateDecision | null)
3379
3633
  * the merge-base.
3380
3634
  */
3381
3635
  introduced?: (AuditIntroduced | null)
3636
+ /**
3637
+ * Gate severity of this finding after `rules` and `overrides[].rules`
3638
+ * resolve for its path. CI formats read it for the annotation, SARIF
3639
+ * and CodeClimate level. Absent in output from older versions. Not
3640
+ * part of the finding identity, baseline keys or fingerprints.
3641
+ */
3642
+ effective_severity?: (EffectiveSeverity | null)
3382
3643
  /**
3383
3644
  * Advisory caveats on the reachability verdict behind this finding.
3384
3645
  * A type export rests on exactly the reachability test an
@@ -3433,6 +3694,103 @@ actions: IssueAction[]
3433
3694
  * the merge-base.
3434
3695
  */
3435
3696
  introduced?: (AuditIntroduced | null)
3697
+ /**
3698
+ * Gate severity of this finding after `rules` and `overrides[].rules`
3699
+ * resolve for its path. CI formats read it for the annotation, SARIF
3700
+ * and CodeClimate level. Absent in output from older versions. Not
3701
+ * part of the finding identity, baseline keys or fingerprints.
3702
+ */
3703
+ effective_severity?: (EffectiveSeverity | null)
3704
+ }
3705
+ /**
3706
+ * Wire-shape envelope for a [`DeprecatedExportInUse`] finding. Carries a
3707
+ * manual `migrate-deprecated-export` primary action plus a `suppress-line`
3708
+ * secondary. Never auto-fixable: fallow does not rewrite consumers.
3709
+ */
3710
+ export interface DeprecatedExportInUseFinding {
3711
+ /**
3712
+ * File that declares the deprecated export.
3713
+ */
3714
+ path: string
3715
+ /**
3716
+ * Name of the deprecated export.
3717
+ */
3718
+ export_name: string
3719
+ /**
3720
+ * Whether this is a type-only export.
3721
+ */
3722
+ is_type_only: boolean
3723
+ /**
3724
+ * 1-based line number of the export.
3725
+ */
3726
+ line: number
3727
+ /**
3728
+ * 0-based byte column offset of the export.
3729
+ */
3730
+ col: number
3731
+ /**
3732
+ * Byte offset of the export in the source file.
3733
+ */
3734
+ span_start: number
3735
+ /**
3736
+ * Plain-text message of the `@deprecated` tag, capped at
3737
+ * [`DEPRECATED_REASON_MAX_CHARS`] characters. Absent when the tag
3738
+ * carries no text.
3739
+ */
3740
+ deprecated_reason?: (string | null)
3741
+ /**
3742
+ * Exact number of distinct consumers: reference sites in reachable
3743
+ * files, one per path, line, column and kind. `consumers` holds the
3744
+ * first [`DEPRECATED_CONSUMER_SAMPLE_CAP`] of them, so the sample is
3745
+ * complete when this count is at most the cap.
3746
+ */
3747
+ consumer_count: number
3748
+ /**
3749
+ * Consumer sample sorted by path, line, column and kind, capped at
3750
+ * [`DEPRECATED_CONSUMER_SAMPLE_CAP`] entries.
3751
+ */
3752
+ consumers: DeprecatedExportConsumer[]
3753
+ /**
3754
+ * True when the export is part of the public API: it lives in an entry
3755
+ * point, or a re-export chain reaches an entry point. External consumers
3756
+ * are not visible, so the finding makes no removal claim.
3757
+ */
3758
+ public_api: boolean
3759
+ /**
3760
+ * Suggested next steps. Always emitted (possibly empty for
3761
+ * forward-compat).
3762
+ */
3763
+ actions: IssueAction[]
3764
+ /**
3765
+ * Set by the audit pass when this finding is introduced relative to
3766
+ * the merge-base.
3767
+ */
3768
+ introduced?: (AuditIntroduced | null)
3769
+ /**
3770
+ * Gate severity of this finding after `rules` and `overrides[].rules`
3771
+ * resolve for its path. CI formats read it for the annotation, SARIF
3772
+ * and CodeClimate level. Absent in output from older versions. Not
3773
+ * part of the finding identity, baseline keys or fingerprints.
3774
+ */
3775
+ effective_severity?: (EffectiveSeverity | null)
3776
+ }
3777
+ /**
3778
+ * One file location that references a deprecated export.
3779
+ */
3780
+ export interface DeprecatedExportConsumer {
3781
+ /**
3782
+ * File that references the deprecated export.
3783
+ */
3784
+ path: string
3785
+ /**
3786
+ * 1-based line number of the import or re-export statement.
3787
+ */
3788
+ line: number
3789
+ /**
3790
+ * 0-based byte column offset of the import or re-export statement.
3791
+ */
3792
+ col: number
3793
+ kind: DeprecatedConsumerKind
3436
3794
  }
3437
3795
  /**
3438
3796
  * Wire-shape envelope for an [`UnusedDependency`] finding consumed under
@@ -3470,6 +3828,13 @@ actions: IssueAction[]
3470
3828
  * the merge-base.
3471
3829
  */
3472
3830
  introduced?: (AuditIntroduced | null)
3831
+ /**
3832
+ * Gate severity of this finding after `rules` and `overrides[].rules`
3833
+ * resolve for its path. CI formats read it for the annotation, SARIF
3834
+ * and CodeClimate level. Absent in output from older versions. Not
3835
+ * part of the finding identity, baseline keys or fingerprints.
3836
+ */
3837
+ effective_severity?: (EffectiveSeverity | null)
3473
3838
  /**
3474
3839
  * Advisory caveats on the verdict behind this finding. A dependency is
3475
3840
  * reported unused when NO module in the project imports its specifier,
@@ -3516,6 +3881,13 @@ actions: IssueAction[]
3516
3881
  * the merge-base.
3517
3882
  */
3518
3883
  introduced?: (AuditIntroduced | null)
3884
+ /**
3885
+ * Gate severity of this finding after `rules` and `overrides[].rules`
3886
+ * resolve for its path. CI formats read it for the annotation, SARIF
3887
+ * and CodeClimate level. Absent in output from older versions. Not
3888
+ * part of the finding identity, baseline keys or fingerprints.
3889
+ */
3890
+ effective_severity?: (EffectiveSeverity | null)
3519
3891
  /**
3520
3892
  * Advisory caveats on the verdict behind this finding. A dependency is
3521
3893
  * reported unused when NO module in the project imports its specifier,
@@ -3562,6 +3934,13 @@ actions: IssueAction[]
3562
3934
  * the merge-base.
3563
3935
  */
3564
3936
  introduced?: (AuditIntroduced | null)
3937
+ /**
3938
+ * Gate severity of this finding after `rules` and `overrides[].rules`
3939
+ * resolve for its path. CI formats read it for the annotation, SARIF
3940
+ * and CodeClimate level. Absent in output from older versions. Not
3941
+ * part of the finding identity, baseline keys or fingerprints.
3942
+ */
3943
+ effective_severity?: (EffectiveSeverity | null)
3565
3944
  /**
3566
3945
  * Advisory caveats on the verdict behind this finding. A dependency is
3567
3946
  * reported unused when NO module in the project imports its specifier,
@@ -3608,6 +3987,13 @@ actions: IssueAction[]
3608
3987
  * the merge-base.
3609
3988
  */
3610
3989
  introduced?: (AuditIntroduced | null)
3990
+ /**
3991
+ * Gate severity of this finding after `rules` and `overrides[].rules`
3992
+ * resolve for its path. CI formats read it for the annotation, SARIF
3993
+ * and CodeClimate level. Absent in output from older versions. Not
3994
+ * part of the finding identity, baseline keys or fingerprints.
3995
+ */
3996
+ effective_severity?: (EffectiveSeverity | null)
3611
3997
  /**
3612
3998
  * Advisory caveats on the verdict behind this finding. A member's usage
3613
3999
  * is collected by walking the member accesses of every module the run
@@ -3660,6 +4046,13 @@ semantic?: (SemanticCandidateDecision | null)
3660
4046
  * the merge-base.
3661
4047
  */
3662
4048
  introduced?: (AuditIntroduced | null)
4049
+ /**
4050
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4051
+ * resolve for its path. CI formats read it for the annotation, SARIF
4052
+ * and CodeClimate level. Absent in output from older versions. Not
4053
+ * part of the finding identity, baseline keys or fingerprints.
4054
+ */
4055
+ effective_severity?: (EffectiveSeverity | null)
3663
4056
  /**
3664
4057
  * Advisory caveats on the verdict behind this finding. A class member's
3665
4058
  * usage is collected by the same reachability-free member-access walk an
@@ -3713,6 +4106,13 @@ actions: IssueAction[]
3713
4106
  * the merge-base.
3714
4107
  */
3715
4108
  introduced?: (AuditIntroduced | null)
4109
+ /**
4110
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4111
+ * resolve for its path. CI formats read it for the annotation, SARIF
4112
+ * and CodeClimate level. Absent in output from older versions. Not
4113
+ * part of the finding identity, baseline keys or fingerprints.
4114
+ */
4115
+ effective_severity?: (EffectiveSeverity | null)
3716
4116
  /**
3717
4117
  * Advisory caveats on the verdict behind this finding. A store member's
3718
4118
  * usage is collected by the same reachability-free member-access walk a
@@ -3763,6 +4163,13 @@ actions: IssueAction[]
3763
4163
  * the merge-base.
3764
4164
  */
3765
4165
  introduced?: (AuditIntroduced | null)
4166
+ /**
4167
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4168
+ * resolve for its path. CI formats read it for the annotation, SARIF
4169
+ * and CodeClimate level. Absent in output from older versions. Not
4170
+ * part of the finding identity, baseline keys or fingerprints.
4171
+ */
4172
+ effective_severity?: (EffectiveSeverity | null)
3766
4173
  }
3767
4174
  /**
3768
4175
  * Wire-shape envelope for an [`UnlistedDependency`] finding. Carries an
@@ -3789,6 +4196,13 @@ actions: IssueAction[]
3789
4196
  * the merge-base.
3790
4197
  */
3791
4198
  introduced?: (AuditIntroduced | null)
4199
+ /**
4200
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4201
+ * resolve for its path. CI formats read it for the annotation, SARIF
4202
+ * and CodeClimate level. Absent in output from older versions. Not
4203
+ * part of the finding identity, baseline keys or fingerprints.
4204
+ */
4205
+ effective_severity?: (EffectiveSeverity | null)
3792
4206
  }
3793
4207
  /**
3794
4208
  * A location where an import occurs.
@@ -3839,6 +4253,13 @@ actions: IssueAction[]
3839
4253
  * the merge-base.
3840
4254
  */
3841
4255
  introduced?: (AuditIntroduced | null)
4256
+ /**
4257
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4258
+ * resolve for its path. CI formats read it for the annotation, SARIF
4259
+ * and CodeClimate level. Absent in output from older versions. Not
4260
+ * part of the finding identity, baseline keys or fingerprints.
4261
+ */
4262
+ effective_severity?: (EffectiveSeverity | null)
3842
4263
  }
3843
4264
  /**
3844
4265
  * A location where a duplicate export appears.
@@ -3885,6 +4306,13 @@ actions: IssueAction[]
3885
4306
  * the merge-base.
3886
4307
  */
3887
4308
  introduced?: (AuditIntroduced | null)
4309
+ /**
4310
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4311
+ * resolve for its path. CI formats read it for the annotation, SARIF
4312
+ * and CodeClimate level. Absent in output from older versions. Not
4313
+ * part of the finding identity, baseline keys or fingerprints.
4314
+ */
4315
+ effective_severity?: (EffectiveSeverity | null)
3888
4316
  }
3889
4317
  /**
3890
4318
  * Wire-shape envelope for a [`TestOnlyDependency`] finding. Carries a
@@ -3915,6 +4343,13 @@ actions: IssueAction[]
3915
4343
  * the merge-base.
3916
4344
  */
3917
4345
  introduced?: (AuditIntroduced | null)
4346
+ /**
4347
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4348
+ * resolve for its path. CI formats read it for the annotation, SARIF
4349
+ * and CodeClimate level. Absent in output from older versions. Not
4350
+ * part of the finding identity, baseline keys or fingerprints.
4351
+ */
4352
+ effective_severity?: (EffectiveSeverity | null)
3918
4353
  }
3919
4354
  /**
3920
4355
  * Wire-shape envelope for a [`DevDependencyInProduction`] finding. Carries a
@@ -3946,6 +4381,13 @@ actions: IssueAction[]
3946
4381
  * the merge-base.
3947
4382
  */
3948
4383
  introduced?: (AuditIntroduced | null)
4384
+ /**
4385
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4386
+ * resolve for its path. CI formats read it for the annotation, SARIF
4387
+ * and CodeClimate level. Absent in output from older versions. Not
4388
+ * part of the finding identity, baseline keys or fingerprints.
4389
+ */
4390
+ effective_severity?: (EffectiveSeverity | null)
3949
4391
  }
3950
4392
  /**
3951
4393
  * Wire-shape envelope for a [`CircularDependency`] finding. Mirrors
@@ -3993,6 +4435,13 @@ actions: IssueAction[]
3993
4435
  * the merge-base.
3994
4436
  */
3995
4437
  introduced?: (AuditIntroduced | null)
4438
+ /**
4439
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4440
+ * resolve for its path. CI formats read it for the annotation, SARIF
4441
+ * and CodeClimate level. Absent in output from older versions. Not
4442
+ * part of the finding identity, baseline keys or fingerprints.
4443
+ */
4444
+ effective_severity?: (EffectiveSeverity | null)
3996
4445
  }
3997
4446
  /**
3998
4447
  * One import hop in a circular dependency: the file containing the import
@@ -4048,6 +4497,13 @@ actions: IssueAction[]
4048
4497
  * the merge-base.
4049
4498
  */
4050
4499
  introduced?: (AuditIntroduced | null)
4500
+ /**
4501
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4502
+ * resolve for its path. CI formats read it for the annotation, SARIF
4503
+ * and CodeClimate level. Absent in output from older versions. Not
4504
+ * part of the finding identity, baseline keys or fingerprints.
4505
+ */
4506
+ effective_severity?: (EffectiveSeverity | null)
4051
4507
  }
4052
4508
  /**
4053
4509
  * Wire-shape envelope for a [`BoundaryViolation`] finding. Mirrors
@@ -4094,6 +4550,13 @@ actions: IssueAction[]
4094
4550
  * the merge-base.
4095
4551
  */
4096
4552
  introduced?: (AuditIntroduced | null)
4553
+ /**
4554
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4555
+ * resolve for its path. CI formats read it for the annotation, SARIF
4556
+ * and CodeClimate level. Absent in output from older versions. Not
4557
+ * part of the finding identity, baseline keys or fingerprints.
4558
+ */
4559
+ effective_severity?: (EffectiveSeverity | null)
4097
4560
  }
4098
4561
  /**
4099
4562
  * Wire-shape envelope for a [`BoundaryCoverageViolation`] finding. Carries
@@ -4122,6 +4585,13 @@ actions: IssueAction[]
4122
4585
  * the merge-base.
4123
4586
  */
4124
4587
  introduced?: (AuditIntroduced | null)
4588
+ /**
4589
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4590
+ * resolve for its path. CI formats read it for the annotation, SARIF
4591
+ * and CodeClimate level. Absent in output from older versions. Not
4592
+ * part of the finding identity, baseline keys or fingerprints.
4593
+ */
4594
+ effective_severity?: (EffectiveSeverity | null)
4125
4595
  }
4126
4596
  /**
4127
4597
  * Wire-shape envelope for a [`BoundaryCallViolation`] finding. Carries
@@ -4163,6 +4633,13 @@ actions: IssueAction[]
4163
4633
  * the merge-base.
4164
4634
  */
4165
4635
  introduced?: (AuditIntroduced | null)
4636
+ /**
4637
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4638
+ * resolve for its path. CI formats read it for the annotation, SARIF
4639
+ * and CodeClimate level. Absent in output from older versions. Not
4640
+ * part of the finding identity, baseline keys or fingerprints.
4641
+ */
4642
+ effective_severity?: (EffectiveSeverity | null)
4166
4643
  }
4167
4644
  /**
4168
4645
  * Wire-shape envelope for a [`PolicyViolation`] finding. Carries actions for
@@ -4240,6 +4717,13 @@ missing_reason?: boolean
4240
4717
  * Suggested next steps. Always emitted.
4241
4718
  */
4242
4719
  actions: IssueAction[]
4720
+ /**
4721
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4722
+ * resolve for its path. CI formats read it for the annotation, SARIF
4723
+ * and CodeClimate level. Absent in output from older versions. Not
4724
+ * part of the finding identity, baseline keys or fingerprints.
4725
+ */
4726
+ effective_severity?: (EffectiveSeverity | null)
4243
4727
  }
4244
4728
  /**
4245
4729
  * Wire-shape envelope for an [`UnusedCatalogEntry`] finding. Per-instance
@@ -4280,6 +4764,13 @@ actions: IssueAction[]
4280
4764
  * the merge-base.
4281
4765
  */
4282
4766
  introduced?: (AuditIntroduced | null)
4767
+ /**
4768
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4769
+ * resolve for its path. CI formats read it for the annotation, SARIF
4770
+ * and CodeClimate level. Absent in output from older versions. Not
4771
+ * part of the finding identity, baseline keys or fingerprints.
4772
+ */
4773
+ effective_severity?: (EffectiveSeverity | null)
4283
4774
  }
4284
4775
  /**
4285
4776
  * Wire-shape envelope for an [`EmptyCatalogGroup`] finding. Carries a
@@ -4308,6 +4799,13 @@ actions: IssueAction[]
4308
4799
  * the merge-base.
4309
4800
  */
4310
4801
  introduced?: (AuditIntroduced | null)
4802
+ /**
4803
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4804
+ * resolve for its path. CI formats read it for the annotation, SARIF
4805
+ * and CodeClimate level. Absent in output from older versions. Not
4806
+ * part of the finding identity, baseline keys or fingerprints.
4807
+ */
4808
+ effective_severity?: (EffectiveSeverity | null)
4311
4809
  }
4312
4810
  /**
4313
4811
  * Wire-shape envelope for an [`UnresolvedCatalogReference`] finding. The
@@ -4358,6 +4856,13 @@ actions: IssueAction[]
4358
4856
  * the merge-base.
4359
4857
  */
4360
4858
  introduced?: (AuditIntroduced | null)
4859
+ /**
4860
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4861
+ * resolve for its path. CI formats read it for the annotation, SARIF
4862
+ * and CodeClimate level. Absent in output from older versions. Not
4863
+ * part of the finding identity, baseline keys or fingerprints.
4864
+ */
4865
+ effective_severity?: (EffectiveSeverity | null)
4361
4866
  }
4362
4867
  /**
4363
4868
  * Wire-shape envelope for an [`UnusedDependencyOverride`] finding. Carries
@@ -4420,6 +4925,13 @@ actions: IssueAction[]
4420
4925
  * the merge-base.
4421
4926
  */
4422
4927
  introduced?: (AuditIntroduced | null)
4928
+ /**
4929
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4930
+ * resolve for its path. CI formats read it for the annotation, SARIF
4931
+ * and CodeClimate level. Absent in output from older versions. Not
4932
+ * part of the finding identity, baseline keys or fingerprints.
4933
+ */
4934
+ effective_severity?: (EffectiveSeverity | null)
4423
4935
  }
4424
4936
  /**
4425
4937
  * Wire-shape envelope for a [`MisconfiguredDependencyOverride`] finding.
@@ -4469,6 +4981,13 @@ actions: IssueAction[]
4469
4981
  * the merge-base.
4470
4982
  */
4471
4983
  introduced?: (AuditIntroduced | null)
4984
+ /**
4985
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4986
+ * resolve for its path. CI formats read it for the annotation, SARIF
4987
+ * and CodeClimate level. Absent in output from older versions. Not
4988
+ * part of the finding identity, baseline keys or fingerprints.
4989
+ */
4990
+ effective_severity?: (EffectiveSeverity | null)
4472
4991
  }
4473
4992
  /**
4474
4993
  * Wire-shape envelope for an [`InvalidClientExport`] finding. There is no safe
@@ -4510,6 +5029,13 @@ actions: IssueAction[]
4510
5029
  * the merge-base.
4511
5030
  */
4512
5031
  introduced?: (AuditIntroduced | null)
5032
+ /**
5033
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5034
+ * resolve for its path. CI formats read it for the annotation, SARIF
5035
+ * and CodeClimate level. Absent in output from older versions. Not
5036
+ * part of the finding identity, baseline keys or fingerprints.
5037
+ */
5038
+ effective_severity?: (EffectiveSeverity | null)
4513
5039
  }
4514
5040
  /**
4515
5041
  * Wire-shape envelope for a [`MixedClientServerBarrel`] finding. There is no
@@ -4551,6 +5077,13 @@ actions: IssueAction[]
4551
5077
  * the merge-base.
4552
5078
  */
4553
5079
  introduced?: (AuditIntroduced | null)
5080
+ /**
5081
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5082
+ * resolve for its path. CI formats read it for the annotation, SARIF
5083
+ * and CodeClimate level. Absent in output from older versions. Not
5084
+ * part of the finding identity, baseline keys or fingerprints.
5085
+ */
5086
+ effective_severity?: (EffectiveSeverity | null)
4554
5087
  }
4555
5088
  /**
4556
5089
  * Wire-shape envelope for a [`MisplacedDirective`] finding. There is no safe
@@ -4587,6 +5120,13 @@ actions: IssueAction[]
4587
5120
  * the merge-base.
4588
5121
  */
4589
5122
  introduced?: (AuditIntroduced | null)
5123
+ /**
5124
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5125
+ * resolve for its path. CI formats read it for the annotation, SARIF
5126
+ * and CodeClimate level. Absent in output from older versions. Not
5127
+ * part of the finding identity, baseline keys or fingerprints.
5128
+ */
5129
+ effective_severity?: (EffectiveSeverity | null)
4590
5130
  }
4591
5131
  /**
4592
5132
  * Wire-shape envelope for an [`UnprovidedInject`] finding. There is no safe
@@ -4625,6 +5165,13 @@ actions: IssueAction[]
4625
5165
  * the merge-base.
4626
5166
  */
4627
5167
  introduced?: (AuditIntroduced | null)
5168
+ /**
5169
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5170
+ * resolve for its path. CI formats read it for the annotation, SARIF
5171
+ * and CodeClimate level. Absent in output from older versions. Not
5172
+ * part of the finding identity, baseline keys or fingerprints.
5173
+ */
5174
+ effective_severity?: (EffectiveSeverity | null)
4628
5175
  }
4629
5176
  /**
4630
5177
  * Wire-shape envelope for an [`UnrenderedComponent`] finding. There is no safe
@@ -4674,6 +5221,13 @@ actions: IssueAction[]
4674
5221
  * the merge-base.
4675
5222
  */
4676
5223
  introduced?: (AuditIntroduced | null)
5224
+ /**
5225
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5226
+ * resolve for its path. CI formats read it for the annotation, SARIF
5227
+ * and CodeClimate level. Absent in output from older versions. Not
5228
+ * part of the finding identity, baseline keys or fingerprints.
5229
+ */
5230
+ effective_severity?: (EffectiveSeverity | null)
4677
5231
  }
4678
5232
  /**
4679
5233
  * Wire-shape envelope for a [`RouteCollision`] finding. A route collision is a
@@ -4716,6 +5270,13 @@ actions: IssueAction[]
4716
5270
  * the merge-base.
4717
5271
  */
4718
5272
  introduced?: (AuditIntroduced | null)
5273
+ /**
5274
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5275
+ * resolve for its path. CI formats read it for the annotation, SARIF
5276
+ * and CodeClimate level. Absent in output from older versions. Not
5277
+ * part of the finding identity, baseline keys or fingerprints.
5278
+ */
5279
+ effective_severity?: (EffectiveSeverity | null)
4719
5280
  }
4720
5281
  /**
4721
5282
  * Wire-shape envelope for a [`DynamicSegmentNameConflict`] finding. The
@@ -4762,6 +5323,13 @@ actions: IssueAction[]
4762
5323
  * the merge-base.
4763
5324
  */
4764
5325
  introduced?: (AuditIntroduced | null)
5326
+ /**
5327
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5328
+ * resolve for its path. CI formats read it for the annotation, SARIF
5329
+ * and CodeClimate level. Absent in output from older versions. Not
5330
+ * part of the finding identity, baseline keys or fingerprints.
5331
+ */
5332
+ effective_severity?: (EffectiveSeverity | null)
4765
5333
  }
4766
5334
  /**
4767
5335
  * Wire-shape envelope for an [`UnusedComponentProp`] finding. There is no safe
@@ -4800,6 +5368,13 @@ actions: IssueAction[]
4800
5368
  * the merge-base.
4801
5369
  */
4802
5370
  introduced?: (AuditIntroduced | null)
5371
+ /**
5372
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5373
+ * resolve for its path. CI formats read it for the annotation, SARIF
5374
+ * and CodeClimate level. Absent in output from older versions. Not
5375
+ * part of the finding identity, baseline keys or fingerprints.
5376
+ */
5377
+ effective_severity?: (EffectiveSeverity | null)
4803
5378
  }
4804
5379
  /**
4805
5380
  * Wire-shape envelope for an [`UnusedComponentEmit`] finding. There is no safe
@@ -4838,6 +5413,13 @@ actions: IssueAction[]
4838
5413
  * the merge-base.
4839
5414
  */
4840
5415
  introduced?: (AuditIntroduced | null)
5416
+ /**
5417
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5418
+ * resolve for its path. CI formats read it for the annotation, SARIF
5419
+ * and CodeClimate level. Absent in output from older versions. Not
5420
+ * part of the finding identity, baseline keys or fingerprints.
5421
+ */
5422
+ effective_severity?: (EffectiveSeverity | null)
4841
5423
  }
4842
5424
  /**
4843
5425
  * Wire-shape envelope for an [`UnusedComponentInput`] finding. There is no safe
@@ -4876,6 +5458,13 @@ actions: IssueAction[]
4876
5458
  * the merge-base.
4877
5459
  */
4878
5460
  introduced?: (AuditIntroduced | null)
5461
+ /**
5462
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5463
+ * resolve for its path. CI formats read it for the annotation, SARIF
5464
+ * and CodeClimate level. Absent in output from older versions. Not
5465
+ * part of the finding identity, baseline keys or fingerprints.
5466
+ */
5467
+ effective_severity?: (EffectiveSeverity | null)
4879
5468
  }
4880
5469
  /**
4881
5470
  * Wire-shape envelope for an [`UnusedComponentOutput`] finding. There is no safe
@@ -4914,6 +5503,13 @@ actions: IssueAction[]
4914
5503
  * the merge-base.
4915
5504
  */
4916
5505
  introduced?: (AuditIntroduced | null)
5506
+ /**
5507
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5508
+ * resolve for its path. CI formats read it for the annotation, SARIF
5509
+ * and CodeClimate level. Absent in output from older versions. Not
5510
+ * part of the finding identity, baseline keys or fingerprints.
5511
+ */
5512
+ effective_severity?: (EffectiveSeverity | null)
4917
5513
  }
4918
5514
  /**
4919
5515
  * Wire-shape envelope for an [`UnusedSvelteEvent`] finding. There is no safe
@@ -4953,6 +5549,13 @@ actions: IssueAction[]
4953
5549
  * the merge-base.
4954
5550
  */
4955
5551
  introduced?: (AuditIntroduced | null)
5552
+ /**
5553
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5554
+ * resolve for its path. CI formats read it for the annotation, SARIF
5555
+ * and CodeClimate level. Absent in output from older versions. Not
5556
+ * part of the finding identity, baseline keys or fingerprints.
5557
+ */
5558
+ effective_severity?: (EffectiveSeverity | null)
4956
5559
  }
4957
5560
  /**
4958
5561
  * Wire-shape envelope for an [`UnusedServerAction`] finding. There is no safe
@@ -4987,6 +5590,13 @@ actions: IssueAction[]
4987
5590
  * the merge-base.
4988
5591
  */
4989
5592
  introduced?: (AuditIntroduced | null)
5593
+ /**
5594
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5595
+ * resolve for its path. CI formats read it for the annotation, SARIF
5596
+ * and CodeClimate level. Absent in output from older versions. Not
5597
+ * part of the finding identity, baseline keys or fingerprints.
5598
+ */
5599
+ effective_severity?: (EffectiveSeverity | null)
4990
5600
  }
4991
5601
  /**
4992
5602
  * Wire-shape envelope for an [`UnusedLoadDataKey`] finding. There is no safe
@@ -5027,6 +5637,13 @@ actions: IssueAction[]
5027
5637
  * the merge-base.
5028
5638
  */
5029
5639
  introduced?: (AuditIntroduced | null)
5640
+ /**
5641
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5642
+ * resolve for its path. CI formats read it for the annotation, SARIF
5643
+ * and CodeClimate level. Absent in output from older versions. Not
5644
+ * part of the finding identity, baseline keys or fingerprints.
5645
+ */
5646
+ effective_severity?: (EffectiveSeverity | null)
5030
5647
  }
5031
5648
  /**
5032
5649
  * Wire-shape envelope for a [`PropDrillingChain`] finding. There is no safe
@@ -5061,6 +5678,14 @@ actions: IssueAction[]
5061
5678
  * the merge-base.
5062
5679
  */
5063
5680
  introduced?: (AuditIntroduced | null)
5681
+ /**
5682
+ * Rule severity of this finding. This type never gates the run, so the
5683
+ * value does not change the exit code. `fallow report --from` reads it
5684
+ * for the SARIF level, so the level does not depend on the config at
5685
+ * render time. Absent in output from older versions. Not part of the
5686
+ * finding identity, baseline keys or fingerprints.
5687
+ */
5688
+ effective_severity?: (EffectiveSeverity | null)
5064
5689
  }
5065
5690
  /**
5066
5691
  * One hop in a prop-drilling chain: a component that received the prop and
@@ -5118,6 +5743,14 @@ actions: IssueAction[]
5118
5743
  * the merge-base.
5119
5744
  */
5120
5745
  introduced?: (AuditIntroduced | null)
5746
+ /**
5747
+ * Rule severity of this finding. This type never gates the run, so the
5748
+ * value does not change the exit code. `fallow report --from` reads it
5749
+ * for the SARIF level, so the level does not depend on the config at
5750
+ * render time. Absent in output from older versions. Not part of the
5751
+ * finding identity, baseline keys or fingerprints.
5752
+ */
5753
+ effective_severity?: (EffectiveSeverity | null)
5121
5754
  }
5122
5755
  /**
5123
5756
  * Wire-shape envelope for a [`DuplicatePropShape`] finding. There is no safe
@@ -5168,6 +5801,14 @@ actions: IssueAction[]
5168
5801
  * the merge-base.
5169
5802
  */
5170
5803
  introduced?: (AuditIntroduced | null)
5804
+ /**
5805
+ * Rule severity of this finding. This type never gates the run, so the
5806
+ * value does not change the exit code. `fallow report --from` reads it
5807
+ * for the SARIF level, so the level does not depend on the config at
5808
+ * render time. Absent in output from older versions. Not part of the
5809
+ * finding identity, baseline keys or fingerprints.
5810
+ */
5811
+ effective_severity?: (EffectiveSeverity | null)
5171
5812
  }
5172
5813
  /**
5173
5814
  * One member of a duplicate-prop-shape group: the OTHER components that share
@@ -5289,7 +5930,8 @@ current_findings: number
5289
5930
  * differ per command and include a diff, a base ref, `--changed-since`,
5290
5931
  * `--workspace`, `--changed-workspaces`, `--scope`, `--file`, an
5291
5932
  * issue-type filter, and production mode. Both `stale` and `gate_trips`
5292
- * are false whenever this is true.
5933
+ * are false whenever this is true. `scope_reasons` names the channels
5934
+ * that fired.
5293
5935
  */
5294
5936
  change_scoped: boolean
5295
5937
  /**
@@ -5301,13 +5943,21 @@ change_scoped: boolean
5301
5943
  stale: boolean
5302
5944
  warning: BaselineStalenessAdvisory
5303
5945
  /**
5304
- * True exactly when
5305
- * `!change_scoped && baseline_entries > 0 && matched_entries < baseline_entries`,
5306
- * which is the rule `--fail-on-stale-baseline` applies. Deliberately
5307
- * stricter than `stale`: any unmatched entry counts. It describes the
5308
- * baseline, not the run's exit code: `health --report-only` is an explicit
5309
- * request never to fail, so that run exits 0 and says so on stderr while
5310
- * still reporting `gate_trips: true` here.
5946
+ * True exactly when `unrecognised_format` is true, or
5947
+ * `!change_scoped && baseline_entries > 0 && matched_entries < baseline_entries`.
5948
+ * That is the rule `--fail-on-stale-baseline` applies. Deliberately
5949
+ * stricter than `stale`: any unmatched entry counts, and so does a file
5950
+ * this command could not read as its own, which protects nothing at all.
5951
+ * The second half is suppressed by `change_scoped` and the first is not:
5952
+ * which command wrote a file does not depend on how much of the project
5953
+ * the run looked at.
5954
+ *
5955
+ * It describes the baseline, not the run's exit code: `health
5956
+ * --report-only` is an explicit request never to fail, so that run exits 0
5957
+ * and says so on stderr while still reporting `gate_trips: true` here, and
5958
+ * `fallow audit` never judges a baseline at all, so its
5959
+ * `gate_outcomes["stale-baseline"]` stands down beside a section that
5960
+ * reports `true`.
5311
5961
  */
5312
5962
  gate_trips: boolean
5313
5963
  /**
@@ -5317,6 +5967,50 @@ gate_trips: boolean
5317
5967
  * `0`. Always `0` in health's count mode too.
5318
5968
  */
5319
5969
  moved_entries: number
5970
+ /**
5971
+ * True when the loaded file is not a baseline of the command that read it:
5972
+ * it names another command in its top-level `kind`, or it names none and
5973
+ * carries no key this command's own format writes. Read this, not
5974
+ * `baseline_entries == 0`, before telling anyone their baseline is the
5975
+ * wrong file: a baseline saved from a project that had nothing to record
5976
+ * is legitimately empty and is not a mistake.
5977
+ *
5978
+ * Present only when true, so an envelope from a run that loaded its own
5979
+ * baseline is unchanged. All three commands set it, including `dead-code`,
5980
+ * which classifies the file before its required fields could reject it.
5981
+ * A file with no `kind` is the reading a baseline saved before that member
5982
+ * existed gets, which is why the keys remain the fallback.
5983
+ */
5984
+ unrecognised_format?: boolean
5985
+ /**
5986
+ * The command that saved the loaded file, when `unrecognised_format` is
5987
+ * true and the file names a writer this version knows: `dead-code`,
5988
+ * `dupes` or `health`, the token the file carries in its top-level `kind`.
5989
+ *
5990
+ * Absent, never null, for this command's own baseline, for a file that
5991
+ * names no writer (an empty file, or a baseline saved before `kind`
5992
+ * existed) and for a `kind` token this version does not know. The value
5993
+ * set is OPEN: a later release can add a writer, so treat an unknown value
5994
+ * as "another command". The CLI computes it once per loaded baseline and
5995
+ * uses the same value for its stderr note.
5996
+ */
5997
+ saved_by?: string
5998
+ /**
5999
+ * Which channels narrowed this run, present and non-empty exactly when
6000
+ * `change_scoped` is true. Both members are derived from one function, so
6001
+ * the boolean and the array cannot disagree.
6002
+ *
6003
+ * Read it to decide whether the narrowing is removable: a run narrowed
6004
+ * only by `diff`, `changed-since`, `changed-files`, `scope`, `file` or
6005
+ * `issue-type-filter` can be repeated unscoped to judge the baseline,
6006
+ * while `production`, `workspace` and `changed-workspaces` are the
6007
+ * caller's own choice about what to analyze and an unscoped repeat would
6008
+ * contradict it.
6009
+ *
6010
+ * The name set is OPEN and the names a command can emit differ per
6011
+ * command; see [`ScopeReason`].
6012
+ */
6013
+ scope_reasons?: ScopeReason[]
5320
6014
  }
5321
6015
  /**
5322
6016
  * Result of regression detection (`--fail-on-regression`). Compares current
@@ -5354,6 +6048,109 @@ exceeded: boolean
5354
6048
  */
5355
6049
  reason?: (string | null)
5356
6050
  }
6051
+ /**
6052
+ * Every narrowing or shaping request a run RECEIVED, keyed by name.
6053
+ *
6054
+ * Received, not failed: a request the run honoured is published with
6055
+ * `status: "applied"`, so a consumer can say "scoped to the change"
6056
+ * positively. Read an absent object as "nothing was asked for", never as
6057
+ * "nothing failed".
6058
+ *
6059
+ * Absent from an envelope whenever it is empty, so a run that was asked for
6060
+ * nothing is byte-identical to one produced before this object existed. An
6061
+ * empty object is never emitted: it would assert that something was asked and
6062
+ * all of it applied, which is a different and false claim.
6063
+ *
6064
+ * The names this build can emit are `changed-since`, `diff-filter` and
6065
+ * `sarif-file`. The reasons are `git-missing`, `not-a-repository`,
6066
+ * `git-failed` and `invalid-ref` for `changed-since`, `oversize`,
6067
+ * `unreadable`, `not-utf8`, `foreign-namespace` and `ambiguous-base` for
6068
+ * `diff-filter`, and `directory-create-failed`, `write-failed` and
6069
+ * `serialize-failed` for `sarif-file`. Every set is OPEN: a name a consumer
6070
+ * does not recognise means "some request", not an error.
6071
+ *
6072
+ * `sarif-file` reports a SECONDARY artifact rather than the scope of the
6073
+ * report it travels in, and it is in the same object for the same reason the
6074
+ * others are: the run was asked to do something and did something else, and
6075
+ * nothing in the primary report says so. Which of the two an entry is, every
6076
+ * entry says for itself: `affects` is `scope` for the narrowing requests and
6077
+ * `artifact` for this one. Select on it. A consumer that instead assumes the
6078
+ * whole object narrows the report tells its reader an unwritten SARIF file
6079
+ * widened the analysis, which is what `affects` exists to prevent.
6080
+ *
6081
+ * `scope_size` is emitted for `diff-filter`, in added lines, and for
6082
+ * `changed-since`, in changed files that the run analyzed. `sarif-file`
6083
+ * measures no scope. A consumer reads the unit off the name, so a name that
6084
+ * starts to measure its own scope in a later release needs no change here.
6085
+ *
6086
+ * `invalid-ref` is reachable only through the programmatic API. The
6087
+ * `--changed-since` flag validates its value before a run starts and fails
6088
+ * with exit 2 and an error document, which is the right side to err on: a
6089
+ * malformed ref is invalid input rather than a report of the wrong scope.
6090
+ */
6091
+ export interface RequestOutcomes {
6092
+ [k: string]: RequestOutcome
6093
+ }
6094
+ /**
6095
+ * One request's fate on one run.
6096
+ *
6097
+ * `reason` and `message` are present exactly when `status` is not `applied`,
6098
+ * and absent otherwise, so a consumer that only wants to know whether a
6099
+ * report is scoped reads `status` alone.
6100
+ */
6101
+ export interface RequestOutcome {
6102
+ status: RequestStatus
6103
+ affects: RequestEffect
6104
+ /**
6105
+ * What was asked, as the user spelled it: the git ref for
6106
+ * `changed-since`, the diff source label (`--diff-file pr.diff`,
6107
+ * `--diff-stdin`, `$FALLOW_DIFF_FILE build/pr.diff`, or
6108
+ * `diffFile pr.diff` for the programmatic option) for `diff-filter`,
6109
+ * the target path for `sarif-file`. Echoed rather than normalised, so a
6110
+ * consumer must not join it to the project root the way it joins every
6111
+ * other path-shaped field.
6112
+ */
6113
+ requested: string
6114
+ /**
6115
+ * How much this request left in scope, in the request's own unit, when the
6116
+ * run applied it AND measured that scope. Absent otherwise, including on
6117
+ * every unapplied entry: a request that stood down narrowed nothing, so a
6118
+ * number there would describe a scope nobody applied.
6119
+ *
6120
+ * The unit belongs to the name. `diff-filter` counts added lines, which is
6121
+ * what its filter keeps a finding for. `changed-since` counts changed
6122
+ * files that the run analyzed: a changed file that discovery or an ignore
6123
+ * rule dropped does not count, so a change to a README only gives `0`. A
6124
+ * combined run counts a file that any of its analyses kept, because a
6125
+ * per-analysis `production` setting can give its analyses different
6126
+ * files.
6127
+ * Read the unit off the name the entry is keyed under, never across names,
6128
+ * and read an absent member as "not measured" rather than as zero.
6129
+ *
6130
+ * The count is what the run INDEXED rather than the true total:
6131
+ * `diff-filter` indexes at most one million added lines and reports that
6132
+ * cap for a larger diff, so read any non-zero value as a lower bound.
6133
+ *
6134
+ * `0` is the case this member exists for: a request that applied over an
6135
+ * EMPTY scope. Every finding then filters out and the report reads clean,
6136
+ * so a consumer that sees no findings beside `scope_size: 0` learns that
6137
+ * nothing was analyzable rather than that the code is clean.
6138
+ */
6139
+ scope_size?: (number | null)
6140
+ /**
6141
+ * Why the request was not applied, as a kebab-case token. Present exactly
6142
+ * when `status` is not `applied`. The set is open per request name; the
6143
+ * names this build can emit are listed on [`RequestOutcomes`].
6144
+ */
6145
+ reason?: (string | null)
6146
+ /**
6147
+ * One sentence naming what was asked, what happened instead, and the next
6148
+ * step. Byte-identical to the stderr line for the same case, so a
6149
+ * consumer that renders this never contradicts a log a human read.
6150
+ * Present exactly when `status` is not `applied`.
6151
+ */
6152
+ message?: (string | null)
6153
+ }
5357
6154
  /**
5358
6155
  * A read-only follow-up command fallow surfaces from the current findings,
5359
6156
  * emitted as the top-level `next_steps` array on each command's JSON envelope.
@@ -5923,6 +6720,14 @@ react_prop_count?: number
5923
6720
  react_hook_profile?: (ReactHookProfile | null)
5924
6721
  exceeded: ExceededThreshold
5925
6722
  severity: FindingSeverity
6723
+ /**
6724
+ * Gate severity after the `complexity-*` rules and their
6725
+ * `overrides[].rules` entries: `error` fails the run, `warn` does not.
6726
+ * The most severe rule of the kinds in `exceeded` wins. It is separate
6727
+ * from the band in `severity`, which ranks the finding and does not gate
6728
+ * it. Absent in reports from older versions.
6729
+ */
6730
+ effective_severity?: (EffectiveSeverity | null)
5926
6731
  /**
5927
6732
  * CRAP score (change risk anti-pattern), when coverage data exists.
5928
6733
  */
@@ -6229,6 +7034,11 @@ average_maintainability?: (number | null)
6229
7034
  * Coverage model behind the CRAP scores, when coverage was used.
6230
7035
  */
6231
7036
  coverage_model?: (CoverageModel | null)
7037
+ /**
7038
+ * Input format of the measured coverage (`istanbul` or `v8`). Present
7039
+ * only with `coverage_model: "istanbul"`.
7040
+ */
7041
+ coverage_input_format?: (CoverageInputFormat | null)
6232
7042
  /**
6233
7043
  * Whether CRAP findings mix coverage sources.
6234
7044
  */
@@ -7232,8 +8042,8 @@ watermark?: (RuntimeCoverageWatermark | null)
7232
8042
  */
7233
8043
  warnings?: RuntimeCoverageMessage[]
7234
8044
  /**
7235
- * Whether an autonomous agent may act on this report (fallow-rs/fallow-cloud#316,
7236
- * mirrors the cloud runtime-context contract). `false` when the capture
8045
+ * Whether an autonomous agent may act on this report (mirrors
8046
+ * the cloud runtime-context contract). `false` when the capture
7237
8047
  * carries no usable runtime evidence (no tracked functions); then
7238
8048
  * `actionability_verdict` is `insufficient_evidence` and
7239
8049
  * `actionability_reason` explains. F4: a non-action floor, never a gate on a
@@ -7463,7 +8273,7 @@ description: string
7463
8273
  auto_fixable: boolean
7464
8274
  }
7465
8275
  /**
7466
- * Discriminator inputs that PRODUCED a finding's verdict (fallow-rs/fallow-cloud#321),
8276
+ * Discriminator inputs that PRODUCED a finding's verdict,
7467
8277
  * emitted alongside the verdict so an agent can reproduce it and see the
7468
8278
  * minimum-observation confidence cap instead of re-deriving them from scratch.
7469
8279
  * F4: these make the EXISTING Fallow-owned discriminators legible; they are not
@@ -7659,7 +8469,7 @@ code: string
7659
8469
  message: string
7660
8470
  }
7661
8471
  /**
7662
- * Provenance of a runtime-coverage report (fallow-rs/fallow-cloud#319), mirroring
8472
+ * Provenance of a runtime-coverage report, mirroring
7663
8473
  * the cloud runtime-context `provenance` block so the local-capture and cloud
7664
8474
  * surfaces present one portable shape. F4: provenance is context only; it never
7665
8475
  * gates a verdict or confidence.
@@ -9859,6 +10669,12 @@ imported_by: string[]
9859
10669
  * Re-exports declared by this file.
9860
10670
  */
9861
10671
  re_exports: TracedReExport[]
10672
+ /**
10673
+ * The configs that make this file an entry point through Module
10674
+ * Federation `exposes`, one per config. Absent when no Federation config
10675
+ * exposes the file (issue #2796).
10676
+ */
10677
+ sources?: TraceSource[]
9862
10678
  }
9863
10679
  /**
9864
10680
  * An export with usage information.
@@ -9898,6 +10714,37 @@ imported_name: string
9898
10714
  */
9899
10715
  exported_name: string
9900
10716
  }
10717
+ /**
10718
+ * A config that names a traced file or a traced dependency, and the key that
10719
+ * names it.
10720
+ */
10721
+ export interface TraceSource {
10722
+ /**
10723
+ * The mechanism that names the file or the dependency:
10724
+ * `module-federation`. The set is open.
10725
+ */
10726
+ kind: string
10727
+ /**
10728
+ * The plugin that read the config, as it labels itself:
10729
+ * `module-federation` for a standalone `module-federation.config.*`,
10730
+ * or the bundler plugin (`webpack`, `rspack`, `rsbuild`, `vite`,
10731
+ * `nextjs`) that read the same options inline from its own config.
10732
+ */
10733
+ plugin: string
10734
+ /**
10735
+ * The file that names the file or the dependency, relative to the
10736
+ * project root: the config file, or the source file of a Module
10737
+ * Federation runtime call.
10738
+ */
10739
+ config: string
10740
+ /**
10741
+ * The config key or the runtime function that names the file or the
10742
+ * dependency: `exposes` for an exposed file, `remotes` for a remote
10743
+ * alias, and `registerRemotes`, `loadRemote`, `init` or `createInstance`
10744
+ * for a remote that a runtime call names. The set is open.
10745
+ */
10746
+ key: string
10747
+ }
9901
10748
  /**
9902
10749
  * Result of tracing a dependency: where it is used.
9903
10750
  */
@@ -9926,6 +10773,13 @@ is_used: boolean
9926
10773
  * Total import count.
9927
10774
  */
9928
10775
  import_count: number
10776
+ /**
10777
+ * The configs that declare this name as a Module Federation remote alias
10778
+ * under `remotes`, one per config. A remote alias is provided by a
10779
+ * remote container at runtime, not by an npm package. Absent when no
10780
+ * Federation config declares the name (issue #2796).
10781
+ */
10782
+ sources?: TraceSource[]
9929
10783
  }
9930
10784
  /**
9931
10785
  * Result of tracing a clone: all groups containing the code at a source
@@ -11018,15 +11872,25 @@ grouped_by?: (GroupByMode | null)
11018
11872
  */
11019
11873
  groups?: (HealthGroup[] | null)
11020
11874
  /**
11021
- * Every gate this run ARMED, keyed by name, absent when it armed none.
11022
- * Each entry is the same rule that decides the exit code, so a CI
11023
- * integration reads the verdict instead of guessing from a process status
11024
- * it usually cannot see. A gate fails the build when `status` is `fail`
11025
- * AND `enforced` is true. Armed, not evaluated: fallow's default severity
11026
- * rules fail a run with no flag at all, so an absent object means "no gate
11027
- * was asked for", never "nothing failed". See [`crate::GateOutcomes`].
11875
+ * The verdict of every gate this run evaluated, keyed by name. The CLI
11876
+ * always emits it, with the command's default exit rule in it also when
11877
+ * no flag armed a gate, so a CI integration reads the verdict instead of
11878
+ * guessing from a process status it usually cannot see. A gate fails the
11879
+ * build when `status` is `fail` AND `enforced` is true. The typed
11880
+ * programmatic API runs no CLI gate and leaves it absent. See
11881
+ * [`crate::GateOutcomes`].
11028
11882
  */
11029
11883
  gate_outcomes?: (GateOutcomes | null)
11884
+ /**
11885
+ * Every narrowing or shaping request this run RECEIVED, keyed by name,
11886
+ * absent when it was asked for nothing. An entry whose `status` is not
11887
+ * `applied` means the run could not do what it was asked and reported
11888
+ * something WIDER instead, so what follows is a valid report of a scope
11889
+ * nobody requested. Honoured requests are published too, with
11890
+ * `status: "applied"`, so an absent object means "nothing was asked for",
11891
+ * never "nothing failed". See [`crate::RequestOutcomes`].
11892
+ */
11893
+ request_outcomes?: (RequestOutcomes | null)
11030
11894
  /**
11031
11895
  * `_meta` block with metric definitions, when `--explain` was passed.
11032
11896
  */
@@ -11211,15 +12075,23 @@ groups?: (DuplicationGroup[] | null)
11211
12075
  */
11212
12076
  baseline_staleness?: (BaselineStaleness | null)
11213
12077
  /**
11214
- * Every gate this run ARMED, keyed by name, absent when it armed none.
11215
- * Each entry is the same rule that decides the exit code, so a CI
11216
- * integration reads the verdict instead of guessing from a process status
11217
- * it usually cannot see. A gate fails the build when `status` is `fail`
11218
- * AND `enforced` is true. Armed, not evaluated: fallow's default severity
11219
- * rules fail a run with no flag at all, so an absent object means "no gate
11220
- * was asked for", never "nothing failed". See [`crate::GateOutcomes`].
12078
+ * The verdict of every gate this run armed, keyed by name, absent when
12079
+ * it armed none. `dupes` has no default exit rule: a run with no armed
12080
+ * gate always exits 0, so an absent object means that the run passed. A
12081
+ * gate fails the build when `status` is `fail` AND `enforced` is true.
12082
+ * See [`crate::GateOutcomes`].
11221
12083
  */
11222
12084
  gate_outcomes?: (GateOutcomes | null)
12085
+ /**
12086
+ * Every narrowing or shaping request this run RECEIVED, keyed by name,
12087
+ * absent when it was asked for nothing. An entry whose `status` is not
12088
+ * `applied` means the run could not do what it was asked and reported
12089
+ * something WIDER instead, so what follows is a valid report of a scope
12090
+ * nobody requested. Honoured requests are published too, with
12091
+ * `status: "applied"`, so an absent object means "nothing was asked for",
12092
+ * never "nothing failed". See [`crate::RequestOutcomes`].
12093
+ */
12094
+ request_outcomes?: (RequestOutcomes | null)
11223
12095
  /**
11224
12096
  * `_meta` block with metric / rule definitions, emitted when `--explain`
11225
12097
  * is passed (always present in MCP responses).
@@ -11388,15 +12260,25 @@ groups: CheckGroupedEntry[]
11388
12260
  */
11389
12261
  baseline_staleness?: (BaselineStaleness | null)
11390
12262
  /**
11391
- * Every gate this run ARMED, keyed by name, absent when it armed none.
11392
- * Each entry is the same rule that decides the exit code, so a CI
11393
- * integration reads the verdict instead of guessing from a process status
11394
- * it usually cannot see. A gate fails the build when `status` is `fail`
11395
- * AND `enforced` is true. Armed, not evaluated: fallow's default severity
11396
- * rules fail a run with no flag at all, so an absent object means "no gate
11397
- * was asked for", never "nothing failed". See [`crate::GateOutcomes`].
12263
+ * The verdict of every gate this run evaluated, keyed by name. The CLI
12264
+ * always emits it, with the command's default exit rule in it also when
12265
+ * no flag armed a gate, so a CI integration reads the verdict instead of
12266
+ * guessing from a process status it usually cannot see. A gate fails the
12267
+ * build when `status` is `fail` AND `enforced` is true. The typed
12268
+ * programmatic API runs no CLI gate and leaves it absent. See
12269
+ * [`crate::GateOutcomes`].
11398
12270
  */
11399
12271
  gate_outcomes?: (GateOutcomes | null)
12272
+ /**
12273
+ * Every narrowing or shaping request this run RECEIVED, keyed by name,
12274
+ * absent when it was asked for nothing. An entry whose `status` is not
12275
+ * `applied` means the run could not do what it was asked and reported
12276
+ * something WIDER instead, so what follows is a valid report of a scope
12277
+ * nobody requested. Honoured requests are published too, with
12278
+ * `status: "applied"`, so an absent object means "nothing was asked for",
12279
+ * never "nothing failed". See [`crate::RequestOutcomes`].
12280
+ */
12281
+ request_outcomes?: (RequestOutcomes | null)
11400
12282
  /**
11401
12283
  * `_meta` block with docs and rule definitions, when `--explain` was
11402
12284
  * passed.
@@ -11456,6 +12338,12 @@ unused_types: UnusedTypeFinding[]
11456
12338
  * typed `actions` array natively.
11457
12339
  */
11458
12340
  private_type_leaks: PrivateTypeLeakFinding[]
12341
+ /**
12342
+ * Exports marked `@deprecated` that still have at least one consumer in
12343
+ * a reachable file. Wrapped in [`DeprecatedExportInUseFinding`]. Opt-in: the
12344
+ * `deprecated-exports-in-use` rule defaults to `off`.
12345
+ */
12346
+ deprecated_exports_in_use?: DeprecatedExportInUseFinding[]
11459
12347
  /**
11460
12348
  * Dependencies listed in package.json but never imported. Wrapped in
11461
12349
  * [`UnusedDependencyFinding`] so each entry carries a typed `actions`
@@ -12067,15 +12955,25 @@ version: ToolVersion
12067
12955
  elapsed_ms: ElapsedMs
12068
12956
  config: SecurityOutputConfig
12069
12957
  /**
12070
- * Every gate this run ARMED, keyed by name, absent when it armed none.
12071
- * Each entry is the same rule that decides the exit code, so a CI
12072
- * integration reads the verdict instead of guessing from a process status
12073
- * it usually cannot see. A gate fails the build when `status` is `fail`
12074
- * AND `enforced` is true. Armed, not evaluated: fallow's default severity
12075
- * rules fail a run with no flag at all, so an absent object means "no gate
12076
- * was asked for", never "nothing failed". See [`crate::GateOutcomes`].
12958
+ * The verdict of every gate this run evaluated, keyed by name. The CLI
12959
+ * always emits it, with the command's default exit rule in it also when
12960
+ * no flag armed a gate, so a CI integration reads the verdict instead of
12961
+ * guessing from a process status it usually cannot see. A gate fails the
12962
+ * build when `status` is `fail` AND `enforced` is true. The typed
12963
+ * programmatic API runs no CLI gate and leaves it absent. See
12964
+ * [`crate::GateOutcomes`].
12077
12965
  */
12078
12966
  gate_outcomes?: (GateOutcomes | null)
12967
+ /**
12968
+ * Every narrowing or shaping request this run RECEIVED, keyed by name,
12969
+ * absent when it was asked for nothing. An entry whose `status` is not
12970
+ * `applied` means the run could not do what it was asked and reported
12971
+ * something WIDER instead, so what follows is a valid report of a scope
12972
+ * nobody requested. Honoured requests are published too, with
12973
+ * `status: "applied"`, so an absent object means "nothing was asked for",
12974
+ * never "nothing failed". See [`crate::RequestOutcomes`].
12975
+ */
12976
+ request_outcomes?: (RequestOutcomes | null)
12079
12977
  /**
12080
12978
  * Security-specific rule and field metadata, emitted with `--explain`.
12081
12979
  */
@@ -12170,10 +13068,10 @@ new_count: number
12170
13068
  export interface SecurityFinding {
12171
13069
  /**
12172
13070
  * Stable per-finding correlation id, identical across runs for the same
12173
- * rule + anchor path + line. An autonomous agent that triaged this
13071
+ * rule + anchor path + line + column. An autonomous agent that triaged this
12174
13072
  * candidate on a prior run uses it to correlate the candidate after a
12175
- * rebase. Equal to the SARIF `partialFingerprints` value for the same
12176
- * finding (one shared helper computes both).
13073
+ * rebase. Equal to the SARIF `partialFingerprints["fallowSecurity/v2"]`
13074
+ * value for the same finding (one shared helper computes both).
12177
13075
  */
12178
13076
  finding_id: string
12179
13077
  kind: SecurityFindingKind
@@ -12591,7 +13489,8 @@ defensive_boundary: SecurityDefensiveBoundary
12591
13489
  */
12592
13490
  export interface SecurityDefensiveBoundary {
12593
13491
  /**
12594
- * Known controls detected along this path.
13492
+ * Control patterns observed in files on this import trace. These are
13493
+ * verification hints, not proof of sink protection or value-level data flow.
12595
13494
  */
12596
13495
  controls: SecurityDefensiveControl[]
12597
13496
  /**
@@ -12601,7 +13500,9 @@ controls: SecurityDefensiveControl[]
12601
13500
  verification_prompt: string
12602
13501
  }
12603
13502
  /**
12604
- * Defensive control found on an attack-surface path.
13503
+ * Control pattern observed in a file on an attack-surface import trace.
13504
+ * Its presence does not prove that it executes before the sink or protects
13505
+ * the same input.
12605
13506
  */
12606
13507
  export interface SecurityDefensiveControl {
12607
13508
  kind: SecurityControlKind
@@ -12700,15 +13601,25 @@ version: ToolVersion
12700
13601
  elapsed_ms: ElapsedMs
12701
13602
  config: SecurityOutputConfig
12702
13603
  /**
12703
- * Every gate this run ARMED, keyed by name, absent when it armed none.
12704
- * Each entry is the same rule that decides the exit code, so a CI
12705
- * integration reads the verdict instead of guessing from a process status
12706
- * it usually cannot see. A gate fails the build when `status` is `fail`
12707
- * AND `enforced` is true. Armed, not evaluated: fallow's default severity
12708
- * rules fail a run with no flag at all, so an absent object means "no gate
12709
- * was asked for", never "nothing failed". See [`crate::GateOutcomes`].
13604
+ * The verdict of every gate this run evaluated, keyed by name. The CLI
13605
+ * always emits it, with the command's default exit rule in it also when
13606
+ * no flag armed a gate, so a CI integration reads the verdict instead of
13607
+ * guessing from a process status it usually cannot see. A gate fails the
13608
+ * build when `status` is `fail` AND `enforced` is true. The typed
13609
+ * programmatic API runs no CLI gate and leaves it absent. See
13610
+ * [`crate::GateOutcomes`].
12710
13611
  */
12711
13612
  gate_outcomes?: (GateOutcomes | null)
13613
+ /**
13614
+ * Every narrowing or shaping request this run RECEIVED, keyed by name,
13615
+ * absent when it was asked for nothing. An entry whose `status` is not
13616
+ * `applied` means the run could not do what it was asked and reported
13617
+ * something WIDER instead, so what follows is a valid report of a scope
13618
+ * nobody requested. Honoured requests are published too, with
13619
+ * `status: "applied"`, so an absent object means "nothing was asked for",
13620
+ * never "nothing failed". See [`crate::RequestOutcomes`].
13621
+ */
13622
+ request_outcomes?: (RequestOutcomes | null)
12712
13623
  /**
12713
13624
  * Security-specific rule and field metadata, emitted with `--explain`.
12714
13625
  */
@@ -12993,15 +13904,29 @@ schema_version: CombinedSchemaVersion
12993
13904
  version: ToolVersion
12994
13905
  elapsed_ms: ElapsedMs
12995
13906
  /**
12996
- * Every gate this run ARMED, keyed by name, absent when it armed none.
12997
- * Each entry is the same rule that decides the exit code, so a CI
12998
- * integration reads the verdict instead of guessing from a process status
12999
- * it usually cannot see. A gate fails the build when `status` is `fail`
13000
- * AND `enforced` is true. Armed, not evaluated: fallow's default severity
13001
- * rules fail a run with no flag at all, so an absent object means "no gate
13002
- * was asked for", never "nothing failed". See [`crate::GateOutcomes`].
13907
+ * The verdict of every gate this run evaluated, keyed by name. The CLI
13908
+ * always emits it, with the default exit rule of each section that ran
13909
+ * (`error-severity-findings`, `health-findings`). The machine formats of
13910
+ * the combined run exit 0 for findings, so most entries have `enforced:
13911
+ * false`. For the default exit rules (`error-severity-findings`,
13912
+ * `health-findings`), `status` gives the verdict of the human run. An
13913
+ * advisory entry can report `fail` without a failure of the human run: an
13914
+ * example is a `stale-baseline` entry that `--fail-on-stale-baseline` did
13915
+ * not arm. A gate fails the build when `status` is `fail` AND `enforced`
13916
+ * is true. The typed
13917
+ * programmatic API leaves it absent. See [`crate::GateOutcomes`].
13003
13918
  */
13004
13919
  gate_outcomes?: (GateOutcomes | null)
13920
+ /**
13921
+ * Every narrowing or shaping request this run RECEIVED, keyed by name,
13922
+ * absent when it was asked for nothing. An entry whose `status` is not
13923
+ * `applied` means the run could not do what it was asked and reported
13924
+ * something WIDER instead, so what follows is a valid report of a scope
13925
+ * nobody requested. Honoured requests are published too, with
13926
+ * `status: "applied"`, so an absent object means "nothing was asked for",
13927
+ * never "nothing failed". See [`crate::RequestOutcomes`].
13928
+ */
13929
+ request_outcomes?: (RequestOutcomes | null)
13005
13930
  /**
13006
13931
  * Per-section `_meta` blocks, when `--explain` was passed.
13007
13932
  */
@@ -13013,7 +13938,7 @@ check?: (CheckOutput | null)
13013
13938
  /**
13014
13939
  * Duplication section of the combined run.
13015
13940
  */
13016
- dupes?: (DupesReportPayload | null)
13941
+ dupes?: (CombinedDupesSection | null)
13017
13942
  /**
13018
13943
  * Health section of the combined run.
13019
13944
  */
@@ -13054,6 +13979,41 @@ health?: (Meta | null)
13054
13979
  */
13055
13980
  telemetry?: (TelemetryMeta | null)
13056
13981
  }
13982
+ /**
13983
+ * Wire shape of the `dupes` section inside the bare combined envelope.
13984
+ *
13985
+ * The section is the standalone payload plus the view of the loaded
13986
+ * duplication baseline. The standalone `dupes` envelope carries the same
13987
+ * `baseline_staleness` key at its root.
13988
+ */
13989
+ export interface CombinedDupesSection {
13990
+ /**
13991
+ * All detected clone groups, each wrapped with typed actions.
13992
+ */
13993
+ clone_groups: CloneGroupFinding[]
13994
+ /**
13995
+ * Clone families, each wrapped with typed actions. Inner `groups`
13996
+ * inside each `CloneFamilyFinding` are themselves wrapped as
13997
+ * `CloneGroupFinding` entries carrying their own `actions[]` (and
13998
+ * optional audit-mode `introduced` flag), so JSON-Schema strict
13999
+ * consumers and TS consumers reading `clone_families[].groups[]` see
14000
+ * the same shape as the top-level `clone_groups[]` array (preserves
14001
+ * the issue #393 regression contract).
14002
+ */
14003
+ clone_families: CloneFamilyFinding[]
14004
+ /**
14005
+ * Mirrored directory pairs.
14006
+ */
14007
+ mirrored_directories?: MirroredDirectory[]
14008
+ stats: DuplicationStats
14009
+ /**
14010
+ * This run's view of the loaded duplication baseline, present only when
14011
+ * `--dupes-baseline` loaded one. Read `change_scoped` before dividing
14012
+ * `matched_entries` by `baseline_entries`: a narrowed run can report
14013
+ * `matched_entries: 0` on a healthy baseline.
14014
+ */
14015
+ baseline_staleness?: (BaselineStaleness | null)
14016
+ }
13057
14017
  /**
13058
14018
  * Envelope emitted by `fallow flags --format json`.
13059
14019
  */
@@ -13061,6 +14021,22 @@ export interface FeatureFlagsOutput {
13061
14021
  schema_version: FeatureFlagsSchemaVersion
13062
14022
  version: ToolVersion
13063
14023
  elapsed_ms: ElapsedMs
14024
+ /**
14025
+ * What the run was asked to narrow and whether it did. See
14026
+ * [`crate::RequestOutcomes`] for the full contract.
14027
+ *
14028
+ * `fallow flags` accepts `--changed-since`, and an unresolvable ref widens
14029
+ * the scan to the whole project rather than failing the run. Until this
14030
+ * member existed the only account of that was a stderr line, which `--quiet`
14031
+ * removes, so a flag inventory read as scoped to the change could silently
14032
+ * be the whole project's (issue #2734).
14033
+ *
14034
+ * The command applies no diff filter, so the object carries the
14035
+ * `changed-since` entry only. Omitted when the run was asked for nothing,
14036
+ * which keeps a scan that passed no narrowing flag byte-identical and moves
14037
+ * no `schema_version`.
14038
+ */
14039
+ request_outcomes?: (RequestOutcomes | null)
13064
14040
  /**
13065
14041
  * Detected feature-flag findings.
13066
14042
  */
@@ -13283,6 +14259,11 @@ deltas: ReviewDeltas
13283
14259
  */
13284
14260
  weakening: WeakeningSignal[]
13285
14261
  routing: RoutingFacts
14262
+ /**
14263
+ * Owner-group reach from the CODEOWNERS file. Absent when no CODEOWNERS
14264
+ * file is found or the file cannot be read.
14265
+ */
14266
+ ownership?: (OwnershipFacts | null)
13286
14267
  /**
13287
14268
  * Dead-code findings scoped to the audit changeset.
13288
14269
  */
@@ -13762,6 +14743,96 @@ expert: string[]
13762
14743
  */
13763
14744
  bus_factor_one?: boolean
13764
14745
  }
14746
+ /**
14747
+ * How far a changeset reaches across CODEOWNERS owner groups.
14748
+ *
14749
+ * Computed from the CODEOWNERS file alone: no git history is read, so the
14750
+ * section is present whenever a CODEOWNERS file is found, also when the churn
14751
+ * walk behind `routing` finds nothing. Each file maps to its primary owner
14752
+ * (the first owner of the last matching rule). A file that no rule matches,
14753
+ * or that a GitLab negation rule matches, belongs to the `(unowned)` group.
14754
+ * The owner strings use the same vocabulary as `routing.units[].expert`.
14755
+ *
14756
+ * Absent from the brief when no CODEOWNERS file is found, or when the file
14757
+ * cannot be read or does not parse. A configured `codeowners` path that
14758
+ * fails also prints a warning on stderr.
14759
+ *
14760
+ * `groups[].direct_count` counts all changed files, source or not, so the
14761
+ * sum over all groups is the number of changed files, not the size of
14762
+ * `impact_closure.in_diff`. Slice owners count only the files of the
14763
+ * partition units, which are source files.
14764
+ */
14765
+ export interface OwnershipFacts {
14766
+ /**
14767
+ * Distinct owner groups across the changed files and the impact closure.
14768
+ * The `(unowned)` group counts as one group. Exact, never capped.
14769
+ */
14770
+ group_count: number
14771
+ /**
14772
+ * Owner groups that own no changed file and appear only through the
14773
+ * impact closure. Exact, never capped.
14774
+ */
14775
+ transitive_only_count: number
14776
+ /**
14777
+ * Changed files that belong to the `(unowned)` group.
14778
+ */
14779
+ unowned_direct_count: number
14780
+ /**
14781
+ * The owner groups, sorted by `direct_count` descending, then
14782
+ * `affected_count` descending, then `owner`. At most [`OWNER_GROUP_CAP`]
14783
+ * entries. The counts in each entry are exact.
14784
+ */
14785
+ groups: OwnerGroupFact[]
14786
+ /**
14787
+ * How many owner groups did not fit within [`OWNER_GROUP_CAP`] and are
14788
+ * absent from `groups`. Zero when nothing was omitted.
14789
+ */
14790
+ groups_omitted: number
14791
+ /**
14792
+ * The owner set of each independent slice, aligned by index with
14793
+ * `partition.independent_slices`. Present only when that list is present
14794
+ * (two or more slices). A fact for the reviewer, never a demand to split.
14795
+ */
14796
+ slices?: OwnershipSliceFact[]
14797
+ }
14798
+ /**
14799
+ * One owner group and how many files of the changeset it owns.
14800
+ */
14801
+ export interface OwnerGroupFact {
14802
+ /**
14803
+ * The CODEOWNERS owner (`@user`, `@org/team`, or an email), or
14804
+ * `(unowned)`.
14805
+ */
14806
+ owner: string
14807
+ /**
14808
+ * Changed files this group owns.
14809
+ */
14810
+ direct_count: number
14811
+ /**
14812
+ * Files of the impact closure (affected, not in the diff) this group owns.
14813
+ */
14814
+ affected_count: number
14815
+ }
14816
+ /**
14817
+ * The owners of one independent slice of the partition.
14818
+ */
14819
+ export interface OwnershipSliceFact {
14820
+ /**
14821
+ * The module directories of the slice, as in
14822
+ * `partition.independent_slices`.
14823
+ */
14824
+ module_dirs: string[]
14825
+ /**
14826
+ * The distinct owners of the changed files in the slice, sorted. The
14827
+ * `(unowned)` group is a distinct owner. Never empty.
14828
+ */
14829
+ owners: string[]
14830
+ /**
14831
+ * True when the slice has exactly one owner, so one owner group can
14832
+ * review it on its own.
14833
+ */
14834
+ separable: boolean
14835
+ }
13765
14836
  /**
13766
14837
  * The brief's branching section.
13767
14838
  */
@@ -14141,6 +15212,12 @@ deltas: ReviewDeltas
14141
15212
  */
14142
15213
  weakening: WeakeningSignal[]
14143
15214
  routing: RoutingFacts
15215
+ /**
15216
+ * How far the change reaches across CODEOWNERS owner groups, computed
15217
+ * from the CODEOWNERS file alone. Absent when no CODEOWNERS file is
15218
+ * found or the file cannot be read.
15219
+ */
15220
+ ownership?: (OwnershipFacts | null)
14144
15221
  decisions: DecisionSurface
14145
15222
  /**
14146
15223
  * Branching conservation across the changeset: total branching against
@@ -14397,6 +15474,22 @@ invalid_value?: (string | null)
14397
15474
  */
14398
15475
  export interface SuppressionInventoryOutput {
14399
15476
  schema_version: SuppressionInventorySchemaVersion
15477
+ /**
15478
+ * What the run was asked to narrow and whether it did. See
15479
+ * [`crate::RequestOutcomes`] for the full contract.
15480
+ *
15481
+ * `fallow suppressions` accepts `--changed-since`, and an unresolvable ref
15482
+ * widens the inventory to the whole project rather than failing the run.
15483
+ * Until this member existed the only account of that was a stderr line,
15484
+ * which `--quiet` removes, so an inventory read as scoped to the change
15485
+ * could silently be the whole project's (issue #2734).
15486
+ *
15487
+ * The command applies no diff filter, so the object carries the
15488
+ * `changed-since` entry only. Omitted when the run was asked for nothing,
15489
+ * which keeps an inventory that passed no narrowing flag byte-identical and
15490
+ * leaves `schema_version` at `1`.
15491
+ */
15492
+ request_outcomes?: (RequestOutcomes | null)
14400
15493
  summary: SuppressionInventorySummary
14401
15494
  /**
14402
15495
  * Per-file suppression listings, sorted by path then line.
@@ -15372,6 +16465,16 @@ export type BoundaryViolation = BoundaryViolationFinding;
15372
16465
  */
15373
16466
  export type CircularDependency = CircularDependencyFinding;
15374
16467
 
16468
+ /**
16469
+ * Backwards-compat alias for the pre-#384 bare `DeprecatedExportInUse` name.
16470
+ * The wire shape is byte-identical: `DeprecatedExportInUseFinding` flattens the bare
16471
+ * finding's fields via `#[serde(flatten)]` and adds `actions[]` plus
16472
+ * the optional audit-mode `introduced` flag. Consumers that imported
16473
+ * `DeprecatedExportInUse` from `fallow/types` pre-migration continue to work via
16474
+ * this alias; new code should prefer `DeprecatedExportInUseFinding`.
16475
+ */
16476
+ export type DeprecatedExportInUse = DeprecatedExportInUseFinding;
16477
+
15375
16478
  /**
15376
16479
  * Backwards-compat alias for the pre-#384 bare `DevDependencyInProduction` name.
15377
16480
  * The wire shape is byte-identical: `DevDependencyInProductionFinding` flattens the bare