fallow 3.28.0 → 3.30.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
  *
@@ -618,13 +643,15 @@ kind: "file-scores-unavailable"
618
643
  } | {
619
644
  /**
620
645
  * Which input stopped it, as a kebab-case token: `not-a-repository`,
621
- * `invalid-since` or `churn-file-unreadable`. The set is open.
646
+ * `no-commits`, `invalid-since` or `churn-file-unreadable`. The set is
647
+ * open.
622
648
  *
623
649
  * The cause decides the remedy, which is why it is on the wire: a run
624
650
  * outside a repository is fixed by running fallow inside one, a
625
- * malformed `--since` by respelling the flag, and a churn file that
626
- * changed under the run by rerunning it. A consumer reading only the
627
- * kind would offer the first remedy for all three.
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.
628
655
  */
629
656
  cause: string
630
657
  kind: "hotspots-skipped"
@@ -664,13 +691,16 @@ kind: "trend-snapshot-unreadable"
664
691
  plugin: string
665
692
  /**
666
693
  * The config key that was present and not fully readable (`exposes`,
667
- * `remotes`). The set is open.
694
+ * `remotes`), or the Module Federation runtime function whose
695
+ * argument was not readable (`registerRemotes`, `loadRemote`, `init`,
696
+ * `createInstance`). The set is open.
668
697
  */
669
698
  key: string
670
699
  /**
671
700
  * Why it could not be read, as a kebab-case token:
672
- * `not-object-literal`, `array-form`, `spread` or
673
- * `unreadable-entries`. The set is open.
701
+ * `not-object-literal`, `array-form`, `spread`,
702
+ * `unreadable-entries`, `unrecognized-call`,
703
+ * `import-target-unreadable` or `dynamic-argument`. The set is open.
674
704
  *
675
705
  * The reason decides the remedy, which is why it is on the wire: a
676
706
  * value that is not an object literal is fixed by writing one, while
@@ -686,7 +716,8 @@ kind: "plugin-config-unreadable"
686
716
  plugin: string
687
717
  /**
688
718
  * The config key whose effect is not modeled (`components`,
689
- * `imports`). The set is open.
719
+ * `imports`), or the virtual module a file reads (`#components`,
720
+ * `#imports`). The set is open.
690
721
  */
691
722
  key: string
692
723
  /**
@@ -700,6 +731,15 @@ reason: string
700
731
  kind: "plugin-effect-not-modeled"
701
732
  } | {
702
733
  kind: "coverage-auto-detected"
734
+ } | {
735
+ kind: "flag-age-shallow-clone"
736
+ } | {
737
+ /**
738
+ * Why no history is available, as a kebab-case token:
739
+ * `not-a-repository` or `no-commits`. The set is open.
740
+ */
741
+ cause: string
742
+ kind: "flag-age-unavailable"
703
743
  })
704
744
  /**
705
745
  * Discriminant for [`CloneGroupAction::kind`]. Mirrors the action types
@@ -771,6 +811,10 @@ export type HealthFindingActionType = ("refactor-function" | "add-tests" | "incr
771
811
  * Coverage model used for CRAP score computation.
772
812
  */
773
813
  export type CoverageModel = ("static_binary" | "static_estimated" | "istanbul")
814
+ /**
815
+ * Input format of the measured coverage behind `CoverageModel::Istanbul`.
816
+ */
817
+ export type CoverageInputFormat = ("istanbul" | "v8")
774
818
  /**
775
819
  * Whether CRAP findings in the report used one coverage-source kind or a mix.
776
820
  */
