fallow 3.30.0 → 3.32.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.
@@ -112,7 +112,7 @@ kind: "similar-code-review"
112
112
  /**
113
113
  * Schema projection for the audit envelope's exact version.
114
114
  */
115
- export type AuditSchemaVersion = 11
115
+ export type AuditSchemaVersion = 12
116
116
  /**
117
117
  * Fallow CLI version that produced this envelope. Renders to the JSON wire as
118
118
  * a bare string (e.g. `"2.74.0"`).
@@ -204,7 +204,7 @@ export type TypeAwareAbstentionReason = ("no-project" | "ambiguous-project" | "b
204
204
  /**
205
205
  * Schema projection for the dead-code envelope's exact version.
206
206
  */
207
- export type CheckSchemaVersion = 9
207
+ export type CheckSchemaVersion = 10
208
208
  /**
209
209
  * A suggested action attached to a finding in the JSON output. Each finding
210
210
  * carries an `actions` array; consumers (agents, IDE clients, CI bots) can
@@ -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" | "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")
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" | "review-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
  */
@@ -315,7 +315,7 @@ export type AuditIntroduced = boolean
315
315
  * commands differ: the `fallow audit` `new-only` gate fails only on introduced
316
316
  * findings, so an inherited `error` finding does not fail the audit, and the
317
317
  * combined command (`fallow` without a subcommand) exits 0 for machine
318
- * formats.
318
+ * formats unless `--fail-on-issues` or `--ci` is set.
319
319
  *
320
320
  * Complexity findings carry the same type. The `complexity-cyclomatic`,
321
321
  * `complexity-cognitive` and `complexity-crap` rules set it, and the
@@ -380,7 +380,7 @@ export type ReExportCycleKind = ("multi-node" | "self-loop")
380
380
  /**
381
381
  * Which rule-pack rule kind produced a [`PolicyViolation`].
382
382
  */
383
- export type PolicyRuleKind = ("banned-call" | "banned-import" | "banned-effect" | "banned-export")
383
+ export type PolicyRuleKind = ("banned-call" | "banned-import" | "banned-effect" | "banned-export" | "gdp-proof-producer")
384
384
  /**
385
385
  * Effective severity of a single [`PolicyViolation`]. Per-rule `severity`
386
386
  * overrides the `rules."policy-violation"` master; `off` rules emit nothing,
@@ -460,7 +460,15 @@ export type BaselineStalenessAdvisory = ("none" | "zero-overlap" | "partial")
460
460
  * `--workspace` and `--changed-workspaces` for the same reason. A consumer
461
461
  * must therefore not assume a given command emits a given name.
462
462
  */
463
- export type ScopeReason = ("diff" | "changed-since" | "changed-files" | "workspace" | "changed-workspaces" | "scope" | "file" | "issue-type-filter" | "production")
463
+ export type ScopeReason = ("diff" | "changed-since" | "package-baselines" | "changed-files" | "workspace" | "changed-workspaces" | "scope" | "file" | "issue-type-filter" | "production" | "include-entry-exports")
464
+ /**
465
+ * One reason why a missing id does not prove that the finding is gone.
466
+ *
467
+ * Serialized as kebab-case inside `inconclusive_reasons`. The set is OPEN: a
468
+ * name this build does not emit means "some reason", not an error, and the
469
+ * query stays inconclusive.
470
+ */
471
+ export type FindingIdQueryReason = ("diff" | "changed-since" | "package-baselines" | "changed-files" | "workspace" | "changed-workspaces" | "scope" | "file" | "issue-type-filter" | "production" | "include-entry-exports" | "baseline" | "rule-off" | "filtered")
464
472
  /**
465
473
  * Status of a regression-check pass.
466
474
  */
@@ -554,7 +562,7 @@ kind: "malformed-tsconfig"
554
562
  kind: "tsconfig-reference-dir-missing"
555
563
  } | {
556
564
  /**
557
- * `serde_yaml_ng` parse error text.
565
+ * YAML parse error text.
558
566
  */
559
567
  error: string
560
568
  kind: "malformed-pnpm-workspace-yaml"
@@ -594,8 +602,15 @@ kind: "bun-lockb-override-resolution-skipped"
594
602
  } | {
595
603
  kind: "bun-lock-override-resolution-skipped"
596
604
  } | {
605
+ kind: "pnpm-lock-override-resolution-skipped"
606
+ } | {
607
+ kind: "npm-lock-override-resolution-skipped"
608
+ } | {
597
609
  kind: "bun-resolutions-shadowed-by-overrides"
598
610
  } | {
611
+ cause: PnpmWorkspaceOverridesIgnoredCause
612
+ kind: "pnpm-workspace-overrides-ignored"
613
+ } | {
599
614
  kind: "node-modules-missing"
600
615
  } | {
601
616
  kind: "boundaries-not-configured"
@@ -682,6 +697,13 @@ kind: "ownership-unavailable"
682
697
  error: string
683
698
  kind: "trend-snapshot-unreadable"
684
699
  } | {
700
+ /**
701
+ * Why the groups have no baseline, as a kebab-case token:
702
+ * `snapshot-has-no-groups` or `grouped-by-mismatch`. The set is open.
703
+ */
704
+ cause: string
705
+ kind: "trend-group-baseline-unavailable"
706
+ } | {
685
707
  /**
686
708
  * The plugin that read the config, as it labels itself:
687
709
  * `module-federation` for a standalone `module-federation.config.*`,
@@ -740,7 +762,24 @@ kind: "flag-age-shallow-clone"
740
762
  */
741
763
  cause: string
742
764
  kind: "flag-age-unavailable"
765
+ } | {
766
+ /**
767
+ * The `ignoreDependencies` entry, as written in the config.
768
+ */
769
+ pattern: string
770
+ kind: "ignore-dependencies-glob-unmatched"
771
+ } | {
772
+ /**
773
+ * The `ignoreFindings` entry, as written in the config.
774
+ */
775
+ pattern: string
776
+ kind: "ignore-findings-pattern-unmatched"
743
777
  })
778
+ /**
779
+ * Why the declared pnpm version ignores the `overrides` section of
780
+ * `pnpm-workspace.yaml`.
781
+ */
782
+ export type PnpmWorkspaceOverridesIgnoredCause = ("package-json-overrides" | "pnpm-version")
744
783
  /**
745
784
  * Discriminant for [`CloneGroupAction::kind`]. Mirrors the action types
746
785
  * emitted by the legacy `build_clone_group_actions` walker.
@@ -819,6 +858,15 @@ export type CoverageInputFormat = ("istanbul" | "v8")
819
858
  * Whether CRAP findings in the report used one coverage-source kind or a mix.
820
859
  */
821
860
  export type CoverageSourceConsistency = ("uniform" | "mixed")
861
+ /**
862
+ * One health section that a run produced.
863
+ *
864
+ * A section is in [`HealthReport::sections`] when the run computed it and
865
+ * the report carries its result, also when that result is empty. The value
866
+ * set is OPEN: a later release can add a section, so a consumer must accept
867
+ * a token that it does not know.
868
+ */
869
+ export type HealthSection = ("complexity" | "vital-signs" | "score" | "file-scores" | "coverage-gaps" | "hotspots" | "targets" | "trend" | "runtime-coverage" | "css")
822
870
  /**
823
871
  * Lifecycle state for a configured threshold override.
824
872
  */
@@ -1182,6 +1230,12 @@ export type HealthSchemaVersion = 11
1182
1230
  * groups by GitLab CODEOWNERS `[Section]` header name.
1183
1231
  */
1184
1232
  export type GroupByMode = ("owner" | "directory" | "package" | "section")
1233
+ /**
1234
+ * What the group trend compared, for one group.
1235
+ *
1236
+ * The value set is open: read an unknown value as "no trend for this group".
1237
+ */
1238
+ export type GroupTrendStatus = ("compared" | "new_group" | "no_group_baseline")
1185
1239
  /**
1186
1240
  * Schema projection for the duplication envelope's CLI and programmatic
1187
1241
  * version lineages.
@@ -1298,7 +1352,7 @@ export type SecurityBlindSpotsSchemaVersion = "1"
1298
1352
  /**
1299
1353
  * Schema projection for the combined envelope's exact version.
1300
1354
  */
1301
- export type CombinedSchemaVersion = 12
1355
+ export type CombinedSchemaVersion = 13
1302
1356
  /**
1303
1357
  * Schema projection for the feature-flags envelope's exact version.
1304
1358
  */