@@ -870,6 +914,11 @@ export type RuntimeCoverageVerdict = ("safe_to_delete" | "review_required" | "co
870
914
  * Confidence level for a runtime coverage finding.
871
915
  */
872
916
  export type RuntimeCoverageConfidence = ("very_high" | "high" | "medium" | "low" | "none" | "unknown")
917
+ /**
918
+ * The per-call cost that `optimization_target.cost_score` multiplies with
919
+ * `invocations`.
920
+ */
921
+ export type RuntimeCoverageCostBasis = ("inner_iterations" | "cognitive")
873
922
  /**
874
923
  * Blast-radius risk band. The current thresholds are high at >=20 static
875
924
  * callers or >=1,000,000 traffic-weighted caller reach; medium at >=5 callers
@@ -1222,7 +1271,7 @@ export type SecurityUrlShape = ("fixed-origin-dynamic-path" | "dynamic-origin")
1222
1271
  */
1223
1272
  export type SecurityRuntimeState = ("runtime-hot" | "runtime-cold" | "never-executed" | "low-traffic" | "coverage-unavailable" | "runtime-unknown")
1224
1273
  /**
1225
- * Defensive control family detected on a source to sink path.
1274
+ * Family of a control pattern observed in a file on an import trace.
1226
1275
  */
1227
1276
  export type SecurityControlKind = ("sanitization" | "validation" | "authentication" | "authorization")
1228
1277
  /**
@@ -1266,11 +1315,35 @@ export type FeatureFlagConfidence = ("high" | "medium" | "low")
1266
1315
  * Feature flag action discriminants.
1267
1316
  */
1268
1317
  export type FeatureFlagActionType = ("investigate-flag" | "suppress-line")
1318
+ /**
1319
+ * How the report measures the age of a flag.
1320
+ */
1321
+ export type FlagAgeMode = ("blame" | "pickaxe" | "off")
1322
+ /**
1323
+ * How a retirement row's flag was detected.
1324
+ */
1325
+ export type RetirementFlagKind = ("environment_variable" | "sdk_call" | "config_object" | "constant" | "vendor_export")
1326
+ /**
1327
+ * What a site does with the flag.
1328
+ */
1329
+ export type FlagSiteRole = ("read" | "definition")
1330
+ /**
1331
+ * Why a flag is a retirement candidate.
1332
+ */
1333
+ export type RetirementReason = ("single-read-site" | "test-only" | "literal-constant" | "identical-branches" | "empty-branch" | "guards-dead-code" | "defined-never-read" | "fully-rolled-out" | "archived-in-vendor" | "missing-in-vendor" | "vendor-only")
1334
+ /**
1335
+ * Action discriminants for a retirement row.
1336
+ */
1337
+ export type RetirementActionType = "review-retirement"
1338
+ /**
1339
+ * State of a flag in a `--flag-state` vendor export.
1340
+ */
1341
+ export type VendorFlagState = ("on" | "off" | "rolled_out" | "archived" | "experiment")
1269
1342
  /**
1270
1343
  * Independently-versioned wire-version newtype for the brief envelope.
1271
1344
  * Serializes as the integer `REVIEW_BRIEF_SCHEMA_VERSION`.
1272
1345
  */
1273
- export type ReviewBriefSchemaVersion = 10
1346
+ export type ReviewBriefSchemaVersion = 11
1274
1347
  /**
1275
1348
  * The exactly-three shippable decision categories (the SOLID-3). No cut category
1276
1349
  * (abstraction / deletion / convention / irreversibility) is representable: this
@@ -1487,13 +1560,13 @@ base_snapshot_skipped?: (boolean | null)
1487
1560
  summary: AuditSummary
1488
1561
  attribution: AuditAttribution
1489
1562
  /**
1490
- * Every gate this run ARMED, keyed by name, absent when it armed none.
1491
- * Each entry is the same rule that decides the exit code, so a CI
1492
- * integration reads the verdict instead of guessing from a process status
1493
- * it usually cannot see. A gate fails the build when `status` is `fail`
1494
- * AND `enforced` is true. Armed, not evaluated: fallow's default severity
1495
- * rules fail a run with no flag at all, so an absent object means "no gate
1496
- * was asked for", never "nothing failed". See [`crate::GateOutcomes`].
1563
+ * The verdict of every gate this run evaluated, keyed by name. The CLI
1564
+ * always emits it, with the command's default exit rule in it also when
1565
+ * no flag armed a gate, so a CI integration reads the verdict instead of
1566
+ * guessing from a process status it usually cannot see. A gate fails the
1567
+ * build when `status` is `fail` AND `enforced` is true. The typed
1568
+ * programmatic API runs no CLI gate and leaves it absent. See
1569
+ * [`crate::GateOutcomes`].
1497
1570
  */
1498
1571
  gate_outcomes?: (GateOutcomes | null)
1499
1572
  /**
@@ -1579,24 +1652,25 @@ styling_inherited: number
1579
1652
  duplication_demoted: number
1580
1653
  }
1581
1654
  /**
1582
- * Every gate a run ARMED, keyed by name.
1655
+ * The verdict of every gate a run evaluated, keyed by name.
1583
1656
  *
1584
- * Armed, not evaluated: a gate is armed by a flag or by config, never merely
1585
- * because the rule behind it exists. Fallow's default severity rules fail a
1586
- * run with no flag at all, so a `dead-code` run can exit 1 carrying no object
1587
- * whatsoever. Read an absent object as "no gate was asked for", never as
1588
- * "nothing failed".
1657
+ * A gate is armed by a flag or by config. The default exit rule of a command
1658
+ * is always in the object, also when no flag armed a gate:
1659
+ * `error-severity-findings` on `dead-code`, `check` and the combined run
1660
+ * (with `health-findings` when the combined run analyzed health),
1661
+ * `health-findings` on `health`, `security-advisory` on `security` and
1662
+ * `audit-verdict` on `audit`. A reader of the JSON sees a failing run without
1663
+ * the exit code. `dupes` has no default exit rule, so a `dupes` run that armed
1664
+ * no gate carries no object and always exits 0.
1589
1665
  *
1590
- * Absent from an envelope whenever it is empty, so a run that armed no gate is
1591
- * byte-identical to one produced before this object existed. An empty object
1592
- * is never emitted: it would assert that gates were armed and none tripped,
1593
- * which is a different and false claim.
1666
+ * An empty object is never emitted. The typed programmatic API runs no CLI
1667
+ * gate and leaves the object absent.
1594
1668
  *
1595
1669
  * The names this build can emit are `error-severity-findings`, `regression`,
1596
1670
  * `stale-baseline`, `duplication-threshold`, `health-min-score`,
1597
1671
  * `health-min-severity`, `health-findings`, `health-coverage-gaps`,
1598
- * `health-runtime-coverage`, `security`, `security-advisory`, `audit-verdict`
1599
- * and `type-aware-require`. The set is OPEN: a name a consumer does not
1672
+ * `health-runtime-coverage`, `security`, `security-advisory`, `audit-verdict`,
1673
+ * `type-aware-require` and `parse-error`. The set is OPEN: a name a consumer does not
1600
1674
  * recognise means "some gate", not an error.
1601
1675
  */
1602
1676
  export interface GateOutcomes {
@@ -1623,15 +1697,17 @@ export interface GateOutcome {
1623
1697
  status: GateStatus
1624
1698
  /**
1625
1699
  * True when a `fail` from this gate makes the run exit non-zero. False
1626
- * when the verdict is published for information only, because the gate was
1627
- * never armed or because the run was told never to fail.
1700
+ * when the verdict is published for information only: the gate was never
1701
+ * armed, the run was told never to fail, or the combined machine formats
1702
+ * exit 0 for the gate.
1628
1703
  */
1629
1704
  enforced: boolean
1630
1705
  /**
1631
1706
  * The measured value the gate compared, when there is one: the duplication
1632
- * percentage, the health score, or the number of findings at or above the
1633
- * severity floor. Whole numbers are carried as JSON numbers, so a count of
1634
- * three reads as `3.0`. Absent for gates that compare no number.
1707
+ * percentage, the health score, the number of findings at or above the
1708
+ * severity floor, or the number of files in `files`. Whole numbers are
1709
+ * carried as JSON numbers, so a count of three reads as `3.0`. Absent for
1710
+ * gates that compare no number.
1635
1711
  */
1636
1712
  observed?: (number | null)
1637
1713
  /**
@@ -1649,6 +1725,34 @@ threshold?: (number | null)
1649
1725
  * object. Absent for gates whose numbers speak for themselves.
1650
1726
  */
1651
1727
  threshold_label?: (string | null)
1728
+ /**
1729
+ * The files the gate judged, for a gate that judges files rather than a
1730
+ * number. Only `parse-error` sets it: one item per file that did not
1731
+ * parse cleanly, sorted by path. Absent when the list is empty.
1732
+ */
1733
+ files?: GateFile[]
1734
+ }
1735
+ /**
1736
+ * One file a file-judging gate names, with the reason the gate counted it.
1737
+ *
1738
+ * Today only `parse-error` emits it. The item carries the same facts as the
1739
+ * `source-parse-degraded` entry in `workspace_diagnostics[]` for that file,
1740
+ * so a consumer can act on the gate without a join.
1741
+ */
1742
+ export interface GateFile {
1743
+ /**
1744
+ * The file path, relative to the project root, with `/` separators.
1745
+ */
1746
+ path: string
1747
+ /**
1748
+ * The number of parser errors for the file.
1749
+ */
1750
+ error_count: number
1751
+ /**
1752
+ * True when the parser stopped in the file instead of recovering, so the
1753
+ * analysis saw only the part before the error.
1754
+ */
1755
+ panicked: boolean
1652
1756
  }
1653
1757
  /**
1654
1758
  * Metric and rule definitions emitted under `_meta` when `--explain` is
@@ -2614,6 +2718,12 @@ unused_types: UnusedTypeFinding[]
2614
2718
  * typed `actions` array natively.
2615
2719
  */
2616
2720
  private_type_leaks: PrivateTypeLeakFinding[]
2721
+ /**
2722
+ * Exports marked `@deprecated` that still have at least one consumer in
2723
+ * a reachable file. Wrapped in [`DeprecatedExportInUseFinding`]. Opt-in: the
2724
+ * `deprecated-exports-in-use` rule defaults to `off`.
2725
+ */
2726
+ deprecated_exports_in_use?: DeprecatedExportInUseFinding[]
2617
2727
  /**
2618
2728
  * Dependencies listed in package.json but never imported. Wrapped in
2619
2729
  * [`UnusedDependencyFinding`] so each entry carries a typed `actions`
@@ -2941,13 +3051,13 @@ baseline_staleness?: (BaselineStaleness | null)
2941
3051
  */
2942
3052
  regression?: (RegressionResult | null)
2943
3053
  /**
2944
- * Every gate this run ARMED, keyed by name, absent when it armed none.
2945
- * Each entry is the same rule that decides the exit code, so a CI
2946
- * integration reads the verdict instead of guessing from a process status
2947
- * it usually cannot see. A gate fails the build when `status` is `fail`
2948
- * AND `enforced` is true. Armed, not evaluated: fallow's default severity
2949
- * rules fail a run with no flag at all, so an absent object means "no gate
2950
- * was asked for", never "nothing failed". See [`crate::GateOutcomes`].
3054
+ * The verdict of every gate this run evaluated, keyed by name. The CLI
3055
+ * always emits it, with the command's default exit rule in it also when
3056
+ * no flag armed a gate, so a CI integration reads the verdict instead of
3057
+ * guessing from a process status it usually cannot see. A gate fails the
3058
+ * build when `status` is `fail` AND `enforced` is true. The typed
3059
+ * programmatic API runs no CLI gate and leaves it absent. See
3060
+ * [`crate::GateOutcomes`].
2951
3061
  */
2952
3062
  gate_outcomes?: (GateOutcomes | null)
2953
3063
  /**
@@ -3066,6 +3176,10 @@ unused_types: number
3066
3176
  * Public exports whose signature references same-file private types.
3067
3177
  */
3068
3178
  private_type_leaks: number
3179
+ /**
3180
+ * Exports marked `@deprecated` that are still referenced.
3181
+ */
3182
+ deprecated_exports_in_use: number
3069
3183
  /**
3070
3184
  * Combined count of unused entries across `dependencies`,
3071
3185
  * `devDependencies`, and `optionalDependencies`. The per-section
@@ -3247,6 +3361,13 @@ actions: IssueAction[]
3247
3361
  * the merge-base. `None` when serialized directly from Rust.
3248
3362
  */
3249
3363
  introduced?: (AuditIntroduced | null)
3364
+ /**
3365
+ * Gate severity of this finding after `rules` and `overrides[].rules`
3366
+ * resolve for its path. CI formats read it for the annotation, SARIF
3367
+ * and CodeClimate level. Absent in output from older versions. Not
3368
+ * part of the finding identity, baseline keys or fingerprints.
3369
+ */
3370
+ effective_severity?: (EffectiveSeverity | null)
3250
3371
  /**
3251
3372
  * Advisory caveats on the reachability verdict behind this finding.
3252
3373
  * Sorted, deduplicated, and omitted from the wire when empty, so a run
@@ -3450,6 +3571,17 @@ span_start: number
3450
3571
  * Whether this finding comes from a barrel/index re-export rather than the source definition.
3451
3572
  */
3452
3573
  is_re_export: boolean
3574
+ /**
3575
+ * Whether the export's leading JSDoc carries `@deprecated`. Absent from
3576
+ * the wire when false.
3577
+ */
3578
+ deprecated?: boolean
3579
+ /**
3580
+ * Plain-text message of the `@deprecated` tag, capped at
3581
+ * [`DEPRECATED_REASON_MAX_CHARS`] characters. Absent when the export is
3582
+ * not deprecated or the tag carries no text.
3583
+ */
3584
+ deprecated_reason?: (string | null)
3453
3585
  /**
3454
3586
  * Suggested next steps. Always emitted (possibly empty for
3455
3587
  * forward-compat).
@@ -3464,6 +3596,13 @@ semantic?: (SemanticCandidateDecision | null)
3464
3596
  * the merge-base.
3465
3597
  */
3466
3598
  introduced?: (AuditIntroduced | null)
3599
+ /**
3600
+ * Gate severity of this finding after `rules` and `overrides[].rules`
3601
+ * resolve for its path. CI formats read it for the annotation, SARIF
3602
+ * and CodeClimate level. Absent in output from older versions. Not
3603
+ * part of the finding identity, baseline keys or fingerprints.
3604
+ */
3605
+ effective_severity?: (EffectiveSeverity | null)
3467
3606
  /**
3468
3607
  * Advisory caveats on the reachability verdict behind this finding.
3469
3608
  * Sorted, deduplicated, and omitted from the wire when empty. Never gates
@@ -3507,6 +3646,17 @@ span_start: number
3507
3646
  * Whether this finding comes from a barrel/index re-export rather than the source definition.
3508
3647
  */
3509
3648
  is_re_export: boolean
3649
+ /**
3650
+ * Whether the export's leading JSDoc carries `@deprecated`. Absent from
3651
+ * the wire when false.
3652
+ */
3653
+ deprecated?: boolean
3654
+ /**
3655
+ * Plain-text message of the `@deprecated` tag, capped at
3656
+ * [`DEPRECATED_REASON_MAX_CHARS`] characters. Absent when the export is
3657
+ * not deprecated or the tag carries no text.
3658
+ */
3659
+ deprecated_reason?: (string | null)
3510
3660
  /**
3511
3661
  * Suggested next steps. Always emitted (possibly empty for
3512
3662
  * forward-compat).
@@ -3521,6 +3671,13 @@ semantic?: (SemanticCandidateDecision | null)
3521
3671
  * the merge-base.
3522
3672
  */
3523
3673
  introduced?: (AuditIntroduced | null)
3674
+ /**
3675
+ * Gate severity of this finding after `rules` and `overrides[].rules`
3676
+ * resolve for its path. CI formats read it for the annotation, SARIF
3677
+ * and CodeClimate level. Absent in output from older versions. Not
3678
+ * part of the finding identity, baseline keys or fingerprints.
3679
+ */
3680
+ effective_severity?: (EffectiveSeverity | null)
3524
3681
  /**
3525
3682
  * Advisory caveats on the reachability verdict behind this finding.
3526
3683
  * A type export rests on exactly the reachability test an
@@ -3575,6 +3732,103 @@ actions: IssueAction[]
3575
3732
  * the merge-base.
3576
3733
  */
3577
3734
  introduced?: (AuditIntroduced | null)
3735
+ /**
3736
+ * Gate severity of this finding after `rules` and `overrides[].rules`
3737
+ * resolve for its path. CI formats read it for the annotation, SARIF
3738
+ * and CodeClimate level. Absent in output from older versions. Not
3739
+ * part of the finding identity, baseline keys or fingerprints.
3740
+ */
3741
+ effective_severity?: (EffectiveSeverity | null)
3742
+ }
3743
+ /**
3744
+ * Wire-shape envelope for a [`DeprecatedExportInUse`] finding. Carries a
3745
+ * manual `migrate-deprecated-export` primary action plus a `suppress-line`
3746
+ * secondary. Never auto-fixable: fallow does not rewrite consumers.
3747
+ */
3748
+ export interface DeprecatedExportInUseFinding {
3749
+ /**
3750
+ * File that declares the deprecated export.
3751
+ */
3752
+ path: string
3753
+ /**
3754
+ * Name of the deprecated export.
3755
+ */
3756
+ export_name: string
3757
+ /**
3758
+ * Whether this is a type-only export.
3759
+ */
3760
+ is_type_only: boolean
3761
+ /**
3762
+ * 1-based line number of the export.
3763
+ */
3764
+ line: number
3765
+ /**
3766
+ * 0-based byte column offset of the export.
3767
+ */
3768
+ col: number
3769
+ /**
3770
+ * Byte offset of the export in the source file.
3771
+ */
3772
+ span_start: number
3773
+ /**
3774
+ * Plain-text message of the `@deprecated` tag, capped at
3775
+ * [`DEPRECATED_REASON_MAX_CHARS`] characters. Absent when the tag
3776
+ * carries no text.
3777
+ */
3778
+ deprecated_reason?: (string | null)
3779
+ /**
3780
+ * Exact number of distinct consumers: reference sites in reachable
3781
+ * files, one per path, line, column and kind. `consumers` holds the
3782
+ * first [`DEPRECATED_CONSUMER_SAMPLE_CAP`] of them, so the sample is
3783
+ * complete when this count is at most the cap.
3784
+ */
3785
+ consumer_count: number
3786
+ /**
3787
+ * Consumer sample sorted by path, line, column and kind, capped at
3788
+ * [`DEPRECATED_CONSUMER_SAMPLE_CAP`] entries.
3789
+ */
3790
+ consumers: DeprecatedExportConsumer[]
3791
+ /**
3792
+ * True when the export is part of the public API: it lives in an entry
3793
+ * point, or a re-export chain reaches an entry point. External consumers
3794
+ * are not visible, so the finding makes no removal claim.
3795
+ */
3796
+ public_api: boolean
3797
+ /**
3798
+ * Suggested next steps. Always emitted (possibly empty for
3799
+ * forward-compat).
3800
+ */
3801
+ actions: IssueAction[]
3802
+ /**
3803
+ * Set by the audit pass when this finding is introduced relative to
3804
+ * the merge-base.
3805
+ */
3806
+ introduced?: (AuditIntroduced | null)
3807
+ /**
3808
+ * Gate severity of this finding after `rules` and `overrides[].rules`
3809
+ * resolve for its path. CI formats read it for the annotation, SARIF
3810
+ * and CodeClimate level. Absent in output from older versions. Not
3811
+ * part of the finding identity, baseline keys or fingerprints.
3812
+ */
3813
+ effective_severity?: (EffectiveSeverity | null)
3814
+ }
3815
+ /**
3816
+ * One file location that references a deprecated export.
3817
+ */
3818
+ export interface DeprecatedExportConsumer {
3819
+ /**
3820
+ * File that references the deprecated export.
3821
+ */
3822
+ path: string
3823
+ /**
3824
+ * 1-based line number of the import or re-export statement.
3825
+ */
3826
+ line: number
3827
+ /**
3828
+ * 0-based byte column offset of the import or re-export statement.
3829
+ */
3830
+ col: number
3831
+ kind: DeprecatedConsumerKind
3578
3832
  }
3579
3833
  /**
3580
3834
  * Wire-shape envelope for an [`UnusedDependency`] finding consumed under
@@ -3612,6 +3866,13 @@ actions: IssueAction[]
3612
3866
  * the merge-base.
3613
3867
  */
3614
3868
  introduced?: (AuditIntroduced | null)
3869
+ /**
3870
+ * Gate severity of this finding after `rules` and `overrides[].rules`
3871
+ * resolve for its path. CI formats read it for the annotation, SARIF
3872
+ * and CodeClimate level. Absent in output from older versions. Not
3873
+ * part of the finding identity, baseline keys or fingerprints.
3874
+ */
3875
+ effective_severity?: (EffectiveSeverity | null)
3615
3876
  /**
3616
3877
  * Advisory caveats on the verdict behind this finding. A dependency is
3617
3878
  * reported unused when NO module in the project imports its specifier,
@@ -3658,6 +3919,13 @@ actions: IssueAction[]
3658
3919
  * the merge-base.
3659
3920
  */
3660
3921
  introduced?: (AuditIntroduced | null)
3922
+ /**
3923
+ * Gate severity of this finding after `rules` and `overrides[].rules`
3924
+ * resolve for its path. CI formats read it for the annotation, SARIF
3925
+ * and CodeClimate level. Absent in output from older versions. Not
3926
+ * part of the finding identity, baseline keys or fingerprints.
3927
+ */
3928
+ effective_severity?: (EffectiveSeverity | null)
3661
3929
  /**
3662
3930
  * Advisory caveats on the verdict behind this finding. A dependency is
3663
3931
  * reported unused when NO module in the project imports its specifier,
@@ -3704,6 +3972,13 @@ actions: IssueAction[]
3704
3972
  * the merge-base.
3705
3973
  */
3706
3974
  introduced?: (AuditIntroduced | null)
3975
+ /**
3976
+ * Gate severity of this finding after `rules` and `overrides[].rules`
3977
+ * resolve for its path. CI formats read it for the annotation, SARIF
3978
+ * and CodeClimate level. Absent in output from older versions. Not
3979
+ * part of the finding identity, baseline keys or fingerprints.
3980
+ */
3981
+ effective_severity?: (EffectiveSeverity | null)
3707
3982
  /**
3708
3983
  * Advisory caveats on the verdict behind this finding. A dependency is
3709
3984
  * reported unused when NO module in the project imports its specifier,
@@ -3750,6 +4025,13 @@ actions: IssueAction[]
3750
4025
  * the merge-base.
3751
4026
  */
3752
4027
  introduced?: (AuditIntroduced | null)
4028
+ /**
4029
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4030
+ * resolve for its path. CI formats read it for the annotation, SARIF
4031
+ * and CodeClimate level. Absent in output from older versions. Not
4032
+ * part of the finding identity, baseline keys or fingerprints.
4033
+ */
4034
+ effective_severity?: (EffectiveSeverity | null)
3753
4035
  /**
3754
4036
  * Advisory caveats on the verdict behind this finding. A member's usage
3755
4037
  * is collected by walking the member accesses of every module the run
@@ -3802,6 +4084,13 @@ semantic?: (SemanticCandidateDecision | null)
3802
4084
  * the merge-base.
3803
4085
  */
3804
4086
  introduced?: (AuditIntroduced | null)
4087
+ /**
4088
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4089
+ * resolve for its path. CI formats read it for the annotation, SARIF
4090
+ * and CodeClimate level. Absent in output from older versions. Not
4091
+ * part of the finding identity, baseline keys or fingerprints.
4092
+ */
4093
+ effective_severity?: (EffectiveSeverity | null)
3805
4094
  /**
3806
4095
  * Advisory caveats on the verdict behind this finding. A class member's
3807
4096
  * usage is collected by the same reachability-free member-access walk an
@@ -3855,6 +4144,13 @@ actions: IssueAction[]
3855
4144
  * the merge-base.
3856
4145
  */
3857
4146
  introduced?: (AuditIntroduced | null)
4147
+ /**
4148
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4149
+ * resolve for its path. CI formats read it for the annotation, SARIF
4150
+ * and CodeClimate level. Absent in output from older versions. Not
4151
+ * part of the finding identity, baseline keys or fingerprints.
4152
+ */
4153
+ effective_severity?: (EffectiveSeverity | null)
3858
4154
  /**
3859
4155
  * Advisory caveats on the verdict behind this finding. A store member's
3860
4156
  * usage is collected by the same reachability-free member-access walk a
@@ -3905,6 +4201,13 @@ actions: IssueAction[]
3905
4201
  * the merge-base.
3906
4202
  */
3907
4203
  introduced?: (AuditIntroduced | null)
4204
+ /**
4205
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4206
+ * resolve for its path. CI formats read it for the annotation, SARIF
4207
+ * and CodeClimate level. Absent in output from older versions. Not
4208
+ * part of the finding identity, baseline keys or fingerprints.
4209
+ */
4210
+ effective_severity?: (EffectiveSeverity | null)
3908
4211
  }
3909
4212
  /**
3910
4213
  * Wire-shape envelope for an [`UnlistedDependency`] finding. Carries an
@@ -3931,6 +4234,13 @@ actions: IssueAction[]
3931
4234
  * the merge-base.
3932
4235
  */
3933
4236
  introduced?: (AuditIntroduced | null)
4237
+ /**
4238
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4239
+ * resolve for its path. CI formats read it for the annotation, SARIF
4240
+ * and CodeClimate level. Absent in output from older versions. Not
4241
+ * part of the finding identity, baseline keys or fingerprints.
4242
+ */
4243
+ effective_severity?: (EffectiveSeverity | null)
3934
4244
  }
3935
4245
  /**
3936
4246
  * A location where an import occurs.
@@ -3981,6 +4291,13 @@ actions: IssueAction[]
3981
4291
  * the merge-base.
3982
4292
  */
3983
4293
  introduced?: (AuditIntroduced | null)
4294
+ /**
4295
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4296
+ * resolve for its path. CI formats read it for the annotation, SARIF
4297
+ * and CodeClimate level. Absent in output from older versions. Not
4298
+ * part of the finding identity, baseline keys or fingerprints.
4299
+ */
4300
+ effective_severity?: (EffectiveSeverity | null)
3984
4301
  }
3985
4302
  /**
3986
4303
  * A location where a duplicate export appears.
@@ -4027,6 +4344,13 @@ actions: IssueAction[]
4027
4344
  * the merge-base.
4028
4345
  */
4029
4346
  introduced?: (AuditIntroduced | null)
4347
+ /**
4348
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4349
+ * resolve for its path. CI formats read it for the annotation, SARIF
4350
+ * and CodeClimate level. Absent in output from older versions. Not
4351
+ * part of the finding identity, baseline keys or fingerprints.
4352
+ */
4353
+ effective_severity?: (EffectiveSeverity | null)
4030
4354
  }
4031
4355
  /**
4032
4356
  * Wire-shape envelope for a [`TestOnlyDependency`] finding. Carries a
@@ -4057,6 +4381,13 @@ actions: IssueAction[]
4057
4381
  * the merge-base.
4058
4382
  */
4059
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)
4060
4391
  }
4061
4392
  /**
4062
4393
  * Wire-shape envelope for a [`DevDependencyInProduction`] finding. Carries a
@@ -4088,6 +4419,13 @@ actions: IssueAction[]
4088
4419
  * the merge-base.
4089
4420
  */
4090
4421
  introduced?: (AuditIntroduced | null)
4422
+ /**
4423
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4424
+ * resolve for its path. CI formats read it for the annotation, SARIF
4425
+ * and CodeClimate level. Absent in output from older versions. Not
4426
+ * part of the finding identity, baseline keys or fingerprints.
4427
+ */
4428
+ effective_severity?: (EffectiveSeverity | null)
4091
4429
  }
4092
4430
  /**
4093
4431
  * Wire-shape envelope for a [`CircularDependency`] finding. Mirrors
@@ -4135,6 +4473,13 @@ actions: IssueAction[]
4135
4473
  * the merge-base.
4136
4474
  */
4137
4475
  introduced?: (AuditIntroduced | null)
4476
+ /**
4477
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4478
+ * resolve for its path. CI formats read it for the annotation, SARIF
4479
+ * and CodeClimate level. Absent in output from older versions. Not
4480
+ * part of the finding identity, baseline keys or fingerprints.
4481
+ */
4482
+ effective_severity?: (EffectiveSeverity | null)
4138
4483
  }
4139
4484
  /**
4140
4485
  * One import hop in a circular dependency: the file containing the import
@@ -4190,6 +4535,13 @@ actions: IssueAction[]
4190
4535
  * the merge-base.
4191
4536
  */
4192
4537
  introduced?: (AuditIntroduced | null)
4538
+ /**
4539
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4540
+ * resolve for its path. CI formats read it for the annotation, SARIF
4541
+ * and CodeClimate level. Absent in output from older versions. Not
4542
+ * part of the finding identity, baseline keys or fingerprints.
4543
+ */
4544
+ effective_severity?: (EffectiveSeverity | null)
4193
4545
  }
4194
4546
  /**
4195
4547
  * Wire-shape envelope for a [`BoundaryViolation`] finding. Mirrors
@@ -4236,6 +4588,13 @@ actions: IssueAction[]
4236
4588
  * the merge-base.
4237
4589
  */
4238
4590
  introduced?: (AuditIntroduced | null)
4591
+ /**
4592
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4593
+ * resolve for its path. CI formats read it for the annotation, SARIF
4594
+ * and CodeClimate level. Absent in output from older versions. Not
4595
+ * part of the finding identity, baseline keys or fingerprints.
4596
+ */
4597
+ effective_severity?: (EffectiveSeverity | null)
4239
4598
  }
4240
4599
  /**
4241
4600
  * Wire-shape envelope for a [`BoundaryCoverageViolation`] finding. Carries
@@ -4264,6 +4623,13 @@ actions: IssueAction[]
4264
4623
  * the merge-base.
4265
4624
  */
4266
4625
  introduced?: (AuditIntroduced | null)
4626
+ /**
4627
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4628
+ * resolve for its path. CI formats read it for the annotation, SARIF
4629
+ * and CodeClimate level. Absent in output from older versions. Not
4630
+ * part of the finding identity, baseline keys or fingerprints.
4631
+ */
4632
+ effective_severity?: (EffectiveSeverity | null)
4267
4633
  }
4268
4634
  /**
4269
4635
  * Wire-shape envelope for a [`BoundaryCallViolation`] finding. Carries
@@ -4305,6 +4671,13 @@ actions: IssueAction[]
4305
4671
  * the merge-base.
4306
4672
  */
4307
4673
  introduced?: (AuditIntroduced | null)
4674
+ /**
4675
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4676
+ * resolve for its path. CI formats read it for the annotation, SARIF
4677
+ * and CodeClimate level. Absent in output from older versions. Not
4678
+ * part of the finding identity, baseline keys or fingerprints.
4679
+ */
4680
+ effective_severity?: (EffectiveSeverity | null)
4308
4681
  }
4309
4682
  /**
4310
4683
  * Wire-shape envelope for a [`PolicyViolation`] finding. Carries actions for
@@ -4382,6 +4755,13 @@ missing_reason?: boolean
4382
4755
  * Suggested next steps. Always emitted.
4383
4756
  */
4384
4757
  actions: IssueAction[]
4758
+ /**
4759
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4760
+ * resolve for its path. CI formats read it for the annotation, SARIF
4761
+ * and CodeClimate level. Absent in output from older versions. Not
4762
+ * part of the finding identity, baseline keys or fingerprints.
4763
+ */
4764
+ effective_severity?: (EffectiveSeverity | null)
4385
4765
  }
4386
4766
  /**
4387
4767
  * Wire-shape envelope for an [`UnusedCatalogEntry`] finding. Per-instance
@@ -4422,6 +4802,13 @@ actions: IssueAction[]
4422
4802
  * the merge-base.
4423
4803
  */