@@ -1343,7 +1397,7 @@ export type VendorFlagState = ("on" | "off" | "rolled_out" | "archived" | "exper
1343
1397
  * Independently-versioned wire-version newtype for the brief envelope.
1344
1398
  * Serializes as the integer `REVIEW_BRIEF_SCHEMA_VERSION`.
1345
1399
  */
1346
- export type ReviewBriefSchemaVersion = 11
1400
+ export type ReviewBriefSchemaVersion = 12
1347
1401
  /**
1348
1402
  * The exactly-three shippable decision categories (the SOLID-3). No cut category
1349
1403
  * (abstraction / deletion / convention / irreversibility) is representable: this
@@ -1667,7 +1721,8 @@ duplication_demoted: number
1667
1721
  * gate and leaves the object absent.
1668
1722
  *
1669
1723
  * The names this build can emit are `error-severity-findings`, `regression`,
1670
- * `stale-baseline`, `duplication-threshold`, `health-min-score`,
1724
+ * `stale-baseline`, `baseline-growth`, `duplication-threshold`,
1725
+ * `duplication-findings`, `health-min-score`,
1671
1726
  * `health-min-severity`, `health-findings`, `health-coverage-gaps`,
1672
1727
  * `health-runtime-coverage`, `security`, `security-advisory`, `audit-verdict`,
1673
1728
  * `type-aware-require` and `parse-error`. The set is OPEN: a name a consumer does not
@@ -1699,13 +1754,15 @@ status: GateStatus
1699
1754
  * True when a `fail` from this gate makes the run exit non-zero. False
1700
1755
  * when the verdict is published for information only: the gate was never
1701
1756
  * armed, the run was told never to fail, or the combined machine formats
1702
- * exit 0 for the gate.
1757
+ * exit 0 for the gate (bare `fallow` without `--fail-on-issues`).
1703
1758
  */
1704
1759
  enforced: boolean
1705
1760
  /**
1706
1761
  * The measured value the gate compared, when there is one: the duplication
1707
1762
  * 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
1763
+ * severity floor, the number of `error` findings of `health-findings` and
1764
+ * of `error-severity-findings`, or
1765
+ * the number of files in `files`. Whole numbers are
1709
1766
  * carried as JSON numbers, so a count of three reads as `3.0`. Absent for
1710
1767
  * gates that compare no number.
1711
1768
  */
@@ -1718,7 +1775,9 @@ threshold?: (number | null)
1718
1775
  /**
1719
1776
  * How the limit was spelled, for a gate whose `threshold` number does not
1720
1777
  * carry its own unit. `health-min-severity` sets it to the severity floor
1721
- * (`moderate`, `high` or `critical`); `regression` sets it to the
1778
+ * (`moderate`, `high` or `critical`); `health-findings` and
1779
+ * `error-severity-findings` set it to `error`, the rule severity they
1780
+ * count; `regression` sets it to the
1722
1781
  * tolerance as the user wrote it (`"50%"` or `"5"`), because `threshold`
1723
1782
  * there is the allowance in issues and the percentage would otherwise be
1724
1783
  * unrecoverable on the grouped envelope, which carries no `regression`
@@ -2818,6 +2877,12 @@ circular_dependencies: CircularDependencyFinding[]
2818
2877
  * suppression breaks the cycle).
2819
2878
  */
2820
2879
  re_export_cycles?: ReExportCycleFinding[]
2880
+ /**
2881
+ * Dependency cycles between workspace packages, built from resolved
2882
+ * cross-package imports. Wrapped in [`PackageCycleFinding`] so each
2883
+ * entry carries a typed `actions` array natively.
2884
+ */
2885
+ package_cycles?: PackageCycleFinding[]
2821
2886
  /**
2822
2887
  * Imports that cross architecture boundary rules. Wrapped in
2823
2888
  * [`BoundaryViolationFinding`] so each entry carries a typed `actions`
@@ -2950,6 +3015,10 @@ dynamic_segment_name_conflicts?: DynamicSegmentNameConflictFinding[]
2950
3015
  * array natively. Default severity is `warn`.
2951
3016
  */
2952
3017
  unused_component_props?: UnusedComponentPropFinding[]
3018
+ /**
3019
+ * Used optional component inputs absent from inspected reachable callers. Off by default.
3020
+ */
3021
+ absent_component_props?: AbsentComponentPropFinding[]
2953
3022
  /**
2954
3023
  * Vue `<script setup>` `defineEmits` events emitted nowhere in their own SFC
2955
3024
  * (no `emit('<name>')` call). Wrapped in [`UnusedComponentEmitFinding`] so
@@ -3046,6 +3115,14 @@ baseline?: (BaselineMatch | null)
3046
3115
  * can report `matched_entries: 0` on a healthy baseline.
3047
3116
  */
3048
3117
  baseline_staleness?: (BaselineStaleness | null)
3118
+ /**
3119
+ * The answer to `--finding-id`, present only when the run received one
3120
+ * or more `--finding-id` values. The report then holds only the
3121
+ * requested findings. Read `missing` as resolved only when `conclusive`
3122
+ * is true; a scope, a baseline or a filter can hide a finding that still
3123
+ * exists. See [`crate::FindingIdQuery`].
3124
+ */
3125
+ finding_id_query?: (FindingIdQuery | null)
3049
3126
  /**
3050
3127
  * Regression verdict against the baseline, in `--fail-on-regression` runs.
3051
3128
  */
@@ -3070,6 +3147,11 @@ gate_outcomes?: (GateOutcomes | null)
3070
3147
  * never "nothing failed". See [`crate::RequestOutcomes`].
3071
3148
  */
3072
3149
  request_outcomes?: (RequestOutcomes | null)
3150
+ /**
3151
+ * Applied Git refs for exact workspace packages. Absent when no package
3152
+ * baselines were selected, including runs with a global changed-since ref.
3153
+ */
3154
+ package_baselines?: PackageBaselineStatus[]
3073
3155
  /**
3074
3156
  * `_meta` block with docs and rule definitions, when `--explain` was
3075
3157
  * passed.
@@ -3090,7 +3172,10 @@ _meta?: (Meta | null)
3090
3172
  * detectors: `malformed-pnpm-workspace-yaml`,
3091
3173
  * `bun-lockb-override-resolution-skipped`;
3092
3174
  * - framework plugins, while they read their own build configs:
3093
- * `plugin-config-unreadable`, `plugin-effect-not-modeled`.
3175
+ * `plugin-config-unreadable`, `plugin-effect-not-modeled`;
3176
+ * - the dead-code result, for config patterns that matched nothing:
3177
+ * `ignore-dependencies-glob-unmatched`,
3178
+ * `ignore-findings-pattern-unmatched`.
3094
3179
  *
3095
3180
  * Analysis-stage and plugin-stage kinds therefore reach only the envelopes
3096
3181
  * whose run includes a dead-code analyze pass, never a standalone
@@ -3210,6 +3295,10 @@ unrendered_components?: number
3210
3295
  * Vue, Svelte, or React props referenced nowhere inside their own component.
3211
3296
  */
3212
3297
  unused_component_props?: number
3298
+ /**
3299
+ * Optional consumed props omitted by known reachable callers, for manual review.
3300
+ */
3301
+ absent_component_props?: number
3213
3302
  /**
3214
3303
  * Vue `<script setup>` emits emitted nowhere inside their own SFC.
3215
3304
  */
@@ -3272,6 +3361,10 @@ circular_dependencies: number
3272
3361
  * re-exporting from each other in a loop).
3273
3362
  */
3274
3363
  re_export_cycles?: number
3364
+ /**
3365
+ * Dependency cycles between workspace packages.
3366
+ */
3367
+ package_cycles?: number
3275
3368
  /**
3276
3369
  * Imports that cross architecture boundary rules.
3277
3370
  */