4424
4804
  introduced?: (AuditIntroduced | null)
4805
+ /**
4806
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4807
+ * resolve for its path. CI formats read it for the annotation, SARIF
4808
+ * and CodeClimate level. Absent in output from older versions. Not
4809
+ * part of the finding identity, baseline keys or fingerprints.
4810
+ */
4811
+ effective_severity?: (EffectiveSeverity | null)
4425
4812
  }
4426
4813
  /**
4427
4814
  * Wire-shape envelope for an [`EmptyCatalogGroup`] finding. Carries a
@@ -4450,6 +4837,13 @@ actions: IssueAction[]
4450
4837
  * the merge-base.
4451
4838
  */
4452
4839
  introduced?: (AuditIntroduced | null)
4840
+ /**
4841
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4842
+ * resolve for its path. CI formats read it for the annotation, SARIF
4843
+ * and CodeClimate level. Absent in output from older versions. Not
4844
+ * part of the finding identity, baseline keys or fingerprints.
4845
+ */
4846
+ effective_severity?: (EffectiveSeverity | null)
4453
4847
  }
4454
4848
  /**
4455
4849
  * Wire-shape envelope for an [`UnresolvedCatalogReference`] finding. The
@@ -4500,6 +4894,13 @@ actions: IssueAction[]
4500
4894
  * the merge-base.
4501
4895
  */
4502
4896
  introduced?: (AuditIntroduced | null)
4897
+ /**
4898
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4899
+ * resolve for its path. CI formats read it for the annotation, SARIF
4900
+ * and CodeClimate level. Absent in output from older versions. Not
4901
+ * part of the finding identity, baseline keys or fingerprints.
4902
+ */
4903
+ effective_severity?: (EffectiveSeverity | null)
4503
4904
  }
4504
4905
  /**
4505
4906
  * Wire-shape envelope for an [`UnusedDependencyOverride`] finding. Carries
@@ -4562,6 +4963,13 @@ actions: IssueAction[]
4562
4963
  * the merge-base.
4563
4964
  */
4564
4965
  introduced?: (AuditIntroduced | null)
4966
+ /**
4967
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4968
+ * resolve for its path. CI formats read it for the annotation, SARIF
4969
+ * and CodeClimate level. Absent in output from older versions. Not
4970
+ * part of the finding identity, baseline keys or fingerprints.
4971
+ */
4972
+ effective_severity?: (EffectiveSeverity | null)
4565
4973
  }
4566
4974
  /**
4567
4975
  * Wire-shape envelope for a [`MisconfiguredDependencyOverride`] finding.
@@ -4611,6 +5019,13 @@ actions: IssueAction[]
4611
5019
  * the merge-base.
4612
5020
  */
4613
5021
  introduced?: (AuditIntroduced | null)
5022
+ /**
5023
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5024
+ * resolve for its path. CI formats read it for the annotation, SARIF
5025
+ * and CodeClimate level. Absent in output from older versions. Not
5026
+ * part of the finding identity, baseline keys or fingerprints.
5027
+ */
5028
+ effective_severity?: (EffectiveSeverity | null)
4614
5029
  }
4615
5030
  /**
4616
5031
  * Wire-shape envelope for an [`InvalidClientExport`] finding. There is no safe
@@ -4652,6 +5067,13 @@ actions: IssueAction[]
4652
5067
  * the merge-base.
4653
5068
  */
4654
5069
  introduced?: (AuditIntroduced | null)
5070
+ /**
5071
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5072
+ * resolve for its path. CI formats read it for the annotation, SARIF
5073
+ * and CodeClimate level. Absent in output from older versions. Not
5074
+ * part of the finding identity, baseline keys or fingerprints.
5075
+ */
5076
+ effective_severity?: (EffectiveSeverity | null)
4655
5077
  }
4656
5078
  /**
4657
5079
  * Wire-shape envelope for a [`MixedClientServerBarrel`] finding. There is no
@@ -4693,6 +5115,13 @@ actions: IssueAction[]
4693
5115
  * the merge-base.
4694
5116
  */
4695
5117
  introduced?: (AuditIntroduced | null)
5118
+ /**
5119
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5120
+ * resolve for its path. CI formats read it for the annotation, SARIF
5121
+ * and CodeClimate level. Absent in output from older versions. Not
5122
+ * part of the finding identity, baseline keys or fingerprints.
5123
+ */
5124
+ effective_severity?: (EffectiveSeverity | null)
4696
5125
  }
4697
5126
  /**
4698
5127
  * Wire-shape envelope for a [`MisplacedDirective`] finding. There is no safe
@@ -4729,6 +5158,13 @@ actions: IssueAction[]
4729
5158
  * the merge-base.
4730
5159
  */
4731
5160
  introduced?: (AuditIntroduced | null)
5161
+ /**
5162
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5163
+ * resolve for its path. CI formats read it for the annotation, SARIF
5164
+ * and CodeClimate level. Absent in output from older versions. Not
5165
+ * part of the finding identity, baseline keys or fingerprints.
5166
+ */
5167
+ effective_severity?: (EffectiveSeverity | null)
4732
5168
  }
4733
5169
  /**
4734
5170
  * Wire-shape envelope for an [`UnprovidedInject`] finding. There is no safe
@@ -4767,6 +5203,13 @@ actions: IssueAction[]
4767
5203
  * the merge-base.
4768
5204
  */
4769
5205
  introduced?: (AuditIntroduced | null)
5206
+ /**
5207
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5208
+ * resolve for its path. CI formats read it for the annotation, SARIF
5209
+ * and CodeClimate level. Absent in output from older versions. Not
5210
+ * part of the finding identity, baseline keys or fingerprints.
5211
+ */
5212
+ effective_severity?: (EffectiveSeverity | null)
4770
5213
  }
4771
5214
  /**
4772
5215
  * Wire-shape envelope for an [`UnrenderedComponent`] finding. There is no safe
@@ -4816,6 +5259,13 @@ actions: IssueAction[]
4816
5259
  * the merge-base.
4817
5260
  */
4818
5261
  introduced?: (AuditIntroduced | null)
5262
+ /**
5263
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5264
+ * resolve for its path. CI formats read it for the annotation, SARIF
5265
+ * and CodeClimate level. Absent in output from older versions. Not
5266
+ * part of the finding identity, baseline keys or fingerprints.
5267
+ */
5268
+ effective_severity?: (EffectiveSeverity | null)
4819
5269
  }
4820
5270
  /**
4821
5271
  * Wire-shape envelope for a [`RouteCollision`] finding. A route collision is a
@@ -4858,6 +5308,13 @@ actions: IssueAction[]
4858
5308
  * the merge-base.
4859
5309
  */
4860
5310
  introduced?: (AuditIntroduced | null)
5311
+ /**
5312
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5313
+ * resolve for its path. CI formats read it for the annotation, SARIF
5314
+ * and CodeClimate level. Absent in output from older versions. Not
5315
+ * part of the finding identity, baseline keys or fingerprints.
5316
+ */
5317
+ effective_severity?: (EffectiveSeverity | null)
4861
5318
  }
4862
5319
  /**
4863
5320
  * Wire-shape envelope for a [`DynamicSegmentNameConflict`] finding. The
@@ -4904,6 +5361,13 @@ actions: IssueAction[]
4904
5361
  * the merge-base.
4905
5362
  */
4906
5363
  introduced?: (AuditIntroduced | null)
5364
+ /**
5365
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5366
+ * resolve for its path. CI formats read it for the annotation, SARIF
5367
+ * and CodeClimate level. Absent in output from older versions. Not
5368
+ * part of the finding identity, baseline keys or fingerprints.
5369
+ */
5370
+ effective_severity?: (EffectiveSeverity | null)
4907
5371
  }
4908
5372
  /**
4909
5373
  * Wire-shape envelope for an [`UnusedComponentProp`] finding. There is no safe
@@ -4942,6 +5406,13 @@ actions: IssueAction[]
4942
5406
  * the merge-base.
4943
5407
  */
4944
5408
  introduced?: (AuditIntroduced | null)
5409
+ /**
5410
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5411
+ * resolve for its path. CI formats read it for the annotation, SARIF
5412
+ * and CodeClimate level. Absent in output from older versions. Not
5413
+ * part of the finding identity, baseline keys or fingerprints.
5414
+ */
5415
+ effective_severity?: (EffectiveSeverity | null)
4945
5416
  }
4946
5417
  /**
4947
5418
  * Wire-shape envelope for an [`UnusedComponentEmit`] finding. There is no safe
@@ -4980,6 +5451,13 @@ actions: IssueAction[]
4980
5451
  * the merge-base.
4981
5452
  */
4982
5453
  introduced?: (AuditIntroduced | null)
5454
+ /**
5455
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5456
+ * resolve for its path. CI formats read it for the annotation, SARIF
5457
+ * and CodeClimate level. Absent in output from older versions. Not
5458
+ * part of the finding identity, baseline keys or fingerprints.
5459
+ */
5460
+ effective_severity?: (EffectiveSeverity | null)
4983
5461
  }
4984
5462
  /**
4985
5463
  * Wire-shape envelope for an [`UnusedComponentInput`] finding. There is no safe
@@ -5018,6 +5496,13 @@ actions: IssueAction[]
5018
5496
  * the merge-base.
5019
5497
  */
5020
5498
  introduced?: (AuditIntroduced | null)
5499
+ /**
5500
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5501
+ * resolve for its path. CI formats read it for the annotation, SARIF
5502
+ * and CodeClimate level. Absent in output from older versions. Not
5503
+ * part of the finding identity, baseline keys or fingerprints.
5504
+ */
5505
+ effective_severity?: (EffectiveSeverity | null)
5021
5506
  }
5022
5507
  /**
5023
5508
  * Wire-shape envelope for an [`UnusedComponentOutput`] finding. There is no safe
@@ -5056,6 +5541,13 @@ actions: IssueAction[]
5056
5541
  * the merge-base.
5057
5542
  */
5058
5543
  introduced?: (AuditIntroduced | null)
5544
+ /**
5545
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5546
+ * resolve for its path. CI formats read it for the annotation, SARIF
5547
+ * and CodeClimate level. Absent in output from older versions. Not
5548
+ * part of the finding identity, baseline keys or fingerprints.
5549
+ */
5550
+ effective_severity?: (EffectiveSeverity | null)
5059
5551
  }
5060
5552
  /**
5061
5553
  * Wire-shape envelope for an [`UnusedSvelteEvent`] finding. There is no safe
@@ -5095,6 +5587,13 @@ actions: IssueAction[]
5095
5587
  * the merge-base.
5096
5588
  */
5097
5589
  introduced?: (AuditIntroduced | null)
5590
+ /**
5591
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5592
+ * resolve for its path. CI formats read it for the annotation, SARIF
5593
+ * and CodeClimate level. Absent in output from older versions. Not
5594
+ * part of the finding identity, baseline keys or fingerprints.
5595
+ */
5596
+ effective_severity?: (EffectiveSeverity | null)
5098
5597
  }
5099
5598
  /**
5100
5599
  * Wire-shape envelope for an [`UnusedServerAction`] finding. There is no safe
@@ -5129,6 +5628,13 @@ actions: IssueAction[]
5129
5628
  * the merge-base.
5130
5629
  */
5131
5630
  introduced?: (AuditIntroduced | null)
5631
+ /**
5632
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5633
+ * resolve for its path. CI formats read it for the annotation, SARIF
5634
+ * and CodeClimate level. Absent in output from older versions. Not
5635
+ * part of the finding identity, baseline keys or fingerprints.
5636
+ */
5637
+ effective_severity?: (EffectiveSeverity | null)
5132
5638
  }
5133
5639
  /**
5134
5640
  * Wire-shape envelope for an [`UnusedLoadDataKey`] finding. There is no safe
@@ -5169,6 +5675,13 @@ actions: IssueAction[]
5169
5675
  * the merge-base.
5170
5676
  */