@@ -3351,6 +3444,14 @@ export interface UnusedFileFinding {
3351
3444
  * Absolute path to the unused file.
3352
3445
  */
3353
3446
  path: string
3447
+ /**
3448
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
3449
+ * `~<k>` suffix when several findings of one type share an identity.
3450
+ * Line and column are not inputs, so the id survives line shifts,
3451
+ * reformats and reorders. A rename of the file or the symbol gives a
3452
+ * new id. Absent in output from older versions.
3453
+ */
3454
+ finding_id?: (string | null)
3354
3455
  /**
3355
3456
  * Suggested next steps: a `delete-file` primary and a `suppress-file`
3356
3457
  * secondary. Always emitted (possibly empty for forward-compat).
@@ -3582,6 +3683,14 @@ deprecated?: boolean
3582
3683
  * not deprecated or the tag carries no text.
3583
3684
  */
3584
3685
  deprecated_reason?: (string | null)
3686
+ /**
3687
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
3688
+ * `~<k>` suffix when several findings of one type share an identity.
3689
+ * Line and column are not inputs, so the id survives line shifts,
3690
+ * reformats and reorders. A rename of the file or the symbol gives a
3691
+ * new id. Absent in output from older versions.
3692
+ */
3693
+ finding_id?: (string | null)
3585
3694
  /**
3586
3695
  * Suggested next steps. Always emitted (possibly empty for
3587
3696
  * forward-compat).
@@ -3657,6 +3766,14 @@ deprecated?: boolean
3657
3766
  * not deprecated or the tag carries no text.
3658
3767
  */
3659
3768
  deprecated_reason?: (string | null)
3769
+ /**
3770
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
3771
+ * `~<k>` suffix when several findings of one type share an identity.
3772
+ * Line and column are not inputs, so the id survives line shifts,
3773
+ * reformats and reorders. A rename of the file or the symbol gives a
3774
+ * new id. Absent in output from older versions.
3775
+ */
3776
+ finding_id?: (string | null)
3660
3777
  /**
3661
3778
  * Suggested next steps. Always emitted (possibly empty for
3662
3779
  * forward-compat).
@@ -3722,6 +3839,14 @@ span_start: number
3722
3839
  * package-public leak across files or re-exports.
3723
3840
  */
3724
3841
  semantic?: (SemanticPrivateTypeLeak | null)
3842
+ /**
3843
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
3844
+ * `~<k>` suffix when several findings of one type share an identity.
3845
+ * Line and column are not inputs, so the id survives line shifts,
3846
+ * reformats and reorders. A rename of the file or the symbol gives a
3847
+ * new id. Absent in output from older versions.
3848
+ */
3849
+ finding_id?: (string | null)
3725
3850
  /**
3726
3851
  * Suggested next steps. Always emitted (possibly empty for
3727
3852
  * forward-compat).
@@ -3794,6 +3919,14 @@ consumers: DeprecatedExportConsumer[]
3794
3919
  * are not visible, so the finding makes no removal claim.
3795
3920
  */
3796
3921
  public_api: boolean
3922
+ /**
3923
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
3924
+ * `~<k>` suffix when several findings of one type share an identity.
3925
+ * Line and column are not inputs, so the id survives line shifts,
3926
+ * reformats and reorders. A rename of the file or the symbol gives a
3927
+ * new id. Absent in output from older versions.
3928
+ */
3929
+ finding_id?: (string | null)
3797
3930
  /**
3798
3931
  * Suggested next steps. Always emitted (possibly empty for
3799
3932
  * forward-compat).
@@ -3856,6 +3989,20 @@ line: number
3856
3989
  * Workspace roots that import this package even though the declaring workspace does not.
3857
3990
  */
3858
3991
  used_in_workspaces?: string[]
3992
+ /**
3993
+ * Workspace roots whose package.json declares this package for the files
3994
+ * that import it. Only a root finding fills this field: these imports use
3995
+ * the nearer workspace declaration, so the root declaration stays unused.
3996
+ */
3997
+ declared_and_imported_in?: string[]
3998
+ /**
3999
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4000
+ * `~<k>` suffix when several findings of one type share an identity.
4001
+ * Line and column are not inputs, so the id survives line shifts,
4002
+ * reformats and reorders. A rename of the file or the symbol gives a
4003
+ * new id. Absent in output from older versions.
4004
+ */
4005
+ finding_id?: (string | null)
3859
4006
  /**
3860
4007
  * Suggested next steps. Always emitted (possibly empty for
3861
4008
  * forward-compat).
@@ -3909,6 +4056,20 @@ line: number
3909
4056
  * Workspace roots that import this package even though the declaring workspace does not.
3910
4057
  */
3911
4058
  used_in_workspaces?: string[]
4059
+ /**
4060
+ * Workspace roots whose package.json declares this package for the files
4061
+ * that import it. Only a root finding fills this field: these imports use
4062
+ * the nearer workspace declaration, so the root declaration stays unused.
4063
+ */
4064
+ declared_and_imported_in?: string[]
4065
+ /**
4066
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4067
+ * `~<k>` suffix when several findings of one type share an identity.
4068
+ * Line and column are not inputs, so the id survives line shifts,
4069
+ * reformats and reorders. A rename of the file or the symbol gives a
4070
+ * new id. Absent in output from older versions.
4071
+ */
4072
+ finding_id?: (string | null)
3912
4073
  /**
3913
4074
  * Suggested next steps. Always emitted (possibly empty for
3914
4075
  * forward-compat).
@@ -3962,6 +4123,20 @@ line: number
3962
4123
  * Workspace roots that import this package even though the declaring workspace does not.
3963
4124
  */
3964
4125
  used_in_workspaces?: string[]
4126
+ /**
4127
+ * Workspace roots whose package.json declares this package for the files
4128
+ * that import it. Only a root finding fills this field: these imports use
4129
+ * the nearer workspace declaration, so the root declaration stays unused.
4130
+ */
4131
+ declared_and_imported_in?: string[]
4132
+ /**
4133
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4134
+ * `~<k>` suffix when several findings of one type share an identity.
4135
+ * Line and column are not inputs, so the id survives line shifts,
4136
+ * reformats and reorders. A rename of the file or the symbol gives a
4137
+ * new id. Absent in output from older versions.
4138
+ */
4139
+ finding_id?: (string | null)
3965
4140
  /**
3966
4141
  * Suggested next steps. Always emitted (possibly empty for
3967
4142
  * forward-compat).
@@ -4015,6 +4190,14 @@ line: number
4015
4190
  * 0-based byte column offset.
4016
4191
  */
4017
4192
  col: number
4193
+ /**
4194
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4195
+ * `~<k>` suffix when several findings of one type share an identity.
4196
+ * Line and column are not inputs, so the id survives line shifts,
4197
+ * reformats and reorders. A rename of the file or the symbol gives a
4198
+ * new id. Absent in output from older versions.
4199
+ */
4200
+ finding_id?: (string | null)
4018
4201
  /**
4019
4202
  * Suggested next steps. Always emitted (possibly empty for
4020
4203
  * forward-compat).
@@ -4070,6 +4253,14 @@ line: number
4070
4253
  * 0-based byte column offset.
4071
4254
  */
4072
4255
  col: number
4256
+ /**
4257
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4258
+ * `~<k>` suffix when several findings of one type share an identity.
4259
+ * Line and column are not inputs, so the id survives line shifts,
4260
+ * reformats and reorders. A rename of the file or the symbol gives a
4261
+ * new id. Absent in output from older versions.
4262
+ */
4263
+ finding_id?: (string | null)
4073
4264
  /**
4074
4265
  * Suggested next steps. Always emitted (possibly empty for
4075
4266
  * forward-compat).
@@ -4134,6 +4325,14 @@ line: number
4134
4325
  * 0-based byte column offset.
4135
4326
  */
4136
4327
  col: number
4328
+ /**
4329
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4330
+ * `~<k>` suffix when several findings of one type share an identity.
4331
+ * Line and column are not inputs, so the id survives line shifts,
4332
+ * reformats and reorders. A rename of the file or the symbol gives a
4333
+ * new id. Absent in output from older versions.
4334
+ */
4335
+ finding_id?: (string | null)
4137
4336
  /**
4138
4337
  * Suggested next steps. Always emitted (possibly empty for
4139
4338
  * forward-compat).
@@ -4191,6 +4390,14 @@ col: number
4191
4390
  * Used by the LSP to underline just the specifier, not the entire import line.
4192
4391
  */
4193
4392
  specifier_col: number
4393
+ /**
4394
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4395
+ * `~<k>` suffix when several findings of one type share an identity.
4396
+ * Line and column are not inputs, so the id survives line shifts,
4397
+ * reformats and reorders. A rename of the file or the symbol gives a
4398
+ * new id. Absent in output from older versions.
4399
+ */
4400
+ finding_id?: (string | null)
4194
4401
  /**
4195
4402
  * Suggested next steps. Always emitted (possibly empty for
4196
4403
  * forward-compat).
@@ -4224,6 +4431,14 @@ package_name: string
4224
4431
  * Import sites where this unlisted dependency is used (file path, line, column).
4225
4432
  */
4226
4433
  imported_from: ImportSite[]
4434
+ /**
4435
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4436
+ * `~<k>` suffix when several findings of one type share an identity.
4437
+ * Line and column are not inputs, so the id survives line shifts,
4438
+ * reformats and reorders. A rename of the file or the symbol gives a
4439
+ * new id. Absent in output from older versions.
4440
+ */
4441
+ finding_id?: (string | null)
4227
4442
  /**
4228
4443
  * Suggested next steps. Always emitted (possibly empty for
4229
4444
  * forward-compat).
@@ -4281,6 +4496,14 @@ export_name: string
4281
4496
  * Locations where this export name appears.
4282
4497
  */
4283
4498
  locations: DuplicateLocation[]
4499
+ /**
4500
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4501
+ * `~<k>` suffix when several findings of one type share an identity.
4502
+ * Line and column are not inputs, so the id survives line shifts,
4503
+ * reformats and reorders. A rename of the file or the symbol gives a
4504
+ * new id. Absent in output from older versions.
4505
+ */
4506
+ finding_id?: (string | null)
4284
4507
  /**
4285
4508
  * Suggested next steps. Always emitted (possibly empty for
4286
4509
  * forward-compat).
@@ -4334,6 +4557,14 @@ path: string
4334
4557
  * 1-based line number of the dependency entry in package.json.
4335
4558
  */
4336
4559
  line: number
4560
+ /**
4561
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4562
+ * `~<k>` suffix when several findings of one type share an identity.
4563
+ * Line and column are not inputs, so the id survives line shifts,
4564
+ * reformats and reorders. A rename of the file or the symbol gives a
4565
+ * new id. Absent in output from older versions.
4566
+ */
4567
+ finding_id?: (string | null)
4337
4568
  /**
4338
4569
  * Suggested next steps. Always emitted (possibly empty for
4339
4570
  * forward-compat).
@@ -4371,6 +4602,14 @@ path: string
4371
4602
  * 1-based line number of the dependency entry in package.json.
4372
4603
  */
4373
4604
  line: number
4605
+ /**
4606
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4607
+ * `~<k>` suffix when several findings of one type share an identity.
4608
+ * Line and column are not inputs, so the id survives line shifts,
4609
+ * reformats and reorders. A rename of the file or the symbol gives a
4610
+ * new id. Absent in output from older versions.
4611
+ */
4612
+ finding_id?: (string | null)
4374
4613
  /**
4375
4614
  * Suggested next steps. Always emitted (possibly empty for
4376
4615
  * forward-compat).
@@ -4409,6 +4648,14 @@ path: string
4409
4648
  * 1-based line number of the dependency entry in package.json.
4410
4649
  */
4411
4650
  line: number
4651
+ /**
4652
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4653
+ * `~<k>` suffix when several findings of one type share an identity.
4654
+ * Line and column are not inputs, so the id survives line shifts,
4655
+ * reformats and reorders. A rename of the file or the symbol gives a
4656
+ * new id. Absent in output from older versions.
4657
+ */
4658
+ finding_id?: (string | null)
4412
4659
  /**
4413
4660
  * Suggested next steps. Always emitted (possibly empty for
4414
4661
  * forward-compat).
@@ -4463,6 +4710,14 @@ edges?: CircularDependencyEdge[]
4463
4710
  * Whether this cycle crosses workspace package boundaries.
4464
4711
  */
4465
4712
  is_cross_package?: boolean
4713
+ /**
4714
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4715
+ * `~<k>` suffix when several findings of one type share an identity.
4716
+ * Line and column are not inputs, so the id survives line shifts,
4717
+ * reformats and reorders. A rename of the file or the symbol gives a
4718
+ * new id. Absent in output from older versions.
4719
+ */
4720
+ finding_id?: (string | null)
4466
4721
  /**
4467
4722
  * Suggested next steps. Always emitted (possibly empty for
4468
4723
  * forward-compat).
@@ -4525,6 +4780,14 @@ export interface ReExportCycleFinding {
4525
4780
  */
4526
4781
  files: string[]
4527
4782
  kind: ReExportCycleKind
4783
+ /**
4784
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4785
+ * `~<k>` suffix when several findings of one type share an identity.
4786
+ * Line and column are not inputs, so the id survives line shifts,
4787
+ * reformats and reorders. A rename of the file or the symbol gives a
4788
+ * new id. Absent in output from older versions.
4789
+ */
4790
+ finding_id?: (string | null)
4528
4791
  /**
4529
4792
  * Suggested next steps. Always emitted (possibly empty for
4530
4793
  * forward-compat).
@@ -4543,6 +4806,109 @@ introduced?: (AuditIntroduced | null)
4543
4806
  */
4544
4807
  effective_severity?: (EffectiveSeverity | null)
4545
4808
  }
4809
+ /**
4810
+ * Wire-shape envelope for a [`PackageCycle`] finding. Mirrors
4811
+ * [`CircularDependencyFinding`]: flattens the bare finding and carries a
4812
+ * typed `actions` array (`refactor-cycle` primary plus `suppress-line`
4813
+ * secondary).
4814
+ */
4815
+ export interface PackageCycleFinding {
4816
+ /**
4817
+ * Workspace package labels in cycle order. The first entry is the
4818
+ * lexicographically smallest label; the last entry imports the first.
4819
+ * A label is the package name. When two or more workspace packages
4820
+ * share a name, the label is `name (root)` with the project-relative
4821
+ * package root, so that each label names one package.
4822
+ */
4823
+ packages: string[]
4824
+ /**
4825
+ * Package root directories in cycle order: `package_roots[i]` is the
4826
+ * root of `packages[i]`.
4827
+ */
4828
+ package_roots: string[]
4829
+ /**
4830
+ * Number of packages in the cycle.
4831
+ */
4832
+ length: number
4833
+ /**
4834
+ * One example import per hop, in cycle order: `edges[i]` goes from
4835
+ * `packages[i]` to `packages[(i + 1) % length]`.
4836
+ */
4837
+ edges: PackageCycleEdge[]
4838
+ /**
4839
+ * True when the group of packages that holds this cycle has more
4840
+ * cycles than fallow lists. The listing stops at 20 cycles per group,
4841
+ * or earlier on a very dense package graph. Break a listed cycle and
4842
+ * run again to see the rest.
4843
+ */
4844
+ group_truncated: boolean
4845
+ /**
4846
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4847
+ * `~<k>` suffix when several findings of one type share an identity.
4848
+ * Line and column are not inputs, so the id survives line shifts,
4849
+ * reformats and reorders. A rename of the file or the symbol gives a
4850
+ * new id. Absent in output from older versions.
4851
+ */
4852
+ finding_id?: (string | null)
4853
+ /**
4854
+ * Suggested next steps. Always emitted (possibly empty for
4855
+ * forward-compat).
4856
+ */
4857
+ actions: IssueAction[]
4858
+ /**
4859
+ * Set by the audit pass when this finding is introduced relative to
4860
+ * the merge-base.
4861
+ */
4862
+ introduced?: (AuditIntroduced | null)
4863
+ /**
4864
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4865
+ * resolve for its path. CI formats read it for the annotation, SARIF
4866
+ * and CodeClimate level. Absent in output from older versions. Not
4867
+ * part of the finding identity, baseline keys or fingerprints.
4868
+ */
4869
+ effective_severity?: (EffectiveSeverity | null)
4870
+ }
4871
+ /**
4872
+ * One package hop in a [`PackageCycle`]: `from_package` imports
4873
+ * `to_package`, and `path` holds one example import for that hop.
4874
+ *
4875
+ * The example import is the first runtime import by `(path, line)`. When
4876
+ * every import on the hop is type-only, it is the first type-only import.
4877
+ */
4878
+ export interface PackageCycleEdge {
4879
+ /**
4880
+ * Label of the importing workspace package, as in
4881
+ * [`PackageCycle::packages`].
4882
+ */
4883
+ from_package: string
4884
+ /**
4885
+ * Label of the imported workspace package, as in
4886
+ * [`PackageCycle::packages`].
4887
+ */
4888
+ to_package: string
4889
+ /**
4890
+ * File in `from_package` that holds the example import.
4891
+ */
4892
+ path: string
4893
+ /**
4894
+ * File in `to_package` that the example import resolves to.
4895
+ */
4896
+ target_path: string
4897
+ /**
4898
+ * 1-based line number of the example import.
4899
+ */
4900
+ line: number
4901
+ /**
4902
+ * 0-based byte column offset of the example import.
4903
+ */
4904
+ col: number
4905
+ /**
4906
+ * True when every import from `from_package` to `to_package` is
4907
+ * type-only. A type-only hop has no runtime effect, but it can still
4908
+ * force a build order (for example with declaration builds).
4909
+ */
4910
+ type_only: boolean
4911
+ }
4546
4912
  /**
4547
4913
  * Wire-shape envelope for a [`BoundaryViolation`] finding. Mirrors
4548
4914
  * [`UnusedFileFinding`]: flattens the bare finding and carries a typed
@@ -4555,7 +4921,9 @@ export interface BoundaryViolationFinding {
4555
4921
  */
4556
4922
  from_path: string
4557
4923
  /**
4558
- * The file being imported that violates the boundary.
4924
+ * The file being imported that violates the boundary. When the import
4925
+ * goes through a re-export chain, this is the origin module that
4926
+ * declares the imported symbol, not the barrel.
4559
4927
  */
4560
4928
  to_path: string
4561
4929
  /**
@@ -4578,6 +4946,19 @@ line: number
4578
4946
  * 0-based byte column offset of the import statement.
4579
4947
  */
4580
4948
  col: number
4949
+ /**
4950
+ * The barrel file that the source file imports directly, when the
4951
+ * violation comes from a re-export chain. Absent for a direct import.
4952
+ */
4953
+ via_path?: (string | null)
4954
+ /**
4955
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4956
+ * `~<k>` suffix when several findings of one type share an identity.
4957
+ * Line and column are not inputs, so the id survives line shifts,
4958
+ * reformats and reorders. A rename of the file or the symbol gives a
4959
+ * new id. Absent in output from older versions.
4960
+ */
4961
+ finding_id?: (string | null)
4581
4962
  /**
4582
4963
  * Suggested next steps. Always emitted (possibly empty for
4583
4964
  * forward-compat).
@@ -4614,6 +4995,14 @@ line: number
4614
4995
  * 0-based byte column offset used for diagnostics.
4615
4996
  */
4616
4997
  col: number
4998
+ /**
4999
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5000
+ * `~<k>` suffix when several findings of one type share an identity.
5001
+ * Line and column are not inputs, so the id survives line shifts,
5002
+ * reformats and reorders. A rename of the file or the symbol gives a
5003
+ * new id. Absent in output from older versions.
5004
+ */
5005
+ finding_id?: (string | null)
4617
5006
  /**
4618
5007
  * Suggested next steps.
4619
5008
  */
@@ -4662,6 +5051,14 @@ callee: string
4662
5051
  * consumers can see both the written path and the rule that fired.
4663
5052
  */
4664
5053
  pattern: string
5054
+ /**
5055
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5056
+ * `~<k>` suffix when several findings of one type share an identity.
5057
+ * Line and column are not inputs, so the id survives line shifts,
5058
+ * reformats and reorders. A rename of the file or the symbol gives a
5059
+ * new id. Absent in output from older versions.
5060
+ */
5061
+ finding_id?: (string | null)
4665
5062
  /**
4666
5063
  * Suggested next steps.
4667
5064
  */
@@ -4711,7 +5108,8 @@ kind: PolicyRuleKind
4711
5108
  * What matched: the written callee path for `banned-call` (e.g.
4712
5109
  * `cp.exec`), the raw import specifier for `banned-import` (e.g.
4713
5110
  * `moment/locale/nl`), `<effect>: <callee>` for `banned-effect`, or the
4714
- * exported name for `banned-export`.
5111
+ * exported name for `banned-export`. For `gdp-proof-producer`, the canonical
5112
+ * factory with its JSON-quoted literal label or `...` for a dynamic label.
4715
5113
  */
4716
5114
  matched: string
4717
5115
  severity: PolicyViolationSeverity
@@ -4719,6 +5117,14 @@ severity: PolicyViolationSeverity
4719
5117
  * The rule's author-provided message, when set.
4720
5118
  */
4721
5119
  message?: (string | null)
5120
+ /**
5121
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5122
+ * `~<k>` suffix when several findings of one type share an identity.
5123
+ * Line and column are not inputs, so the id survives line shifts,
5124
+ * reformats and reorders. A rename of the file or the symbol gives a
5125
+ * new id. Absent in output from older versions.
5126
+ */
5127
+ finding_id?: (string | null)
4722
5128
  /**
4723
5129
  * Suggested next steps.
4724
5130
  */
@@ -4751,6 +5157,14 @@ origin: SuppressionOrigin
4751
5157
  * comment or tag that has no reason.
4752
5158
  */
4753
5159
  missing_reason?: boolean
5160
+ /**
5161
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5162
+ * `~<k>` suffix when several findings of one type share an identity.
5163
+ * Line and column are not inputs, so the id survives line shifts,
5164
+ * reformats and reorders. A rename of the file or the symbol gives a
5165
+ * new id. Absent in output from older versions.
5166
+ */
5167
+ finding_id?: (string | null)
4754
5168
  /**
4755
5169
  * Suggested next steps. Always emitted.
4756
5170
  */
@@ -4793,6 +5207,14 @@ line: number
4793
5207
  * output.
4794
5208
  */
4795
5209
  hardcoded_consumers?: string[]
5210
+ /**
5211
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5212
+ * `~<k>` suffix when several findings of one type share an identity.
5213
+ * Line and column are not inputs, so the id survives line shifts,
5214
+ * reformats and reorders. A rename of the file or the symbol gives a
5215
+ * new id. Absent in output from older versions.
5216
+ */
5217
+ finding_id?: (string | null)
4796
5218
  /**
4797
5219
  * Suggested next steps. Always emitted.
4798
5220
  */
@@ -4828,6 +5250,14 @@ path: string
4828
5250
  * 1-based line number of the empty group header within the source file.
4829
5251
  */
4830
5252
  line: number
5253
+ /**
5254
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5255
+ * `~<k>` suffix when several findings of one type share an identity.
5256
+ * Line and column are not inputs, so the id survives line shifts,
5257
+ * reformats and reorders. A rename of the file or the symbol gives a
5258
+ * new id. Absent in output from older versions.
5259
+ */
5260
+ finding_id?: (string | null)
4831
5261
  /**
4832
5262
  * Suggested next steps. Always emitted.
4833
5263
  */
@@ -4884,6 +5314,14 @@ line: number
4884
5314
  * catalog or to add the entry to the named catalog.
4885
5315
  */
4886
5316
  available_in_catalogs?: string[]
5317
+ /**
5318
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5319
+ * `~<k>` suffix when several findings of one type share an identity.
5320
+ * Line and column are not inputs, so the id survives line shifts,
5321
+ * reformats and reorders. A rename of the file or the symbol gives a
5322
+ * new id. Absent in output from older versions.
5323
+ */
5324
+ finding_id?: (string | null)
4887
5325
  /**
4888
5326
  * Suggested next steps. Always emitted; position 0 is the discriminated
4889
5327
  * primary (see struct docs).
@@ -4954,6 +5392,14 @@ line: number
4954
5392
  * use the conservative package-manifest fallback.
4955
5393
  */
4956
5394
  hint?: (string | null)
5395
+ /**
5396
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5397
+ * `~<k>` suffix when several findings of one type share an identity.
5398
+ * Line and column are not inputs, so the id survives line shifts,
5399
+ * reformats and reorders. A rename of the file or the symbol gives a
5400
+ * new id. Absent in output from older versions.
5401
+ */
5402
+ finding_id?: (string | null)
4957
5403
  /**
4958
5404
  * Suggested next steps. Always emitted.
4959
5405
  */
@@ -5010,6 +5456,14 @@ path: string
5010
5456
  * 1-based line number of the entry within the source file.
5011
5457
  */
5012
5458
  line: number
5459
+ /**
5460
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5461
+ * `~<k>` suffix when several findings of one type share an identity.
5462
+ * Line and column are not inputs, so the id survives line shifts,
5463
+ * reformats and reorders. A rename of the file or the symbol gives a
5464
+ * new id. Absent in output from older versions.
5465
+ */
5466
+ finding_id?: (string | null)
5013
5467
  /**
5014
5468
  * Suggested next steps. Always emitted.
5015
5469
  */
@@ -5057,6 +5511,14 @@ line: number
5057
5511
  * 0-based byte column offset of the export.
5058
5512
  */
5059
5513
  col: number
5514
+ /**
5515
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5516
+ * `~<k>` suffix when several findings of one type share an identity.
5517
+ * Line and column are not inputs, so the id survives line shifts,
5518
+ * reformats and reorders. A rename of the file or the symbol gives a
5519
+ * new id. Absent in output from older versions.
5520
+ */
5521
+ finding_id?: (string | null)
5060
5522
  /**
5061
5523
  * Suggested next steps. Always emitted (possibly empty for
5062
5524
  * forward-compat).
@@ -5105,6 +5567,14 @@ line: number
5105
5567
  * 0-based byte column offset of the barrel's first offending re-export.
5106
5568
  */
5107
5569
  col: number
5570
+ /**
5571
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5572
+ * `~<k>` suffix when several findings of one type share an identity.
5573
+ * Line and column are not inputs, so the id survives line shifts,
5574
+ * reformats and reorders. A rename of the file or the symbol gives a
5575
+ * new id. Absent in output from older versions.
5576
+ */
5577
+ finding_id?: (string | null)
5108
5578
  /**
5109
5579
  * Suggested next steps. Always emitted (possibly empty for
5110
5580
  * forward-compat).
@@ -5148,6 +5618,14 @@ line: number
5148
5618
  * 0-based byte column offset of the misplaced directive statement.
5149
5619
  */
5150
5620
  col: number
5621
+ /**
5622
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5623
+ * `~<k>` suffix when several findings of one type share an identity.
5624
+ * Line and column are not inputs, so the id survives line shifts,
5625
+ * reformats and reorders. A rename of the file or the symbol gives a
5626
+ * new id. Absent in output from older versions.
5627
+ */
5628
+ finding_id?: (string | null)
5151
5629
  /**
5152
5630
  * Suggested next steps. Always emitted (possibly empty for
5153
5631
  * forward-compat).
@@ -5193,6 +5671,14 @@ line: number
5193
5671
  * 0-based byte column offset of the inject / getContext call.
5194
5672
  */