5171
5677
  introduced?: (AuditIntroduced | null)
5678
+ /**
5679
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5680
+ * resolve for its path. CI formats read it for the annotation, SARIF
5681
+ * and CodeClimate level. Absent in output from older versions. Not
5682
+ * part of the finding identity, baseline keys or fingerprints.
5683
+ */
5684
+ effective_severity?: (EffectiveSeverity | null)
5172
5685
  }
5173
5686
  /**
5174
5687
  * Wire-shape envelope for a [`PropDrillingChain`] finding. There is no safe
@@ -5203,6 +5716,14 @@ actions: IssueAction[]
5203
5716
  * the merge-base.
5204
5717
  */
5205
5718
  introduced?: (AuditIntroduced | null)
5719
+ /**
5720
+ * Rule severity of this finding. This type never gates the run, so the
5721
+ * value does not change the exit code. `fallow report --from` reads it
5722
+ * for the SARIF level, so the level does not depend on the config at
5723
+ * render time. Absent in output from older versions. Not part of the
5724
+ * finding identity, baseline keys or fingerprints.
5725
+ */
5726
+ effective_severity?: (EffectiveSeverity | null)
5206
5727
  }
5207
5728
  /**
5208
5729
  * One hop in a prop-drilling chain: a component that received the prop and
@@ -5260,6 +5781,14 @@ actions: IssueAction[]
5260
5781
  * the merge-base.
5261
5782
  */
5262
5783
  introduced?: (AuditIntroduced | null)
5784
+ /**
5785
+ * Rule severity of this finding. This type never gates the run, so the
5786
+ * value does not change the exit code. `fallow report --from` reads it
5787
+ * for the SARIF level, so the level does not depend on the config at
5788
+ * render time. Absent in output from older versions. Not part of the
5789
+ * finding identity, baseline keys or fingerprints.
5790
+ */
5791
+ effective_severity?: (EffectiveSeverity | null)
5263
5792
  }
5264
5793
  /**
5265
5794
  * Wire-shape envelope for a [`DuplicatePropShape`] finding. There is no safe
@@ -5310,6 +5839,14 @@ actions: IssueAction[]
5310
5839
  * the merge-base.
5311
5840
  */
5312
5841
  introduced?: (AuditIntroduced | null)
5842
+ /**
5843
+ * Rule severity of this finding. This type never gates the run, so the
5844
+ * value does not change the exit code. `fallow report --from` reads it
5845
+ * for the SARIF level, so the level does not depend on the config at
5846
+ * render time. Absent in output from older versions. Not part of the
5847
+ * finding identity, baseline keys or fingerprints.
5848
+ */
5849
+ effective_severity?: (EffectiveSeverity | null)
5313
5850
  }
5314
5851
  /**
5315
5852
  * One member of a duplicate-prop-shape group: the OTHER components that share
@@ -5483,6 +6020,19 @@ moved_entries: number
5483
6020
  * existed gets, which is why the keys remain the fallback.
5484
6021
  */
5485
6022
  unrecognised_format?: boolean
6023
+ /**
6024
+ * The command that saved the loaded file, when `unrecognised_format` is
6025
+ * true and the file names a writer this version knows: `dead-code`,
6026
+ * `dupes` or `health`, the token the file carries in its top-level `kind`.
6027
+ *
6028
+ * Absent, never null, for this command's own baseline, for a file that
6029
+ * names no writer (an empty file, or a baseline saved before `kind`
6030
+ * existed) and for a `kind` token this version does not know. The value
6031
+ * set is OPEN: a later release can add a writer, so treat an unknown value
6032
+ * as "another command". The CLI computes it once per loaded baseline and
6033
+ * uses the same value for its stderr note.
6034
+ */
6035
+ saved_by?: string
5486
6036
  /**
5487
6037
  * Which channels narrowed this run, present and non-empty exactly when
5488
6038
  * `change_scoped` is true. Both members are derived from one function, so
@@ -5566,9 +6116,10 @@ reason?: (string | null)
5566
6116
  * whole object narrows the report tells its reader an unwritten SARIF file
5567
6117
  * widened the analysis, which is what `affects` exists to prevent.
5568
6118
  *
5569
- * `scope_size` is emitted for `diff-filter` only today, in added lines. A
5570
- * consumer reads the unit off the name, so a name that starts measuring its
5571
- * own scope in a later release needs no change here.
6119
+ * `scope_size` is emitted for `diff-filter`, in added lines, and for
6120
+ * `changed-since`, in changed files that the run analyzed. `sarif-file`
6121
+ * measures no scope. A consumer reads the unit off the name, so a name that
6122
+ * starts to measure its own scope in a later release needs no change here.
5572
6123
  *
5573
6124
  * `invalid-ref` is reachable only through the programmatic API. The
5574
6125
  * `--changed-since` flag validates its value before a run starts and fails
@@ -5591,7 +6142,8 @@ affects: RequestEffect
5591
6142
  /**
5592
6143
  * What was asked, as the user spelled it: the git ref for
5593
6144
  * `changed-since`, the diff source label (`--diff-file pr.diff`,
5594
- * `--diff-stdin`, `$FALLOW_DIFF_FILE build/pr.diff`) for `diff-filter`,
6145
+ * `--diff-stdin`, `$FALLOW_DIFF_FILE build/pr.diff`, or
6146
+ * `diffFile pr.diff` for the programmatic option) for `diff-filter`,
5595
6147
  * the target path for `sarif-file`. Echoed rather than normalised, so a
5596
6148
  * consumer must not join it to the project root the way it joins every
5597
6149
  * other path-shaped field.
@@ -5604,9 +6156,14 @@ requested: string
5604
6156
  * number there would describe a scope nobody applied.
5605
6157
  *
5606
6158
  * The unit belongs to the name. `diff-filter` counts added lines, which is
5607
- * what its filter keeps a finding for. Read the unit off the name the entry
5608
- * is keyed under, never across names, and read an absent member as "not
5609
- * measured" rather than as zero.
6159
+ * what its filter keeps a finding for. `changed-since` counts changed
6160
+ * files that the run analyzed: a changed file that discovery or an ignore
6161
+ * rule dropped does not count, so a change to a README only gives `0`. A
6162
+ * combined run counts a file that any of its analyses kept, because a
6163
+ * per-analysis `production` setting can give its analyses different
6164
+ * files.
6165
+ * Read the unit off the name the entry is keyed under, never across names,
6166
+ * and read an absent member as "not measured" rather than as zero.
5610
6167
  *
5611
6168
  * The count is what the run INDEXED rather than the true total:
5612
6169
  * `diff-filter` indexes at most one million added lines and reports that
@@ -6201,6 +6758,14 @@ react_prop_count?: number
6201
6758
  react_hook_profile?: (ReactHookProfile | null)
6202
6759
  exceeded: ExceededThreshold
6203
6760
  severity: FindingSeverity
6761
+ /**
6762
+ * Gate severity after the `complexity-*` rules and their
6763
+ * `overrides[].rules` entries: `error` fails the run, `warn` does not.
6764
+ * The most severe rule of the kinds in `exceeded` wins. It is separate
6765
+ * from the band in `severity`, which ranks the finding and does not gate
6766
+ * it. Absent in reports from older versions.
6767
+ */
6768
+ effective_severity?: (EffectiveSeverity | null)
6204
6769
  /**
6205
6770
  * CRAP score (change risk anti-pattern), when coverage data exists.
6206
6771
  */
@@ -6507,6 +7072,11 @@ average_maintainability?: (number | null)
6507
7072
  * Coverage model behind the CRAP scores, when coverage was used.
6508
7073
  */
6509
7074
  coverage_model?: (CoverageModel | null)
7075
+ /**
7076
+ * Input format of the measured coverage (`istanbul` or `v8`). Present
7077
+ * only with `coverage_model: "istanbul"`.
7078
+ */
7079
+ coverage_input_format?: (CoverageInputFormat | null)
6510
7080
  /**
6511
7081
  * Whether CRAP findings mix coverage sources.
6512
7082
  */
@@ -7510,8 +8080,8 @@ watermark?: (RuntimeCoverageWatermark | null)
7510
8080
  */
7511
8081
  warnings?: RuntimeCoverageMessage[]
7512
8082
  /**
7513
- * Whether an autonomous agent may act on this report (fallow-rs/fallow-cloud#316,
7514
- * mirrors the cloud runtime-context contract). `false` when the capture
8083
+ * Whether an autonomous agent may act on this report (mirrors
8084
+ * the cloud runtime-context contract). `false` when the capture
7515
8085
  * carries no usable runtime evidence (no tracked functions); then
7516
8086
  * `actionability_verdict` is `insufficient_evidence` and
7517
8087
  * `actionability_reason` explains. F4: a non-action floor, never a gate on a
@@ -7741,7 +8311,7 @@ description: string
7741
8311
  auto_fixable: boolean
7742
8312
  }
7743
8313
  /**
7744
- * Discriminator inputs that PRODUCED a finding's verdict (fallow-rs/fallow-cloud#321),
8314
+ * Discriminator inputs that PRODUCED a finding's verdict,
7745
8315
  * emitted alongside the verdict so an agent can reproduce it and see the
7746
8316
  * minimum-observation confidence cap instead of re-deriving them from scratch.
7747
8317
  * F4: these make the EXISTING Fallow-owned discriminators legible; they are not
@@ -7830,6 +8400,48 @@ percentile: number
7830
8400
  * when empty.
7831
8401
  */
7832
8402
  actions?: RuntimeCoverageAction[]
8403
+ /**
8404
+ * Per-call cost inputs and the speed-work score for this hot function.
8405
+ * Omitted when the hot path has no `stable_id` or no static counterpart
8406
+ * in this checkout.
8407
+ */
8408
+ optimization_target?: (RuntimeCoverageOptimizationTarget | null)
8409
+ }
8410
+ /**
8411
+ * Speed-work inputs for one hot function: how often it runs and how much
8412
+ * work each call does. `importance` ranks the risk of a change; this block
8413
+ * ranks where speed work gives the largest gain.
8414
+ */
8415
+ export interface RuntimeCoverageOptimizationTarget {
8416
+ /**
8417
+ * `invocations` multiplied by the per-call cost that `cost_basis` names.
8418
+ * Uncapped integer. Compare it only between hot paths with the same
8419
+ * `cost_basis`: sort by `cost_basis` first, then by `cost_score`
8420
+ * descending. On the `cognitive` basis the per-call cost is at least 1.
8421
+ */
8422
+ cost_score: number
8423
+ cost_basis: RuntimeCoverageCostBasis
8424
+ /**
8425
+ * Static cognitive complexity of the function. A static proxy for the
8426
+ * work per call, not a measurement.
8427
+ */
8428
+ cognitive: number
8429
+ /**
8430
+ * Static cyclomatic complexity of the function.
8431
+ */
8432
+ cyclomatic: number
8433
+ /**
8434
+ * Number of lines in the function body.
8435
+ */
8436
+ line_count: number
8437
+ /**
8438
+ * Peak executions of one block inside the function per call, from V8
8439
+ * block coverage. `1.0` means no block ran more than once per call. A
8440
+ * loop body that runs 3 times per call gives `3.0`. Calls to other
8441
+ * functions do not change the value.
8442
+ * Omitted when the coverage input has no block counts for the function.
8443
+ */
8444
+ inner_iterations_per_call?: (number | null)
7833
8445
  }
7834
8446
  /**
7835
8447
  * One blast-radius entry in `runtime_coverage.blast_radius`: how far a
@@ -7937,7 +8549,7 @@ code: string
7937
8549
  message: string
7938
8550
  }
7939
8551
  /**
7940
- * Provenance of a runtime-coverage report (fallow-rs/fallow-cloud#319), mirroring
8552
+ * Provenance of a runtime-coverage report, mirroring
7941
8553
  * the cloud runtime-context `provenance` block so the local-capture and cloud
7942
8554
  * surfaces present one portable shape. F4: provenance is context only; it never
7943
8555
  * gates a verdict or confidence.
@@ -10137,6 +10749,12 @@ imported_by: string[]
10137
10749
  * Re-exports declared by this file.
10138
10750
  */