5195
5673
  col: number
5674
+ /**
5675
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5676
+ * `~<k>` suffix when several findings of one type share an identity.
5677
+ * Line and column are not inputs, so the id survives line shifts,
5678
+ * reformats and reorders. A rename of the file or the symbol gives a
5679
+ * new id. Absent in output from older versions.
5680
+ */
5681
+ finding_id?: (string | null)
5196
5682
  /**
5197
5683
  * Suggested next steps. Always emitted (possibly empty for
5198
5684
  * forward-compat).
@@ -5249,6 +5735,14 @@ line: number
5249
5735
  * 0-based byte column offset.
5250
5736
  */
5251
5737
  col: number
5738
+ /**
5739
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5740
+ * `~<k>` suffix when several findings of one type share an identity.
5741
+ * Line and column are not inputs, so the id survives line shifts,
5742
+ * reformats and reorders. A rename of the file or the symbol gives a
5743
+ * new id. Absent in output from older versions.
5744
+ */
5745
+ finding_id?: (string | null)
5252
5746
  /**
5253
5747
  * Suggested next steps. Always emitted (possibly empty for
5254
5748
  * forward-compat).
@@ -5298,6 +5792,14 @@ line: number
5298
5792
  * 0-based byte column offset (file-level finding, always 0).
5299
5793
  */
5300
5794
  col: number
5795
+ /**
5796
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5797
+ * `~<k>` suffix when several findings of one type share an identity.
5798
+ * Line and column are not inputs, so the id survives line shifts,
5799
+ * reformats and reorders. A rename of the file or the symbol gives a
5800
+ * new id. Absent in output from older versions.
5801
+ */
5802
+ finding_id?: (string | null)
5301
5803
  /**
5302
5804
  * Suggested next steps. Always emitted (possibly empty for
5303
5805
  * forward-compat).
@@ -5351,6 +5853,14 @@ line: number
5351
5853
  * 0-based byte column offset (file-level finding, always 0).
5352
5854
  */
5353
5855
  col: number
5856
+ /**
5857
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5858
+ * `~<k>` suffix when several findings of one type share an identity.
5859
+ * Line and column are not inputs, so the id survives line shifts,
5860
+ * reformats and reorders. A rename of the file or the symbol gives a
5861
+ * new id. Absent in output from older versions.
5862
+ */
5863
+ finding_id?: (string | null)
5354
5864
  /**
5355
5865
  * Suggested next steps. Always emitted (possibly empty for
5356
5866
  * forward-compat).
@@ -5396,6 +5906,14 @@ line: number
5396
5906
  * 0-based byte column offset of the prop declaration.
5397
5907
  */
5398
5908
  col: number
5909
+ /**
5910
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5911
+ * `~<k>` suffix when several findings of one type share an identity.
5912
+ * Line and column are not inputs, so the id survives line shifts,
5913
+ * reformats and reorders. A rename of the file or the symbol gives a
5914
+ * new id. Absent in output from older versions.
5915
+ */
5916
+ finding_id?: (string | null)
5399
5917
  /**
5400
5918
  * Suggested next steps. Always emitted (possibly empty for
5401
5919
  * forward-compat).
@@ -5414,6 +5932,92 @@ introduced?: (AuditIntroduced | null)
5414
5932
  */
5415
5933
  effective_severity?: (EffectiveSeverity | null)
5416
5934
  }
5935
+ /**
5936
+ * Wire-shape envelope for an [`AbsentComponentProp`] finding. There is no safe
5937
+ * auto-fix: removing a declared prop is judgement-bearing (the prop may be part
5938
+ * of a deliberately-stable public component API). Actions are manual
5939
+ * remediation guidance plus a line-level suppress at the prop declaration.
5940
+ */
5941
+ export interface AbsentComponentPropFinding {
5942
+ /**
5943
+ * Source path of the input declaration.
5944
+ */
5945
+ path: string
5946
+ /**
5947
+ * Semantic declaration name, or SFC filename stem.
5948
+ */
5949
+ component_name: string
5950
+ /**
5951
+ * Public framework token.
5952
+ */
5953
+ framework: string
5954
+ /**
5955
+ * Public optional input name.
5956
+ */
5957
+ prop_name: string
5958
+ /**
5959
+ * 1-based declaration line.
5960
+ */
5961
+ line: number
5962
+ /**
5963
+ * 0-based declaration byte column.
5964
+ */
5965
+ col: number
5966
+ /**
5967
+ * Whether omission has a declared default.
5968
+ */
5969
+ has_default: boolean
5970
+ /**
5971
+ * Every inspected reachable caller, deterministically ordered.
5972
+ */
5973
+ inspected_call_sites: ComponentPropCallSite[]
5974
+ /**
5975
+ * Manual-review meaning and limits of static evidence.
5976
+ */
5977
+ explanation: string
5978
+ /**
5979
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5980
+ * `~<k>` suffix when several findings of one type share an identity.
5981
+ * Line and column are not inputs, so the id survives line shifts,
5982
+ * reformats and reorders. A rename of the file or the symbol gives a
5983
+ * new id. Absent in output from older versions.
5984
+ */
5985
+ finding_id?: (string | null)
5986
+ /**
5987
+ * Suggested next steps. Always emitted (possibly empty for
5988
+ * forward-compat).
5989
+ */
5990
+ actions: IssueAction[]
5991
+ /**
5992
+ * Set by the audit pass when this finding is introduced relative to
5993
+ * the merge-base.
5994
+ */
5995
+ introduced?: (AuditIntroduced | null)
5996
+ /**
5997
+ * Gate severity of this finding after `rules` and `overrides[].rules`
5998
+ * resolve for its path. CI formats read it for the annotation, SARIF
5999
+ * and CodeClimate level. Absent in output from older versions. Not
6000
+ * part of the finding identity, baseline keys or fingerprints.
6001
+ */
6002
+ effective_severity?: (EffectiveSeverity | null)
6003
+ }
6004
+ /**
6005
+ * One inspected reachable component invocation.
6006
+ */
6007
+ export interface ComponentPropCallSite {
6008
+ /**
6009
+ * Caller source path.
6010
+ */
6011
+ path: string
6012
+ /**
6013
+ * 1-based opening-tag line.
6014
+ */
6015
+ line: number
6016
+ /**
6017
+ * 0-based original-source byte column.
6018
+ */
6019
+ col: number
6020
+ }
5417
6021
  /**
5418
6022
  * Wire-shape envelope for an [`UnusedComponentEmit`] finding. There is no safe
5419
6023
  * auto-fix: removing a declared emit is judgement-bearing (the event may be
@@ -5441,6 +6045,14 @@ line: number
5441
6045
  * 0-based byte column offset of the emit declaration.
5442
6046
  */
5443
6047
  col: number
6048
+ /**
6049
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
6050
+ * `~<k>` suffix when several findings of one type share an identity.
6051
+ * Line and column are not inputs, so the id survives line shifts,
6052
+ * reformats and reorders. A rename of the file or the symbol gives a
6053
+ * new id. Absent in output from older versions.
6054
+ */
6055
+ finding_id?: (string | null)
5444
6056
  /**
5445
6057
  * Suggested next steps. Always emitted (possibly empty for
5446
6058
  * forward-compat).
@@ -5486,6 +6098,14 @@ line: number
5486
6098
  * 0-based byte column offset of the input declaration.
5487
6099
  */
5488
6100
  col: number
6101
+ /**
6102
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
6103
+ * `~<k>` suffix when several findings of one type share an identity.
6104
+ * Line and column are not inputs, so the id survives line shifts,
6105
+ * reformats and reorders. A rename of the file or the symbol gives a
6106
+ * new id. Absent in output from older versions.
6107
+ */
6108
+ finding_id?: (string | null)
5489
6109
  /**
5490
6110
  * Suggested next steps. Always emitted (possibly empty for
5491
6111
  * forward-compat).
@@ -5531,6 +6151,14 @@ line: number
5531
6151
  * 0-based byte column offset of the output declaration.
5532
6152
  */
5533
6153
  col: number
6154
+ /**
6155
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
6156
+ * `~<k>` suffix when several findings of one type share an identity.
6157
+ * Line and column are not inputs, so the id survives line shifts,
6158
+ * reformats and reorders. A rename of the file or the symbol gives a
6159
+ * new id. Absent in output from older versions.
6160
+ */
6161
+ finding_id?: (string | null)
5534
6162
  /**
5535
6163
  * Suggested next steps. Always emitted (possibly empty for
5536
6164
  * forward-compat).
@@ -5577,6 +6205,14 @@ line: number
5577
6205
  * 0-based byte column offset of the `dispatch('<name>')` call.
5578
6206
  */
5579
6207
  col: number
6208
+ /**
6209
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
6210
+ * `~<k>` suffix when several findings of one type share an identity.
6211
+ * Line and column are not inputs, so the id survives line shifts,
6212
+ * reformats and reorders. A rename of the file or the symbol gives a
6213
+ * new id. Absent in output from older versions.
6214
+ */
6215
+ finding_id?: (string | null)
5580
6216
  /**
5581
6217
  * Suggested next steps. Always emitted (possibly empty for
5582
6218
  * forward-compat).
@@ -5618,6 +6254,14 @@ line: number
5618
6254
  * 0-based byte column offset of the export.
5619
6255
  */
5620
6256
  col: number
6257
+ /**
6258
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
6259
+ * `~<k>` suffix when several findings of one type share an identity.
6260
+ * Line and column are not inputs, so the id survives line shifts,
6261
+ * reformats and reorders. A rename of the file or the symbol gives a
6262
+ * new id. Absent in output from older versions.
6263
+ */
6264
+ finding_id?: (string | null)
5621
6265
  /**
5622
6266
  * Suggested next steps. Always emitted (possibly empty for
5623
6267
  * forward-compat).
@@ -5665,6 +6309,14 @@ col: number
5665
6309
  * determinable.
5666
6310
  */
5667
6311
  route_dir?: (string | null)
6312
+ /**
6313
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
6314
+ * `~<k>` suffix when several findings of one type share an identity.
6315
+ * Line and column are not inputs, so the id survives line shifts,
6316
+ * reformats and reorders. A rename of the file or the symbol gives a
6317
+ * new id. Absent in output from older versions.
6318
+ */
6319
+ finding_id?: (string | null)
5668
6320
  /**
5669
6321
  * Suggested next steps. Always emitted (possibly empty for
5670
6322
  * forward-compat).
@@ -5706,6 +6358,14 @@ depth: number
5706
6358
  * finding anchor is the first hop (`path` / `line` for suppression + CI).
5707
6359
  */
5708
6360
  hops: PropDrillHop[]
6361
+ /**
6362
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
6363
+ * `~<k>` suffix when several findings of one type share an identity.
6364
+ * Line and column are not inputs, so the id survives line shifts,
6365
+ * reformats and reorders. A rename of the file or the symbol gives a
6366
+ * new id. Absent in output from older versions.
6367
+ */
6368
+ finding_id?: (string | null)
5709
6369
  /**
5710
6370
  * Suggested next steps. Always emitted (possibly empty for
5711
6371
  * forward-compat).
@@ -5771,6 +6431,14 @@ component: string
5771
6431
  * at the render site).
5772
6432
  */
5773
6433
  child_component: string
6434
+ /**
6435
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
6436
+ * `~<k>` suffix when several findings of one type share an identity.
6437
+ * Line and column are not inputs, so the id survives line shifts,
6438
+ * reformats and reorders. A rename of the file or the symbol gives a
6439
+ * new id. Absent in output from older versions.
6440
+ */
6441
+ finding_id?: (string | null)
5774
6442
  /**
5775
6443
  * Suggested next steps. Always emitted (possibly empty for
5776
6444
  * forward-compat).
@@ -5829,6 +6497,14 @@ group_size: number
5829
6497
  * here, because the group is real regardless of suppression.
5830
6498
  */
5831
6499
  sharing_components: DuplicatePropShapeMember[]
6500
+ /**
6501
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
6502
+ * `~<k>` suffix when several findings of one type share an identity.
6503
+ * Line and column are not inputs, so the id survives line shifts,
6504
+ * reformats and reorders. A rename of the file or the symbol gives a
6505
+ * new id. Absent in output from older versions.
6506
+ */
6507
+ finding_id?: (string | null)
5832
6508
  /**
5833
6509
  * Suggested next steps. Always emitted (possibly empty for
5834
6510
  * forward-compat).
@@ -5962,6 +6638,18 @@ stale_entries: number
5962
6638
  * when every entry went unmatched.
5963
6639
  */
5964
6640
  current_findings: number
6641
+ /**
6642
+ * Health only: the number of functions above a complexity threshold that
6643
+ * the baseline does not accept. This is a count of functions, like
6644
+ * `summary.functions_above_threshold`, not a count of baseline entries,
6645
+ * and it is the value before `--top`. A run that does not list the
6646
+ * complexity findings (for example `--score`) still reports it, so a
6647
+ * reader can tell the new functions from the accepted ones.
6648
+ *
6649
+ * `dead-code` and `dupes` do not emit it. An envelope from a fallow
6650
+ * version before this member does not carry it either.
6651
+ */
6652
+ remaining_findings?: (number | null)
5965
6653
  /**
5966
6654
  * True when this run analyzed only part of the project, so a whole-project
5967
6655
  * baseline matches less of it for reasons that are not rot. The channels
@@ -6033,6 +6721,14 @@ unrecognised_format?: boolean
6033
6721
  * uses the same value for its stderr note.
6034
6722
  */
6035
6723
  saved_by?: string
6724
+ /**
6725
+ * `legacy` when the loaded dead-code baseline has no `identity`, so its
6726
+ * entries use the old key forms and some of them hold a line. The run
6727
+ * still applies the file. `--save-baseline` rewrites it with line-free
6728
+ * keys. Absent for a current baseline and on `dupes` and `health`. The
6729
+ * value set is OPEN.
6730
+ */
6731
+ format?: string
6036
6732
  /**
6037
6733
  * Which channels narrowed this run, present and non-empty exactly when
6038
6734
  * `change_scoped` is true. Both members are derived from one function, so
@@ -6050,6 +6746,75 @@ saved_by?: string
6050
6746
  */
6051
6747
  scope_reasons?: ScopeReason[]
6052
6748
  }
6749
+ /**
6750
+ * The result of a `--finding-id` query, present only when the run received
6751
+ * one or more `--finding-id` values.
6752
+ *
6753
+ * A requested id that is missing from a conclusive run means "fixed,
6754
+ * suppressed, or ignored by config", never "unknown": an inline suppression
6755
+ * comment or an `ignoreFindings` entry is a choice a person made to hide the
6756
+ * finding, so it counts as absent. A missing id in a run that is not
6757
+ * conclusive is unknown, never resolved.
6758
+ *
6759
+ * Every list keeps the order of `requested`. `found` and `missing` partition
6760
+ * `requested`. `filtered` is a subset of `missing`.
6761
+ */
6762
+ export interface FindingIdQuery {
6763
+ /**
6764
+ * The requested ids, without duplicates, in the order of the arguments.
6765
+ */
6766
+ requested: string[]
6767
+ /**
6768
+ * The requested ids that this report contains.
6769
+ */
6770
+ found: string[]
6771
+ /**
6772
+ * The requested ids that this report does not contain. When `conclusive`
6773
+ * is true, a missing id is fixed, suppressed, or ignored by config.
6774
+ * Otherwise its state is unknown.
6775
+ */
6776
+ missing: string[]
6777
+ /**
6778
+ * The missing ids that the analysis still found before a filter of this
6779
+ * run (scope, baseline, issue-type filter) removed them. Such a finding
6780
+ * still exists.
6781
+ */
6782
+ filtered: string[]
6783
+ /**
6784
+ * True when no option of this run can hide a finding without a fix, and
6785
+ * no requested id was filtered. Only then does a missing id mean that
6786
+ * the analysis no longer reports the finding.
6787
+ */
6788
+ conclusive: boolean
6789
+ /**
6790
+ * Why the query is not conclusive, sorted. Empty exactly when
6791
+ * `conclusive` is true.
6792
+ */
6793
+ inconclusive_reasons: FindingIdQueryReason[]
6794
+ /**
6795
+ * A stable hash (`af1:<16 hex digits>`) of every input other than the
6796
+ * source code that decides which findings the run reports:
6797
+ * - the fallow version;
6798
+ * - the merged config after `extends` (without keys that only shape other
6799
+ * commands), the loaded external plugins and rule packs;
6800
+ * - production mode, `includeEntryExports`, the effective rules, the
6801
+ * type-aware mode, requirement and project list, the file size limit;
6802
+ * - the root-relative path and content of each repository `.gitignore`,
6803
+ * `.ignore` and `.git/info/exclude`, each `package.json`, each
6804
+ * `tsconfig*.json` and `jsconfig*.json` with the files its `extends`
6805
+ * names, and each file that matches a built-in or external plugin
6806
+ * config pattern (for example `vite.config.ts`).
6807
+ *
6808
+ * File content is normalized (CRLF to LF, trailing newlines removed).
6809
+ * Known exclusions: the global git excludes file and other machine
6810
+ * environment outside the `FALLOW_*` variables. Store the fingerprint
6811
+ * with a verdict. A later query with another fingerprint is unknown, even
6812
+ * when `conclusive` is true. An edit to a source file keeps it; an edit
6813
+ * to a manifest or project config changes it, also when the edit fixes a
6814
+ * dependency finding.
6815
+ */
6816
+ analysis_fingerprint: string
6817
+ }
6053
6818
  /**
6054
6819
  * Result of regression detection (`--fail-on-regression`). Compares current
6055
6820
  * issue counts against a baseline from config or an explicit file.
@@ -6099,9 +6864,11 @@ reason?: (string | null)
6099
6864
  * empty object is never emitted: it would assert that something was asked and
6100
6865
  * all of it applied, which is a different and false claim.
6101
6866
  *
6102
- * The names this build can emit are `changed-since`, `diff-filter` and
6103
- * `sarif-file`. The reasons are `git-missing`, `not-a-repository`,
6104
- * `git-failed` and `invalid-ref` for `changed-since`, `oversize`,
6867
+ * The names this build can emit are `changed-since`, `diff-filter`,
6868
+ * `package-baselines`, `sarif-file` and `group-filter`. The reasons are `git-missing`,
6869
+ * `not-a-repository`, `git-failed` and `invalid-ref` for `changed-since`,
6870
+ * `unknown-workspace`, `git-missing`, `not-a-repository` and `git-failed`
6871
+ * for `package-baselines`, `oversize`,
6105
6872
  * `unreadable`, `not-utf8`, `foreign-namespace` and `ambiguous-base` for
6106
6873
  * `diff-filter`, and `directory-create-failed`, `write-failed` and
6107
6874
  * `serialize-failed` for `sarif-file`. Every set is OPEN: a name a consumer
@@ -6116,9 +6883,11 @@ reason?: (string | null)
6116
6883
  * whole object narrows the report tells its reader an unwritten SARIF file
6117
6884
  * widened the analysis, which is what `affects` exists to prevent.
6118
6885
  *
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
6886
+ * `scope_size` is emitted for `diff-filter`, in added lines, for
6887
+ * `changed-since`, in changed files that the run analyzed, and for
6888
+ * `group-filter`, in groups that the run kept. `package-baselines`
6889
+ * and `sarif-file` measure no scope; the applied package refs travel in
6890
+ * `package_baselines`. A consumer reads the unit off the name, so a name that
6122
6891
  * starts to measure its own scope in a later release needs no change here.
6123
6892
  *
6124
6893
  * `invalid-ref` is reachable only through the programmatic API. The
@@ -6144,7 +6913,9 @@ affects: RequestEffect
6144
6913
  * `changed-since`, the diff source label (`--diff-file pr.diff`,
6145
6914
  * `--diff-stdin`, `$FALLOW_DIFF_FILE build/pr.diff`, or
6146
6915
  * `diffFile pr.diff` for the programmatic option) for `diff-filter`,
6147
- * the target path for `sarif-file`. Echoed rather than normalised, so a
6916
+ * `workspaces.changedSince` for `package-baselines`, the target path for
6917
+ * `sarif-file`, the comma-joined selector patterns for `group-filter`.
6918
+ * Echoed rather than normalised, so a
6148
6919
  * consumer must not join it to the project root the way it joins every
6149
6920
  * other path-shaped field.
6150
6921
  */
@@ -6161,7 +6932,7 @@ requested: string
6161
6932
  * rule dropped does not count, so a change to a README only gives `0`. A
6162
6933
  * combined run counts a file that any of its analyses kept, because a
6163
6934
  * per-analysis `production` setting can give its analyses different
6164
- * files.
6935
+ * files. `group-filter` counts the groups that the run kept.
6165
6936
  * Read the unit off the name the entry is keyed under, never across names,
6166
6937
  * and read an absent member as "not measured" rather than as zero.
6167
6938
  *
@@ -6189,6 +6960,19 @@ reason?: (string | null)
6189
6960
  */
6190
6961
  message?: (string | null)
6191
6962
  }
6963
+ /**
6964
+ * One applied baseline for an exact, project-relative workspace root.
6965
+ */
6966
+ export interface PackageBaselineStatus {
6967
+ /**
6968
+ * Workspace package root, relative to the analysis root with `/` separators.
6969
+ */
6970
+ workspace_root: string
6971
+ /**
6972
+ * Git ref used to select changed files in this package.
6973
+ */
6974
+ reference: string
6975
+ }
6192
6976
  /**
6193
6977
  * A read-only follow-up command fallow surfaces from the current findings,
6194
6978
  * emitted as the top-level `next_steps` array on each command's JSON envelope.
@@ -6365,6 +7149,15 @@ end_col: number
6365
7149
  * wants the source reads it from the file.
6366
7150
  */