10139
10751
  re_exports: TracedReExport[]
10752
+ /**
10753
+ * The configs that make this file an entry point through Module
10754
+ * Federation `exposes`, one per config. Absent when no Federation config
10755
+ * exposes the file (issue #2796).
10756
+ */
10757
+ sources?: TraceSource[]
10140
10758
  }
10141
10759
  /**
10142
10760
  * An export with usage information.
@@ -10176,6 +10794,37 @@ imported_name: string
10176
10794
  */
10177
10795
  exported_name: string
10178
10796
  }
10797
+ /**
10798
+ * A config that names a traced file or a traced dependency, and the key that
10799
+ * names it.
10800
+ */
10801
+ export interface TraceSource {
10802
+ /**
10803
+ * The mechanism that names the file or the dependency:
10804
+ * `module-federation`. The set is open.
10805
+ */
10806
+ kind: string
10807
+ /**
10808
+ * The plugin that read the config, as it labels itself:
10809
+ * `module-federation` for a standalone `module-federation.config.*`,
10810
+ * or the bundler plugin (`webpack`, `rspack`, `rsbuild`, `vite`,
10811
+ * `nextjs`) that read the same options inline from its own config.
10812
+ */
10813
+ plugin: string
10814
+ /**
10815
+ * The file that names the file or the dependency, relative to the
10816
+ * project root: the config file, or the source file of a Module
10817
+ * Federation runtime call.
10818
+ */
10819
+ config: string
10820
+ /**
10821
+ * The config key or the runtime function that names the file or the
10822
+ * dependency: `exposes` for an exposed file, `remotes` for a remote
10823
+ * alias, and `registerRemotes`, `loadRemote`, `init` or `createInstance`
10824
+ * for a remote that a runtime call names. The set is open.
10825
+ */
10826
+ key: string
10827
+ }
10179
10828
  /**
10180
10829
  * Result of tracing a dependency: where it is used.
10181
10830
  */
@@ -10204,6 +10853,13 @@ is_used: boolean
10204
10853
  * Total import count.
10205
10854
  */
10206
10855
  import_count: number
10856
+ /**
10857
+ * The configs that declare this name as a Module Federation remote alias
10858
+ * under `remotes`, one per config. A remote alias is provided by a
10859
+ * remote container at runtime, not by an npm package. Absent when no
10860
+ * Federation config declares the name (issue #2796).
10861
+ */
10862
+ sources?: TraceSource[]
10207
10863
  }
10208
10864
  /**
10209
10865
  * Result of tracing a clone: all groups containing the code at a source
@@ -10349,6 +11005,13 @@ to: string
10349
11005
  * chain is a real compile-time coupling.
10350
11006
  */
10351
11007
  type_only: boolean
11008
+ /**
11009
+ * Whether the edge carries a runtime value but no static one: the target
11010
+ * loads only on demand (`import()`, a lazy glob or template pattern) or
11011
+ * on another thread (a worker URL, `child_process.fork`). False for a
11012
+ * static hop and for a type-only hop.
11013
+ */
11014
+ dynamic: boolean
10352
11015
  /**
10353
11016
  * 1-based line in `from` of the imported binding that creates this edge:
10354
11017
  * the first value-carrying symbol on the import, or the first symbol when
@@ -11296,13 +11959,13 @@ grouped_by?: (GroupByMode | null)
11296
11959
  */
11297
11960
  groups?: (HealthGroup[] | null)
11298
11961
  /**
11299
- * Every gate this run ARMED, keyed by name, absent when it armed none.
11300
- * Each entry is the same rule that decides the exit code, so a CI
11301
- * integration reads the verdict instead of guessing from a process status
11302
- * it usually cannot see. A gate fails the build when `status` is `fail`
11303
- * AND `enforced` is true. Armed, not evaluated: fallow's default severity
11304
- * rules fail a run with no flag at all, so an absent object means "no gate
11305
- * was asked for", never "nothing failed". See [`crate::GateOutcomes`].
11962
+ * The verdict of every gate this run evaluated, keyed by name. The CLI
11963
+ * always emits it, with the command's default exit rule in it also when
11964
+ * no flag armed a gate, so a CI integration reads the verdict instead of
11965
+ * guessing from a process status it usually cannot see. A gate fails the
11966
+ * build when `status` is `fail` AND `enforced` is true. The typed
11967
+ * programmatic API runs no CLI gate and leaves it absent. See
11968
+ * [`crate::GateOutcomes`].
11306
11969
  */
11307
11970
  gate_outcomes?: (GateOutcomes | null)
11308
11971
  /**
@@ -11499,13 +12162,11 @@ groups?: (DuplicationGroup[] | null)
11499
12162
  */
11500
12163
  baseline_staleness?: (BaselineStaleness | null)
11501
12164
  /**
11502
- * Every gate this run ARMED, keyed by name, absent when it armed none.
11503
- * Each entry is the same rule that decides the exit code, so a CI
11504
- * integration reads the verdict instead of guessing from a process status
11505
- * it usually cannot see. A gate fails the build when `status` is `fail`
11506
- * AND `enforced` is true. Armed, not evaluated: fallow's default severity
11507
- * rules fail a run with no flag at all, so an absent object means "no gate
11508
- * was asked for", never "nothing failed". See [`crate::GateOutcomes`].
12165
+ * The verdict of every gate this run armed, keyed by name, absent when
12166
+ * it armed none. `dupes` has no default exit rule: a run with no armed
12167
+ * gate always exits 0, so an absent object means that the run passed. A
12168
+ * gate fails the build when `status` is `fail` AND `enforced` is true.
12169
+ * See [`crate::GateOutcomes`].
11509
12170
  */
11510
12171
  gate_outcomes?: (GateOutcomes | null)
11511
12172
  /**
@@ -11686,13 +12347,13 @@ groups: CheckGroupedEntry[]
11686
12347
  */
11687
12348
  baseline_staleness?: (BaselineStaleness | null)
11688
12349
  /**
11689
- * Every gate this run ARMED, keyed by name, absent when it armed none.
11690
- * Each entry is the same rule that decides the exit code, so a CI
11691
- * integration reads the verdict instead of guessing from a process status
11692
- * it usually cannot see. A gate fails the build when `status` is `fail`
11693
- * AND `enforced` is true. Armed, not evaluated: fallow's default severity
11694
- * rules fail a run with no flag at all, so an absent object means "no gate
11695
- * was asked for", never "nothing failed". See [`crate::GateOutcomes`].
12350
+ * The verdict of every gate this run evaluated, keyed by name. The CLI
12351
+ * always emits it, with the command's default exit rule in it also when
12352
+ * no flag armed a gate, so a CI integration reads the verdict instead of
12353
+ * guessing from a process status it usually cannot see. A gate fails the
12354
+ * build when `status` is `fail` AND `enforced` is true. The typed
12355
+ * programmatic API runs no CLI gate and leaves it absent. See
12356
+ * [`crate::GateOutcomes`].
11696
12357
  */
11697
12358
  gate_outcomes?: (GateOutcomes | null)
11698
12359
  /**
@@ -11764,6 +12425,12 @@ unused_types: UnusedTypeFinding[]
11764
12425
  * typed `actions` array natively.
11765
12426
  */
11766
12427
  private_type_leaks: PrivateTypeLeakFinding[]
12428
+ /**
12429
+ * Exports marked `@deprecated` that still have at least one consumer in
12430
+ * a reachable file. Wrapped in [`DeprecatedExportInUseFinding`]. Opt-in: the
12431
+ * `deprecated-exports-in-use` rule defaults to `off`.
12432
+ */
12433
+ deprecated_exports_in_use?: DeprecatedExportInUseFinding[]
11767
12434
  /**
11768
12435
  * Dependencies listed in package.json but never imported. Wrapped in
11769
12436
  * [`UnusedDependencyFinding`] so each entry carries a typed `actions`
@@ -12375,13 +13042,13 @@ version: ToolVersion
12375
13042
  elapsed_ms: ElapsedMs
12376
13043
  config: SecurityOutputConfig
12377
13044
  /**
12378
- * Every gate this run ARMED, keyed by name, absent when it armed none.
12379
- * Each entry is the same rule that decides the exit code, so a CI
12380
- * integration reads the verdict instead of guessing from a process status
12381
- * it usually cannot see. A gate fails the build when `status` is `fail`
12382
- * AND `enforced` is true. Armed, not evaluated: fallow's default severity
12383
- * rules fail a run with no flag at all, so an absent object means "no gate
12384
- * was asked for", never "nothing failed". See [`crate::GateOutcomes`].
13045
+ * The verdict of every gate this run evaluated, keyed by name. The CLI
13046
+ * always emits it, with the command's default exit rule in it also when
13047
+ * no flag armed a gate, so a CI integration reads the verdict instead of
13048
+ * guessing from a process status it usually cannot see. A gate fails the
13049
+ * build when `status` is `fail` AND `enforced` is true. The typed
13050
+ * programmatic API runs no CLI gate and leaves it absent. See
13051
+ * [`crate::GateOutcomes`].
12385
13052
  */
12386
13053
  gate_outcomes?: (GateOutcomes | null)
12387
13054
  /**
@@ -12488,10 +13155,10 @@ new_count: number
12488
13155
  export interface SecurityFinding {
12489
13156
  /**
12490
13157
  * Stable per-finding correlation id, identical across runs for the same
12491
- * rule + anchor path + line. An autonomous agent that triaged this
13158
+ * rule + anchor path + line + column. An autonomous agent that triaged this
12492
13159
  * candidate on a prior run uses it to correlate the candidate after a
12493
- * rebase. Equal to the SARIF `partialFingerprints` value for the same
12494
- * finding (one shared helper computes both).
13160
+ * rebase. Equal to the SARIF `partialFingerprints["fallowSecurity/v2"]`
13161
+ * value for the same finding (one shared helper computes both).
12495
13162
  */
12496
13163
  finding_id: string
12497
13164
  kind: SecurityFindingKind
@@ -12909,7 +13576,8 @@ defensive_boundary: SecurityDefensiveBoundary
12909
13576
  */