6367
7151
  fragment?: string
7152
+ /**
7153
+ * Whether the file path is a symlink, or lies under a symlinked
7154
+ * directory, inside the project root. Omitted when `false`.
7155
+ *
7156
+ * A clone with a symlinked instance can be the same file under two
7157
+ * paths, not copied code. `duplicates.ignoreSymlinks` (or
7158
+ * `fallow dupes --ignore-symlinks`) removes these instances.
7159
+ */
7160
+ is_symlink?: boolean
6368
7161
  }
6369
7162
  /**
6370
7163
  * Per-action wire shape attached to each `CloneGroupFinding` and
@@ -6579,6 +7372,15 @@ export interface HealthReport {
6579
7372
  */
6580
7373
  findings: HealthFinding[]
6581
7374
  summary: HealthSummary
7375
+ /**
7376
+ * The sections that this run produced, in a fixed order. A renderer
7377
+ * reads it to tell an empty section from a section that the run did not
7378
+ * produce: `findings` is the complexity list only when `complexity` is
7379
+ * in this array. The value set is OPEN (see [`HealthSection`]). Absent
7380
+ * in an envelope from a fallow version before this member, and on a
7381
+ * report that no health run built.
7382
+ */
7383
+ sections?: (HealthSection[] | null)
6582
7384
  /**
6583
7385
  * Configured threshold override states. Entries are emitted for active
6584
7386
  * exceptions, stale exceptions, and full-run no-match cleanup hints.
@@ -9015,6 +9817,11 @@ score?: (number | null)
9015
9817
  * Letter grade from the snapshot.
9016
9818
  */
9017
9819
  grade?: (string | null)
9820
+ /**
9821
+ * Formula used for the stored score; absent on legacy snapshots.
9822
+ * A score delta is emitted only when this matches the current score formula.
9823
+ */
9824
+ score_formula_version?: (number | null)
9018
9825
  /**
9019
9826
  * Coverage model used for CRAP computation in this snapshot.
9020
9827
  */
@@ -10842,17 +11649,26 @@ imported_by: string[]
10842
11649
  */
10843
11650
  type_only_imported_by: string[]
10844
11651
  /**
10845
- * Whether the dependency is invoked from package.json scripts or CI configs.
11652
+ * Whether the dependency is invoked from package.json scripts, CI configs
11653
+ * or git hooks.
10846
11654
  */
10847
11655
  used_in_scripts: boolean
10848
11656
  /**
10849
- * Whether the dependency is used at all.
11657
+ * Whether the dependency is used at all: imported, invoked from scripts,
11658
+ * or listed as a peer by a used package (`peer_of`).
10850
11659
  */
10851
11660
  is_used: boolean
10852
11661
  /**
10853
11662
  * Total import count.
10854
11663
  */
10855
11664
  import_count: number
11665
+ /**
11666
+ * Used packages that list this dependency in their installed
11667
+ * `peerDependencies`, required or optional, sorted by name. The
11668
+ * unused-dependency check credits such a peer, because the package that
11669
+ * lists it loads it at runtime. Absent when no used package lists it.
11670
+ */
11671
+ peer_of?: string[]
10856
11672
  /**
10857
11673
  * The configs that declare this name as a Module Federation remote alias
10858
11674
  * under `remotes`, one per config. A remote alias is provided by a
@@ -10860,6 +11676,58 @@ import_count: number
10860
11676
  * Federation config declares the name (issue #2796).
10861
11677
  */
10862
11678
  sources?: TraceSource[]
11679
+ /**
11680
+ * Why the unused devDependency check credits the dependency as tooling
11681
+ * when no file imports it and no script, CI workflow or git hook runs it.
11682
+ * When present, `is_used` is `true`. Absent otherwise.
11683
+ */
11684
+ tooling_credit?: (ToolingCredit | null)
11685
+ /**
11686
+ * The manifests that the unused-dependency check flags for this name,
11687
+ * relative to the project root and sorted. The check reads each
11688
+ * declaring manifest on its own. An import credits the nearest manifest
11689
+ * that installs the package, so a name that one workspace uses can still
11690
+ * be unused in the root manifest or in another workspace. Absent when no
11691
+ * manifest is flagged.
11692
+ */
11693
+ unused_in?: string[]
11694
+ }
11695
+ /**
11696
+ * Why the unused devDependency check counts a dependency as used tooling
11697
+ * although no source file imports it.
11698
+ */
11699
+ export interface ToolingCredit {
11700
+ /**
11701
+ * The evidence: `plugin-config` when the plugin that declares the
11702
+ * dependency found its own config file, `plugin-reference` when a
11703
+ * package.json script, a CI workflow or a git hook runs one of that
11704
+ * plugin's packages, `ambient-types` for a type package that declares
11705
+ * globals, `types-target` when the project declares or imports the
11706
+ * package that a `@types/` package types, `types-config` when a config
11707
+ * file, such as a tsconfig `types` entry, names the type package,
11708
+ * `known-tooling` for a library from the tooling catalogue,
11709
+ * `known-tooling-config` when a command-line tool from the catalogue has
11710
+ * its own config file, and `own-peer` when the same manifest lists the
11711
+ * devDependency in `peerDependencies`. The set is open.
11712
+ */
11713
+ reason: string
11714
+ /**
11715
+ * The plugin that declares the dependency as tooling.
11716
+ */
11717
+ plugin?: (string | null)
11718
+ /**
11719
+ * The config file found, relative to the project root, for
11720
+ * `plugin-config` and `known-tooling-config`. A `package.json` path when
11721
+ * the config is a package.json key. For `own-peer`, the manifest that
11722
+ * lists the dependency.
11723
+ */
11724
+ config?: (string | null)
11725
+ /**
11726
+ * The package that a script, CI workflow or git hook runs, for
11727
+ * `plugin-reference`, or the package that a `@types/` package types,
11728
+ * for `types-target`.
11729
+ */
11730
+ reference?: (string | null)
10863
11731
  }
10864
11732
  /**
10865
11733
  * Result of tracing a clone: all groups containing the code at a source
@@ -11008,7 +11876,8 @@ type_only: boolean
11008
11876
  /**
11009
11877
  * Whether the edge carries a runtime value but no static one: the target
11010
11878
  * 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
11879
+ * on another thread (a worker URL, a worker loader request,
11880
+ * `child_process.fork`). False for a
11012
11881
  * static hop and for a type-only hop.
11013
11882
  */
11014
11883
  dynamic: boolean
@@ -11351,6 +12220,13 @@ body: string
11351
12220
  * Stable finding fingerprint used for comment reconciliation.
11352
12221
  */
11353
12222
  fingerprint: string
12223
+ /**
12224
+ * The fingerprint that an older Fallow release wrote into the
12225
+ * `fallow-fingerprint:v2:` marker of this comment, when it is different
12226
+ * from `fingerprint`. For one release, an existing comment whose marker
12227
+ * holds this value is the same comment. Omitted when equal.
12228
+ */
12229
+ legacy_fingerprint?: (string | null)
11354
12230
  /**
11355
12231
  * True when the body was cut to fit the provider size limit; omitted
11356
12232
  * when false.
@@ -11370,6 +12246,13 @@ position: GitLabReviewPosition
11370
12246
  * Stable finding fingerprint used for comment reconciliation.
11371
12247
  */
11372
12248
  fingerprint: string
12249
+ /**
12250
+ * The fingerprint that an older Fallow release wrote into the
12251
+ * `fallow-fingerprint:v2:` marker of this comment, when it is different
12252
+ * from `fingerprint`. For one release, an existing comment whose marker
12253
+ * holds this value is the same comment. Omitted when equal.
12254
+ */
12255
+ legacy_fingerprint?: (string | null)
11373
12256
  /**
11374
12257
  * True when the body was cut to fit the provider size limit; omitted
11375
12258
  * when false.
@@ -11834,6 +12717,15 @@ elapsed_ms: ElapsedMs
11834
12717
  */
11835
12718
  findings: HealthFinding[]
11836
12719
  summary: HealthSummary
12720
+ /**
12721
+ * The sections that this run produced, in a fixed order. A renderer
12722
+ * reads it to tell an empty section from a section that the run did not
12723
+ * produce: `findings` is the complexity list only when `complexity` is
12724
+ * in this array. The value set is OPEN (see [`HealthSection`]). Absent
12725
+ * in an envelope from a fallow version before this member, and on a
12726
+ * report that no health run built.
12727
+ */
12728
+ sections?: (HealthSection[] | null)
11837
12729
  /**
11838
12730
  * Configured threshold override states. Entries are emitted for active
11839
12731
  * exceptions, stale exceptions, and full-run no-match cleanup hints.
@@ -11958,6 +12850,12 @@ grouped_by?: (GroupByMode | null)
11958
12850
  * Per-bucket recomputed metrics; present only in grouped output.
11959
12851
  */
11960
12852
  groups?: (HealthGroup[] | null)
12853
+ /**
12854
+ * The `--group` selector patterns, as given, when the run kept only some
12855
+ * groups. A group that is not in `groups` was filtered out by this
12856
+ * selector. The project-level sections are not filtered.
12857
+ */
12858
+ group_filter?: (string[] | null)
11961
12859
  /**
11962
12860
  * The verdict of every gate this run evaluated, keyed by name. The CLI
11963
12861
  * always emits it, with the command's default exit rule in it also when
@@ -12007,6 +12905,11 @@ next_steps?: NextStep[]
12007
12905
  * a single invocation. `files_analyzed` and `functions_above_threshold`
12008
12906
  * summarise the subset for parity with the project-level
12009
12907
  * project-level health summary.
12908
+ *
12909
+ * A group carries a per-file list (`findings`, `file_scores`, `hotspots`,
12910
+ * `large_functions`, `targets`) only when the project report shows the same
12911
+ * list. A `--score` run keeps the score and the counts of each group and
12912
+ * omits the lists.
12010
12913
  */
12011
12914
  export interface HealthGroup {
12012
12915
  /**
@@ -12031,9 +12934,37 @@ files_analyzed: number
12031
12934
  * Number of findings in this group, mirroring the project-level
12032
12935
  * `summary.functions_above_threshold` semantics post-baseline /
12033
12936
  * post-`--top` truncation. When `--top` was supplied this reflects the
12034
- * rendered finding count, not the un-truncated total.
12937
+ * rendered finding count of the group, not the un-truncated total.
12035
12938
  */
12036
12939
  functions_above_threshold: number
12940
+ /**
12941
+ * Number of critical-severity findings in this group, after the baseline
12942
+ * filter and before `--top`. The project `summary.severity_critical_count`
12943
+ * counts before the baseline filter, so with `--baseline` the group
12944
+ * counts can add up to less.
12945
+ */
12946
+ severity_critical_count: number
12947
+ /**
12948
+ * Number of high-severity findings in this group, after the baseline
12949
+ * filter and before `--top`. The project `summary.severity_high_count`
12950
+ * counts before the baseline filter, so with `--baseline` the group
12951
+ * counts can add up to less.
12952
+ */
12953
+ severity_high_count: number
12954
+ /**
12955
+ * Number of moderate-severity findings in this group, after the baseline
12956
+ * filter and before `--top`. The project `summary.severity_moderate_count`
12957
+ * counts before the baseline filter, so with `--baseline` the group
12958
+ * counts can add up to less.
12959
+ */
12960
+ severity_moderate_count: number
12961
+ /**
12962
+ * Number of ranked hotspot entries in this group, before `--top`. This
12963
+ * is the length of the group's ranked hotspot list. It is not
12964
+ * `vital_signs.hotspot_count`, which counts only the files with a
12965
+ * hotspot score of 50 or more and feeds the health score.
12966
+ */
12967
+ hotspot_count: number
12037
12968
  /**
12038
12969
  * Whether CRAP findings in this group share a single coverage-source kind
12039
12970
  * (`uniform`) or combine Istanbul / estimated / inherited sources
@@ -12047,9 +12978,24 @@ coverage_source_consistency?: (CoverageSourceConsistency | null)
12047
12978
  vital_signs?: (VitalSigns | null)
12048
12979
  /**
12049
12980
  * Per-group health score recomputed from the per-group vital signs. Absent
12050
- * when --score was not requested.
12981
+ * when --score was not requested. The duplication penalty counts each
12982
+ * clone group with two or more instances in total and one or more in
12983
+ * this group, and counts only the lines of the instances in this group.
12984
+ * A clone that spans two groups thus lowers the score of each group.
12985
+ * `dupes --group-by` assigns each clone group to one owner instead.
12051
12986
  */
12052
12987
  health_score?: (HealthScore | null)
12988
+ /**
12989
+ * Trend of this group against the same group in the baseline snapshot.
12990
+ * Present only when `--trend` or `--trend-from` was requested and the
12991
+ * baseline holds this group with the same `grouped_by` mode.
12992
+ */
12993
+ trend?: (HealthTrend | null)
12994
+ /**
12995
+ * Why `trend` is present or absent. Present only when a trend was
12996
+ * requested and a baseline snapshot was loaded.
12997
+ */
12998
+ trend_status?: (GroupTrendStatus | null)
12053
12999
  /**
12054
13000
  * Findings restricted to files in this group. Each entry is the typed
12055
13001
  * [`HealthFinding`] wrapper around a
@@ -12164,9 +13110,10 @@ baseline_staleness?: (BaselineStaleness | null)
12164
13110
  /**
12165
13111
  * The verdict of every gate this run armed, keyed by name, absent when
12166
13112
  * 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`].
13113
+ * gate always exits 0, so an absent object means that the run passed.
13114
+ * `--fail-on-issues` and `--ci` arm `duplication-findings`, which fails
13115
+ * on any clone group. A gate fails the build when `status` is `fail` AND
13116
+ * `enforced` is true. See [`crate::GateOutcomes`].
12170
13117
  */
12171
13118
  gate_outcomes?: (GateOutcomes | null)
12172
13119
  /**
@@ -12179,6 +13126,10 @@ gate_outcomes?: (GateOutcomes | null)
12179
13126
  * never "nothing failed". See [`crate::RequestOutcomes`].
12180
13127
  */
12181
13128
  request_outcomes?: (RequestOutcomes | null)
13129
+ /**
13130
+ * Applied package Git refs, omitted outside package-baseline runs.
13131
+ */
13132
+ package_baselines?: PackageBaselineStatus[]
12182
13133
  /**
12183
13134
  * `_meta` block with metric / rule definitions, emitted when `--explain`
12184
13135
  * is passed (always present in MCP responses).
@@ -12310,6 +13261,15 @@ end_col: number
12310
13261
  * wants the source reads it from the file.
12311
13262
  */
12312
13263
  fragment?: string
13264
+ /**
13265
+ * Whether the file path is a symlink, or lies under a symlinked
13266
+ * directory, inside the project root. Omitted when `false`.
13267
+ *
13268
+ * A clone with a symlinked instance can be the same file under two
13269
+ * paths, not copied code. `duplicates.ignoreSymlinks` (or
13270
+ * `fallow dupes --ignore-symlinks`) removes these instances.
13271
+ */
13272
+ is_symlink?: boolean
12313
13273
  /**
12314
13274
  * Resolver key for this specific instance (per-instance, not the
12315
13275
  * group-level largest-owner).
@@ -12337,6 +13297,14 @@ total_issues: number
12337
13297
  * One bucket per resolver key.
12338
13298
  */
12339
13299
  groups: CheckGroupedEntry[]
13300
+ /**
13301
+ * `true` when the `unused-load-data-key` detector abstained for the whole
13302
+ * project. The abstain has no file, so it is on the root and not in a
13303
+ * group. An empty `unused_load_data_keys` with this flag set does not
13304
+ * mean the project is clean: the rule could not run safely. Serialized
13305
+ * only when `true`, like the flat `CheckOutput` field.
13306
+ */
13307
+ unused_load_data_keys_global_abstain?: boolean
12340
13308
  /**
12341
13309
  * This run's view of the loaded baseline, present only in baseline runs.
12342
13310
  * Carries the staleness counts, the advisory verdict and `gate_trips`, the
@@ -12346,6 +13314,14 @@ groups: CheckGroupedEntry[]
12346
13314
  * can report `matched_entries: 0` on a healthy baseline.
12347
13315
  */
12348
13316
  baseline_staleness?: (BaselineStaleness | null)
13317
+ /**
13318
+ * The answer to `--finding-id`, present only when the run received one
13319
+ * or more `--finding-id` values. The report then holds only the
13320
+ * requested findings. Read `missing` as resolved only when `conclusive`
13321
+ * is true; a scope, a baseline or a filter can hide a finding that still
13322
+ * exists. See [`crate::FindingIdQuery`].
13323
+ */
13324
+ finding_id_query?: (FindingIdQuery | null)
12349
13325
  /**
12350
13326
  * The verdict of every gate this run evaluated, keyed by name. The CLI
12351
13327
  * always emits it, with the command's default exit rule in it also when
@@ -12366,6 +13342,10 @@ gate_outcomes?: (GateOutcomes | null)
12366
13342
  * never "nothing failed". See [`crate::RequestOutcomes`].
12367
13343
  */
12368
13344
  request_outcomes?: (RequestOutcomes | null)
13345
+ /**
13346
+ * Applied package Git refs, omitted outside package-baseline runs.
13347
+ */
13348
+ package_baselines?: PackageBaselineStatus[]
12369
13349
  /**
12370
13350
  * `_meta` block with docs and rule definitions, when `--explain` was
12371
13351
  * passed.
@@ -12525,6 +13505,12 @@ circular_dependencies: CircularDependencyFinding[]
12525
13505
  * suppression breaks the cycle).
12526
13506
  */
12527
13507
  re_export_cycles?: ReExportCycleFinding[]
13508
+ /**
13509
+ * Dependency cycles between workspace packages, built from resolved
13510
+ * cross-package imports. Wrapped in [`PackageCycleFinding`] so each
13511
+ * entry carries a typed `actions` array natively.
13512
+ */
13513
+ package_cycles?: PackageCycleFinding[]
12528
13514
  /**
12529
13515
  * Imports that cross architecture boundary rules. Wrapped in
12530
13516
  * [`BoundaryViolationFinding`] so each entry carries a typed `actions`
@@ -12657,6 +13643,10 @@ dynamic_segment_name_conflicts?: DynamicSegmentNameConflictFinding[]
12657
13643
  * array natively. Default severity is `warn`.
12658
13644
  */
12659
13645
  unused_component_props?: UnusedComponentPropFinding[]
13646
+ /**
13647
+ * Used optional component inputs absent from inspected reachable callers. Off by default.
13648
+ */
13649
+ absent_component_props?: AbsentComponentPropFinding[]
12660
13650
  /**
12661
13651
  * Vue `<script setup>` `defineEmits` events emitted nowhere in their own SFC
12662
13652
  * (no `emit('<name>')` call). Wrapped in [`UnusedComponentEmitFinding`] so
@@ -13993,9 +14983,13 @@ elapsed_ms: ElapsedMs
13993
14983
  /**
13994
14984
  * The verdict of every gate this run evaluated, keyed by name. The CLI
13995
14985
  * 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`,
14986
+ * (`error-severity-findings`, `health-findings`). Without
14987
+ * `--fail-on-issues` or `--ci`, the machine formats of the combined run
14988
+ * exit 0 for findings, so most entries have `enforced: false`. With one of
14989
+ * these flags, the findings rules and `duplication-threshold` are
14990
+ * `enforced`, the dupes section adds an enforced `duplication-findings`
14991
+ * entry, and every format exits 1 when one fails. For the default
14992
+ * exit rules (`error-severity-findings`,
13999
14993
  * `health-findings`), `status` gives the verdict of the human run. An
14000
14994
  * advisory entry can report `fail` without a failure of the human run: an
14001
14995
  * example is a `stale-baseline` entry that `--fail-on-stale-baseline` did
@@ -14014,6 +15008,11 @@ gate_outcomes?: (GateOutcomes | null)
14014
15008
  * never "nothing failed". See [`crate::RequestOutcomes`].
14015
15009
  */
14016
15010
  request_outcomes?: (RequestOutcomes | null)
15011
+ /**
15012
+ * Applied package Git refs of the `check` and `dupes` sections. The map
15013
+ * does not narrow the `health` section.
15014
+ */
15015
+ package_baselines?: PackageBaselineStatus[]
14017
15016
  /**
14018
15017
  * Per-section `_meta` blocks, when `--explain` was passed.
14019
15018
  */
@@ -16952,6 +17951,16 @@ export type EmptyCatalogGroup = EmptyCatalogGroupFinding;
16952
17951
  */
16953
17952
  export type MisconfiguredDependencyOverride = MisconfiguredDependencyOverrideFinding;
16954
17953
 
17954
+ /**
17955
+ * Backwards-compat alias for the pre-#384 bare `PackageCycle` name.
17956
+ * The wire shape is byte-identical: `PackageCycleFinding` flattens the bare
17957
+ * finding's fields via `#[serde(flatten)]` and adds `actions[]` plus
17958
+ * the optional audit-mode `introduced` flag. Consumers that imported
17959
+ * `PackageCycle` from `fallow/types` pre-migration continue to work via
17960
+ * this alias; new code should prefer `PackageCycleFinding`.
17961
+ */
17962
+ export type PackageCycle = PackageCycleFinding;
17963
+
16955
17964
  /**
16956
17965
  * Backwards-compat alias for the pre-#384 bare `PrivateTypeLeak` name.
16957
17966
  * The wire shape is byte-identical: `PrivateTypeLeakFinding` flattens the bare