12910
13577
  export interface SecurityDefensiveBoundary {
12911
13578
  /**
12912
- * Known controls detected along this path.
13579
+ * Control patterns observed in files on this import trace. These are
13580
+ * verification hints, not proof of sink protection or value-level data flow.
12913
13581
  */
12914
13582
  controls: SecurityDefensiveControl[]
12915
13583
  /**
@@ -12919,7 +13587,9 @@ controls: SecurityDefensiveControl[]
12919
13587
  verification_prompt: string
12920
13588
  }
12921
13589
  /**
12922
- * Defensive control found on an attack-surface path.
13590
+ * Control pattern observed in a file on an attack-surface import trace.
13591
+ * Its presence does not prove that it executes before the sink or protects
13592
+ * the same input.
12923
13593
  */
12924
13594
  export interface SecurityDefensiveControl {
12925
13595
  kind: SecurityControlKind
@@ -13018,13 +13688,13 @@ version: ToolVersion
13018
13688
  elapsed_ms: ElapsedMs
13019
13689
  config: SecurityOutputConfig
13020
13690
  /**
13021
- * Every gate this run ARMED, keyed by name, absent when it armed none.
13022
- * Each entry is the same rule that decides the exit code, so a CI
13023
- * integration reads the verdict instead of guessing from a process status
13024
- * it usually cannot see. A gate fails the build when `status` is `fail`
13025
- * AND `enforced` is true. Armed, not evaluated: fallow's default severity
13026
- * rules fail a run with no flag at all, so an absent object means "no gate
13027
- * was asked for", never "nothing failed". See [`crate::GateOutcomes`].
13691
+ * The verdict of every gate this run evaluated, keyed by name. The CLI
13692
+ * always emits it, with the command's default exit rule in it also when
13693
+ * no flag armed a gate, so a CI integration reads the verdict instead of
13694
+ * guessing from a process status it usually cannot see. A gate fails the
13695
+ * build when `status` is `fail` AND `enforced` is true. The typed
13696
+ * programmatic API runs no CLI gate and leaves it absent. See
13697
+ * [`crate::GateOutcomes`].
13028
13698
  */
13029
13699
  gate_outcomes?: (GateOutcomes | null)
13030
13700
  /**
@@ -13321,13 +13991,17 @@ schema_version: CombinedSchemaVersion
13321
13991
  version: ToolVersion
13322
13992
  elapsed_ms: ElapsedMs
13323
13993
  /**
13324
- * Every gate this run ARMED, keyed by name, absent when it armed none.
13325
- * Each entry is the same rule that decides the exit code, so a CI
13326
- * integration reads the verdict instead of guessing from a process status
13327
- * it usually cannot see. A gate fails the build when `status` is `fail`
13328
- * AND `enforced` is true. Armed, not evaluated: fallow's default severity
13329
- * rules fail a run with no flag at all, so an absent object means "no gate
13330
- * was asked for", never "nothing failed". See [`crate::GateOutcomes`].
13994
+ * The verdict of every gate this run evaluated, keyed by name. The CLI
13995
+ * always emits it, with the default exit rule of each section that ran
13996
+ * (`error-severity-findings`, `health-findings`). The machine formats of
13997
+ * the combined run exit 0 for findings, so most entries have `enforced:
13998
+ * false`. For the default exit rules (`error-severity-findings`,
13999
+ * `health-findings`), `status` gives the verdict of the human run. An
14000
+ * advisory entry can report `fail` without a failure of the human run: an
14001
+ * example is a `stale-baseline` entry that `--fail-on-stale-baseline` did
14002
+ * not arm. A gate fails the build when `status` is `fail` AND `enforced`
14003
+ * is true. The typed
14004
+ * programmatic API leaves it absent. See [`crate::GateOutcomes`].
13331
14005
  */
13332
14006
  gate_outcomes?: (GateOutcomes | null)
13333
14007
  /**
@@ -13351,7 +14025,7 @@ check?: (CheckOutput | null)
13351
14025
  /**
13352
14026
  * Duplication section of the combined run.
13353
14027
  */
13354
- dupes?: (DupesReportPayload | null)
14028
+ dupes?: (CombinedDupesSection | null)
13355
14029
  /**
13356
14030
  * Health section of the combined run.
13357
14031
  */
@@ -13393,11 +14067,46 @@ health?: (Meta | null)
13393
14067
  telemetry?: (TelemetryMeta | null)
13394
14068
  }
13395
14069
  /**
13396
- * Envelope emitted by `fallow flags --format json`.
14070
+ * Wire shape of the `dupes` section inside the bare combined envelope.
14071
+ *
14072
+ * The section is the standalone payload plus the view of the loaded
14073
+ * duplication baseline. The standalone `dupes` envelope carries the same
14074
+ * `baseline_staleness` key at its root.
13397
14075
  */
13398
- export interface FeatureFlagsOutput {
13399
- schema_version: FeatureFlagsSchemaVersion
13400
- version: ToolVersion
14076
+ export interface CombinedDupesSection {
14077
+ /**
14078
+ * All detected clone groups, each wrapped with typed actions.
14079
+ */
14080
+ clone_groups: CloneGroupFinding[]
14081
+ /**
14082
+ * Clone families, each wrapped with typed actions. Inner `groups`
14083
+ * inside each `CloneFamilyFinding` are themselves wrapped as
14084
+ * `CloneGroupFinding` entries carrying their own `actions[]` (and
14085
+ * optional audit-mode `introduced` flag), so JSON-Schema strict
14086
+ * consumers and TS consumers reading `clone_families[].groups[]` see
14087
+ * the same shape as the top-level `clone_groups[]` array (preserves
14088
+ * the issue #393 regression contract).
14089
+ */
14090
+ clone_families: CloneFamilyFinding[]
14091
+ /**
14092
+ * Mirrored directory pairs.
14093
+ */
14094
+ mirrored_directories?: MirroredDirectory[]
14095
+ stats: DuplicationStats
14096
+ /**
14097
+ * This run's view of the loaded duplication baseline, present only when
14098
+ * `--dupes-baseline` loaded one. Read `change_scoped` before dividing
14099
+ * `matched_entries` by `baseline_entries`: a narrowed run can report
14100
+ * `matched_entries: 0` on a healthy baseline.
14101
+ */
14102
+ baseline_staleness?: (BaselineStaleness | null)
14103
+ }
14104
+ /**
14105
+ * Envelope emitted by `fallow flags --format json`.
14106
+ */
14107
+ export interface FeatureFlagsOutput {
14108
+ schema_version: FeatureFlagsSchemaVersion
14109
+ version: ToolVersion
13401
14110
  elapsed_ms: ElapsedMs
13402
14111
  /**
13403
14112
  * What the run was asked to narrow and whether it did. See
@@ -13441,6 +14150,15 @@ total_flags: number
13441
14150
  * change.
13442
14151
  */
13443
14152
  workspace_diagnostics?: WorkspaceDiagnostic[]
14153
+ /**
14154
+ * One row per flag with the reasons the flag can be retired.
14155
+ *
14156
+ * Present only with `--retirement`. Without that option the key is
14157
+ * omitted, so the envelope stays byte-identical and `schema_version`
14158
+ * does not move. The per-site `feature_flags[]` array is the same with
14159
+ * and without the option.
14160
+ */
14161
+ retirement?: (FlagRetirementReport | null)
13444
14162
  /**
13445
14163
  * `_meta` block; see [`FeatureFlagsMeta`].
13446
14164
  */
@@ -13516,6 +14234,347 @@ dead_export_count: number
13516
14234
  */
13517
14235
  dead_exports: string[]
13518
14236
  }
14237
+ /**
14238
+ * The `retirement` block of `fallow flags --retirement --format json`.
14239
+ */
14240
+ export interface FlagRetirementReport {
14241
+ /**
14242
+ * The analysis clock that ages count from, as an RFC 3339 UTC
14243
+ * timestamp. `null` when the age mode is `off`, and also when no git
14244
+ * history is available: outside a repository, on a branch without
14245
+ * commits, or in a shallow clone. A `workspace_diagnostics` entry then
14246
+ * gives the reason.
14247
+ */
14248
+ generated_at_clock?: (string | null)
14249
+ age_mode: FlagAgeMode
14250
+ /**
14251
+ * The vendor export that the report read. Present only with
14252
+ * `--flag-state`.
14253
+ */
14254
+ vendor_state?: (RetirementVendorState | null)
14255
+ summary: RetirementSummary
14256
+ /**
14257
+ * Verdict of `--fail-on-regression` against a flags regression
14258
+ * baseline. Present only when the gate ran.
14259
+ */
14260
+ regression?: (FlagRegressionResult | null)
14261
+ /**
14262
+ * Verdict of `--max-flag-age`. Present only with that option.
14263
+ */
14264
+ max_flag_age?: (FlagAgeGate | null)
14265
+ /**
14266
+ * One row per flag after the `--min-age`, `--reason`, `--sort` and
14267
+ * `--top` options. A row with an empty `reasons` array is not a
14268
+ * candidate.
14269
+ */
14270
+ flags: RetirementFlag[]
14271
+ }
14272
+ /**
14273
+ * The `--flag-state` vendor export that the report read.
14274
+ */
14275
+ export interface RetirementVendorState {
14276
+ /**
14277
+ * The vendor name from the export, for example `launchdarkly`.
14278
+ */
14279
+ source: string
14280
+ /**
14281
+ * When the export was made, as the export gives it.
14282
+ */
14283
+ exported_at: string
14284
+ /**
14285
+ * Days between `exported_at` and the analysis clock. `null` when the
14286
+ * date cannot be read.
14287
+ */
14288
+ export_age_days?: (number | null)
14289
+ /**
14290
+ * Number of flags in the export.
14291
+ */
14292
+ flags: number
14293
+ }
14294
+ /**
14295
+ * Totals of the retirement report.
14296
+ */
14297
+ export interface RetirementSummary {
14298
+ /**
14299
+ * Distinct flags in the code in scope, before `--min-age` and
14300
+ * `--reason`. The `vendor-only` rows of a `--flag-state` export do not
14301
+ * count here, so the count does not change when a key is added in the
14302
+ * vendor only. `by_reason` counts them.
14303
+ */
14304
+ distinct_flags: number
14305
+ /**
14306
+ * Rows in scope with at least one reason, `vendor-only` rows included.
14307
+ */
14308
+ candidates: number
14309
+ /**
14310
+ * Number of rows in scope per reason.
14311
+ */
14312
+ by_reason: {
14313
+ [k: string]: number
14314
+ }
14315
+ }
14316
+ /**
14317
+ * Verdict of the flags regression gate.
14318
+ */
14319
+ export interface FlagRegressionResult {
14320
+ status: RegressionStatus
14321
+ /**
14322
+ * The `--tolerance` value. Absent when the status is `skipped`.
14323
+ */
14324
+ tolerance?: (number | null)
14325
+ /**
14326
+ * How to read `tolerance`. Absent when the status is `skipped`.
14327
+ */
14328
+ tolerance_kind?: (RegressionToleranceKind | null)
14329
+ /**
14330
+ * The compared counts: `distinct_flags` first, then each `--reason`
14331
+ * code. Empty when the status is `skipped`.
14332
+ */
14333
+ metrics: FlagRegressionMetric[]
14334
+ /**
14335
+ * Whether one count grew more than the tolerance.
14336
+ */
14337
+ exceeded: boolean
14338
+ /**
14339
+ * Why the gate did not run. Present only when the status is `skipped`.
14340
+ */
14341
+ reason?: (string | null)
14342
+ }
14343
+ /**
14344
+ * One count that the flags regression gate compares.
14345
+ */
14346
+ export interface FlagRegressionMetric {
14347
+ /**
14348
+ * `distinct_flags`, or a reason code from `--reason`.
14349
+ */
14350
+ metric: string
14351
+ /**
14352
+ * The count in the baseline.
14353
+ */
14354
+ baseline: number
14355
+ /**
14356
+ * The count in this run.
14357
+ */
14358
+ current: number
14359
+ /**
14360
+ * `current - baseline`.
14361
+ */
14362
+ delta: number
14363
+ /**
14364
+ * Whether the growth is more than the tolerance.
14365
+ */
14366
+ exceeded: boolean
14367
+ }
14368
+ /**
14369
+ * Verdict of `--max-flag-age`.
14370
+ */
14371
+ export interface FlagAgeGate {
14372
+ status: RegressionStatus
14373
+ /**
14374
+ * The `--max-flag-age` value in days.
14375
+ */
14376
+ max_days: number
14377
+ /**
14378
+ * Whether one flag in scope is older than `max_days`.
14379
+ */
14380
+ exceeded: boolean
14381
+ /**
14382
+ * Flags in the code in scope without a measured age. The gate cannot
14383
+ * check these flags.
14384
+ */
14385
+ unmeasured: number
14386
+ /**
14387
+ * Why the gate did not run. Present only when the status is `skipped`.
14388
+ */
14389
+ reason?: (string | null)
14390
+ /**
14391
+ * The flags in scope that are older than `max_days`, oldest first.
14392
+ * The `--reason`, `--min-age` and `--top` options do not change this
14393
+ * list.
14394
+ */
14395
+ flags: FlagAgeGateEntry[]
14396
+ }
14397
+ /**
14398
+ * A flag that is older than `--max-flag-age`.
14399
+ */
14400
+ export interface FlagAgeGateEntry {
14401
+ /**
14402
+ * Flag identifier.
14403
+ */
14404
+ flag_name: string
14405
+ kind: RetirementFlagKind
14406
+ /**
14407
+ * Flag SDK, for SDK flags with a known provider.
14408
+ */
14409
+ sdk_name?: (string | null)
14410
+ /**
14411
+ * Workspace root of the flag, in a project with workspaces.
14412
+ */
14413
+ workspace?: (string | null)
14414
+ /**
14415
+ * Age of the flag in days.
14416
+ */
14417
+ age_days: number
14418
+ }
14419
+ /**
14420
+ * One flag in the retirement report.
14421
+ */
14422
+ export interface RetirementFlag {
14423
+ /**
14424
+ * Flag identifier.
14425
+ */
14426
+ flag_name: string
14427
+ kind: RetirementFlagKind
14428
+ /**
14429
+ * Flag SDK, for SDK flags with a known provider.
14430
+ */
14431
+ sdk_name?: (string | null)
14432
+ /**
14433
+ * Workspace root relative to the analysed root, when the project has
14434
+ * workspaces and the flag is inside one. Part of the flag identity.
14435
+ */
14436
+ workspace?: (string | null)
14437
+ /**
14438
+ * Every site of the flag, sorted by path, line and column.
14439
+ */
14440
+ sites: RetirementSite[]
14441
+ /**
14442
+ * Number of sites in this row that read the flag.
14443
+ */
14444
+ read_sites: number
14445
+ /**
14446
+ * Whether every read site is in a test, story or mock file. Read sites
14447
+ * of the same flag in other workspaces count too.
14448
+ */
14449
+ test_only: boolean
14450
+ /**
14451
+ * First commit that added the flag name. Set in `pickaxe` mode only.
14452
+ */
14453
+ first_seen?: (FlagCommit | null)
14454
+ /**
14455
+ * Oldest commit among the lines that still hold the flag.
14456
+ */
14457
+ oldest_surviving_site?: (FlagCommit | null)
14458
+ /**
14459
+ * Newest commit among the lines that still hold the flag.
14460
+ */
14461
+ last_touched?: (FlagCommit | null)
14462
+ /**
14463
+ * Days between the flag's oldest known commit and the analysis clock.
14464
+ * In `blame` mode this is a lower bound.
14465
+ */
14466
+ age_days?: (number | null)
14467
+ /**
14468
+ * Retirement reasons, in report order. Empty for a flag that is not a
14469
+ * candidate.
14470
+ */
14471
+ reasons: RetirementReason[]
14472
+ /**
14473
+ * Evidence for each reason.
14474
+ */
14475
+ evidence: RetirementEvidence[]
14476
+ /**
14477
+ * Follow-up actions. Empty for a flag that is not a candidate.
14478
+ */
14479
+ actions: RetirementAction[]
14480
+ /**
14481
+ * The vendor state of the flag. Present only with `--flag-state`, for
14482
+ * a flag whose key is in the export.
14483
+ */
14484
+ vendor?: (RetirementVendor | null)
14485
+ }
14486
+ /**
14487
+ * One site of a flag in the retirement report.
14488
+ */
14489
+ export interface RetirementSite {
14490
+ /**
14491
+ * File path relative to the analysed root.
14492
+ */
14493
+ path: string
14494
+ /**
14495
+ * 1-based line.
14496
+ */
14497
+ line: number
14498
+ /**
14499
+ * 0-based byte column.
14500
+ */
14501
+ col: number
14502
+ role: FlagSiteRole
14503
+ /**
14504
+ * Whether the file is a test, story or mock file.
14505
+ */
14506
+ in_test: boolean
14507
+ }
14508
+ /**
14509
+ * A commit that git history links to a flag.
14510
+ */
14511
+ export interface FlagCommit {
14512
+ /**
14513
+ * Abbreviated commit hash.
14514
+ */
14515
+ commit: string
14516
+ /**
14517
+ * Commit date in UTC, as `YYYY-MM-DD`.
14518
+ */
14519
+ date: string
14520
+ }
14521
+ /**
14522
+ * One piece of evidence for a retirement reason.
14523
+ */
14524
+ export interface RetirementEvidence {
14525
+ reason: RetirementReason
14526
+ /**
14527
+ * File path relative to the analysed root. For `vendor-only`, the path
14528
+ * of the `--flag-state` file: relative to the root when the file is
14529
+ * inside it, else as given.
14530
+ */
14531
+ path: string
14532
+ /**
14533
+ * 1-based line.
14534
+ */
14535
+ line: number
14536
+ /**
14537
+ * What the evidence shows.
14538
+ */
14539
+ detail: string
14540
+ }
14541
+ /**
14542
+ * A follow-up action for a retirement candidate.
14543
+ */
14544
+ export interface RetirementAction {
14545
+ type: RetirementActionType
14546
+ /**
14547
+ * Always `false`: Fallow never removes a flag.
14548
+ */
14549
+ auto_fixable: boolean
14550
+ /**
14551
+ * Human-readable action description.
14552
+ */
14553
+ description: string
14554
+ }
14555
+ /**
14556
+ * The vendor state of one flag in the retirement report.
14557
+ */
14558
+ export interface RetirementVendor {
14559
+ /**
14560
+ * The key in the vendor export, before `flags.vendorKeyPrefix` is
14561
+ * removed.
14562
+ */
14563
+ key: string
14564
+ state: VendorFlagState
14565
+ /**
14566
+ * Whether the flag serves one variation, when the export says so.
14567
+ */
14568
+ serves_single_variation?: (boolean | null)
14569
+ /**
14570
+ * When the vendor created the flag, as the export gives it.
14571
+ */
14572
+ created_at?: (string | null)
14573
+ /**
14574
+ * When the vendor last evaluated the flag, as the export gives it.
14575
+ */
14576
+ last_evaluated_at?: (string | null)
14577
+ }
13519
14578
  /**
13520
14579
  * Optional `_meta` block for [`FeatureFlagsOutput`]. Both fields are optional
13521
14580
  * because the two contributors are independent: `feature_flags` details are
@@ -13637,6 +14696,11 @@ deltas: ReviewDeltas
13637
14696
  */
13638
14697
  weakening: WeakeningSignal[]
13639
14698
  routing: RoutingFacts
14699
+ /**
14700
+ * Owner-group reach from the CODEOWNERS file. Absent when no CODEOWNERS
14701
+ * file is found or the file cannot be read.
14702
+ */
14703
+ ownership?: (OwnershipFacts | null)
13640
14704
  /**
13641
14705
  * Dead-code findings scoped to the audit changeset.
13642
14706
  */
@@ -14116,6 +15180,96 @@ expert: string[]
14116
15180
  */
14117
15181
  bus_factor_one?: boolean
14118
15182
  }
15183
+ /**
15184
+ * How far a changeset reaches across CODEOWNERS owner groups.
15185
+ *
15186
+ * Computed from the CODEOWNERS file alone: no git history is read, so the
15187
+ * section is present whenever a CODEOWNERS file is found, also when the churn
15188
+ * walk behind `routing` finds nothing. Each file maps to its primary owner
15189
+ * (the first owner of the last matching rule). A file that no rule matches,
15190
+ * or that a GitLab negation rule matches, belongs to the `(unowned)` group.
15191
+ * The owner strings use the same vocabulary as `routing.units[].expert`.
15192
+ *
15193
+ * Absent from the brief when no CODEOWNERS file is found, or when the file
15194
+ * cannot be read or does not parse. A configured `codeowners` path that
15195
+ * fails also prints a warning on stderr.
15196
+ *
15197
+ * `groups[].direct_count` counts all changed files, source or not, so the
15198
+ * sum over all groups is the number of changed files, not the size of
15199
+ * `impact_closure.in_diff`. Slice owners count only the files of the
15200
+ * partition units, which are source files.
15201
+ */
15202
+ export interface OwnershipFacts {
15203
+ /**
15204
+ * Distinct owner groups across the changed files and the impact closure.
15205
+ * The `(unowned)` group counts as one group. Exact, never capped.
15206
+ */
15207
+ group_count: number
15208
+ /**
15209
+ * Owner groups that own no changed file and appear only through the
15210
+ * impact closure. Exact, never capped.
15211
+ */
15212
+ transitive_only_count: number
15213
+ /**
15214
+ * Changed files that belong to the `(unowned)` group.
15215
+ */
15216
+ unowned_direct_count: number
15217
+ /**
15218
+ * The owner groups, sorted by `direct_count` descending, then
15219
+ * `affected_count` descending, then `owner`. At most [`OWNER_GROUP_CAP`]
15220
+ * entries. The counts in each entry are exact.
15221
+ */
15222
+ groups: OwnerGroupFact[]
15223
+ /**
15224
+ * How many owner groups did not fit within [`OWNER_GROUP_CAP`] and are
15225
+ * absent from `groups`. Zero when nothing was omitted.
15226
+ */
15227
+ groups_omitted: number
15228
+ /**
15229
+ * The owner set of each independent slice, aligned by index with
15230
+ * `partition.independent_slices`. Present only when that list is present
15231
+ * (two or more slices). A fact for the reviewer, never a demand to split.
15232
+ */
15233
+ slices?: OwnershipSliceFact[]
15234
+ }
15235
+ /**
15236
+ * One owner group and how many files of the changeset it owns.
15237
+ */
15238
+ export interface OwnerGroupFact {
15239
+ /**
15240
+ * The CODEOWNERS owner (`@user`, `@org/team`, or an email), or
15241
+ * `(unowned)`.
15242
+ */
15243
+ owner: string
15244
+ /**
15245
+ * Changed files this group owns.
15246
+ */
15247
+ direct_count: number
15248
+ /**
15249
+ * Files of the impact closure (affected, not in the diff) this group owns.
15250
+ */
15251
+ affected_count: number
15252
+ }
15253
+ /**
15254
+ * The owners of one independent slice of the partition.
15255
+ */
15256
+ export interface OwnershipSliceFact {
15257
+ /**
15258
+ * The module directories of the slice, as in
15259
+ * `partition.independent_slices`.
15260
+ */
15261
+ module_dirs: string[]
15262
+ /**
15263
+ * The distinct owners of the changed files in the slice, sorted. The
15264
+ * `(unowned)` group is a distinct owner. Never empty.
15265
+ */
15266
+ owners: string[]
15267
+ /**
15268
+ * True when the slice has exactly one owner, so one owner group can
15269
+ * review it on its own.
15270
+ */
15271
+ separable: boolean
15272
+ }
14119
15273
  /**
14120
15274
  * The brief's branching section.
14121
15275
  */
@@ -14495,6 +15649,12 @@ deltas: ReviewDeltas
14495
15649
  */
14496
15650
  weakening: WeakeningSignal[]
14497
15651
  routing: RoutingFacts
15652
+ /**
15653
+ * How far the change reaches across CODEOWNERS owner groups, computed
15654
+ * from the CODEOWNERS file alone. Absent when no CODEOWNERS file is
15655
+ * found or the file cannot be read.
15656
+ */
15657
+ ownership?: (OwnershipFacts | null)
14498
15658
  decisions: DecisionSurface
14499
15659
  /**
14500
15660
  * Branching conservation across the changeset: total branching against
@@ -15742,6 +16902,16 @@ export type BoundaryViolation = BoundaryViolationFinding;
15742
16902
  */
15743
16903
  export type CircularDependency = CircularDependencyFinding;
15744
16904
 
16905
+ /**
16906
+ * Backwards-compat alias for the pre-#384 bare `DeprecatedExportInUse` name.
16907
+ * The wire shape is byte-identical: `DeprecatedExportInUseFinding` flattens the bare
16908
+ * finding's fields via `#[serde(flatten)]` and adds `actions[]` plus
16909
+ * the optional audit-mode `introduced` flag. Consumers that imported
16910
+ * `DeprecatedExportInUse` from `fallow/types` pre-migration continue to work via
16911
+ * this alias; new code should prefer `DeprecatedExportInUseFinding`.
16912
+ */
16913
+ export type DeprecatedExportInUse = DeprecatedExportInUseFinding;
16914
+
15745
16915
  /**
15746
16916
  * Backwards-compat alias for the pre-#384 bare `DevDependencyInProduction` name.
15747
16917
  * The wire shape is byte-identical: `DevDependencyInProductionFinding` flattens the bare