fallow 3.29.0 → 3.31.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.
@@ -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
@@ -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
  */
@@ -731,6 +739,27 @@ reason: string
731
739
  kind: "plugin-effect-not-modeled"
732
740
  } | {
733
741
  kind: "coverage-auto-detected"
742
+ } | {
743
+ kind: "flag-age-shallow-clone"
744
+ } | {
745
+ /**
746
+ * Why no history is available, as a kebab-case token:
747
+ * `not-a-repository` or `no-commits`. The set is open.
748
+ */
749
+ cause: string
750
+ kind: "flag-age-unavailable"
751
+ } | {
752
+ /**
753
+ * The `ignoreDependencies` entry, as written in the config.
754
+ */
755
+ pattern: string
756
+ kind: "ignore-dependencies-glob-unmatched"
757
+ } | {
758
+ /**
759
+ * The `ignoreFindings` entry, as written in the config.
760
+ */
761
+ pattern: string
762
+ kind: "ignore-findings-pattern-unmatched"
734
763
  })
735
764
  /**
736
765
  * Discriminant for [`CloneGroupAction::kind`]. Mirrors the action types
@@ -905,6 +934,11 @@ export type RuntimeCoverageVerdict = ("safe_to_delete" | "review_required" | "co
905
934
  * Confidence level for a runtime coverage finding.
906
935
  */
907
936
  export type RuntimeCoverageConfidence = ("very_high" | "high" | "medium" | "low" | "none" | "unknown")
937
+ /**
938
+ * The per-call cost that `optimization_target.cost_score` multiplies with
939
+ * `invocations`.
940
+ */
941
+ export type RuntimeCoverageCostBasis = ("inner_iterations" | "cognitive")
908
942
  /**
909
943
  * Blast-radius risk band. The current thresholds are high at >=20 static
910
944
  * callers or >=1,000,000 traffic-weighted caller reach; medium at >=5 callers
@@ -1301,6 +1335,30 @@ export type FeatureFlagConfidence = ("high" | "medium" | "low")
1301
1335
  * Feature flag action discriminants.
1302
1336
  */
1303
1337
  export type FeatureFlagActionType = ("investigate-flag" | "suppress-line")
1338
+ /**
1339
+ * How the report measures the age of a flag.
1340
+ */
1341
+ export type FlagAgeMode = ("blame" | "pickaxe" | "off")
1342
+ /**
1343
+ * How a retirement row's flag was detected.
1344
+ */
1345
+ export type RetirementFlagKind = ("environment_variable" | "sdk_call" | "config_object" | "constant" | "vendor_export")
1346
+ /**
1347
+ * What a site does with the flag.
1348
+ */
1349
+ export type FlagSiteRole = ("read" | "definition")
1350
+ /**
1351
+ * Why a flag is a retirement candidate.
1352
+ */
1353
+ 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")
1354
+ /**
1355
+ * Action discriminants for a retirement row.
1356
+ */
1357
+ export type RetirementActionType = "review-retirement"
1358
+ /**
1359
+ * State of a flag in a `--flag-state` vendor export.
1360
+ */
1361
+ export type VendorFlagState = ("on" | "off" | "rolled_out" | "archived" | "experiment")
1304
1362
  /**
1305
1363
  * Independently-versioned wire-version newtype for the brief envelope.
1306
1364
  * Serializes as the integer `REVIEW_BRIEF_SCHEMA_VERSION`.
@@ -1629,7 +1687,7 @@ duplication_demoted: number
1629
1687
  * gate and leaves the object absent.
1630
1688
  *
1631
1689
  * The names this build can emit are `error-severity-findings`, `regression`,
1632
- * `stale-baseline`, `duplication-threshold`, `health-min-score`,
1690
+ * `stale-baseline`, `baseline-growth`, `duplication-threshold`, `health-min-score`,
1633
1691
  * `health-min-severity`, `health-findings`, `health-coverage-gaps`,
1634
1692
  * `health-runtime-coverage`, `security`, `security-advisory`, `audit-verdict`,
1635
1693
  * `type-aware-require` and `parse-error`. The set is OPEN: a name a consumer does not
@@ -1661,7 +1719,7 @@ status: GateStatus
1661
1719
  * True when a `fail` from this gate makes the run exit non-zero. False
1662
1720
  * when the verdict is published for information only: the gate was never
1663
1721
  * armed, the run was told never to fail, or the combined machine formats
1664
- * exit 0 for the gate.
1722
+ * exit 0 for the gate (bare `fallow` without `--fail-on-issues`).
1665
1723
  */
1666
1724
  enforced: boolean
1667
1725
  /**
@@ -2780,6 +2838,12 @@ circular_dependencies: CircularDependencyFinding[]
2780
2838
  * suppression breaks the cycle).
2781
2839
  */
2782
2840
  re_export_cycles?: ReExportCycleFinding[]
2841
+ /**
2842
+ * Dependency cycles between workspace packages, built from resolved
2843
+ * cross-package imports. Wrapped in [`PackageCycleFinding`] so each
2844
+ * entry carries a typed `actions` array natively.
2845
+ */
2846
+ package_cycles?: PackageCycleFinding[]
2783
2847
  /**
2784
2848
  * Imports that cross architecture boundary rules. Wrapped in
2785
2849
  * [`BoundaryViolationFinding`] so each entry carries a typed `actions`
@@ -3008,6 +3072,14 @@ baseline?: (BaselineMatch | null)
3008
3072
  * can report `matched_entries: 0` on a healthy baseline.
3009
3073
  */
3010
3074
  baseline_staleness?: (BaselineStaleness | null)
3075
+ /**
3076
+ * The answer to `--finding-id`, present only when the run received one
3077
+ * or more `--finding-id` values. The report then holds only the
3078
+ * requested findings. Read `missing` as resolved only when `conclusive`
3079
+ * is true; a scope, a baseline or a filter can hide a finding that still
3080
+ * exists. See [`crate::FindingIdQuery`].
3081
+ */
3082
+ finding_id_query?: (FindingIdQuery | null)
3011
3083
  /**
3012
3084
  * Regression verdict against the baseline, in `--fail-on-regression` runs.
3013
3085
  */
@@ -3032,6 +3104,11 @@ gate_outcomes?: (GateOutcomes | null)
3032
3104
  * never "nothing failed". See [`crate::RequestOutcomes`].
3033
3105
  */
3034
3106
  request_outcomes?: (RequestOutcomes | null)
3107
+ /**
3108
+ * Applied Git refs for exact workspace packages. Absent when no package
3109
+ * baselines were selected, including runs with a global changed-since ref.
3110
+ */
3111
+ package_baselines?: PackageBaselineStatus[]
3035
3112
  /**
3036
3113
  * `_meta` block with docs and rule definitions, when `--explain` was
3037
3114
  * passed.
@@ -3052,7 +3129,10 @@ _meta?: (Meta | null)
3052
3129
  * detectors: `malformed-pnpm-workspace-yaml`,
3053
3130
  * `bun-lockb-override-resolution-skipped`;
3054
3131
  * - framework plugins, while they read their own build configs:
3055
- * `plugin-config-unreadable`, `plugin-effect-not-modeled`.
3132
+ * `plugin-config-unreadable`, `plugin-effect-not-modeled`;
3133
+ * - the dead-code result, for config patterns that matched nothing:
3134
+ * `ignore-dependencies-glob-unmatched`,
3135
+ * `ignore-findings-pattern-unmatched`.
3056
3136
  *
3057
3137
  * Analysis-stage and plugin-stage kinds therefore reach only the envelopes
3058
3138
  * whose run includes a dead-code analyze pass, never a standalone
@@ -3234,6 +3314,10 @@ circular_dependencies: number
3234
3314
  * re-exporting from each other in a loop).
3235
3315
  */
3236
3316
  re_export_cycles?: number
3317
+ /**
3318
+ * Dependency cycles between workspace packages.
3319
+ */
3320
+ package_cycles?: number
3237
3321
  /**
3238
3322
  * Imports that cross architecture boundary rules.
3239
3323
  */
@@ -3313,6 +3397,14 @@ export interface UnusedFileFinding {
3313
3397
  * Absolute path to the unused file.
3314
3398
  */
3315
3399
  path: string
3400
+ /**
3401
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
3402
+ * `~<k>` suffix when several findings of one type share an identity.
3403
+ * Line and column are not inputs, so the id survives line shifts,
3404
+ * reformats and reorders. A rename of the file or the symbol gives a
3405
+ * new id. Absent in output from older versions.
3406
+ */
3407
+ finding_id?: (string | null)
3316
3408
  /**
3317
3409
  * Suggested next steps: a `delete-file` primary and a `suppress-file`
3318
3410
  * secondary. Always emitted (possibly empty for forward-compat).
@@ -3544,6 +3636,14 @@ deprecated?: boolean
3544
3636
  * not deprecated or the tag carries no text.
3545
3637
  */
3546
3638
  deprecated_reason?: (string | null)
3639
+ /**
3640
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
3641
+ * `~<k>` suffix when several findings of one type share an identity.
3642
+ * Line and column are not inputs, so the id survives line shifts,
3643
+ * reformats and reorders. A rename of the file or the symbol gives a
3644
+ * new id. Absent in output from older versions.
3645
+ */
3646
+ finding_id?: (string | null)
3547
3647
  /**
3548
3648
  * Suggested next steps. Always emitted (possibly empty for
3549
3649
  * forward-compat).
@@ -3619,6 +3719,14 @@ deprecated?: boolean
3619
3719
  * not deprecated or the tag carries no text.
3620
3720
  */
3621
3721
  deprecated_reason?: (string | null)
3722
+ /**
3723
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
3724
+ * `~<k>` suffix when several findings of one type share an identity.
3725
+ * Line and column are not inputs, so the id survives line shifts,
3726
+ * reformats and reorders. A rename of the file or the symbol gives a
3727
+ * new id. Absent in output from older versions.
3728
+ */
3729
+ finding_id?: (string | null)
3622
3730
  /**
3623
3731
  * Suggested next steps. Always emitted (possibly empty for
3624
3732
  * forward-compat).
@@ -3684,6 +3792,14 @@ span_start: number
3684
3792
  * package-public leak across files or re-exports.
3685
3793
  */
3686
3794
  semantic?: (SemanticPrivateTypeLeak | null)
3795
+ /**
3796
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
3797
+ * `~<k>` suffix when several findings of one type share an identity.
3798
+ * Line and column are not inputs, so the id survives line shifts,
3799
+ * reformats and reorders. A rename of the file or the symbol gives a
3800
+ * new id. Absent in output from older versions.
3801
+ */
3802
+ finding_id?: (string | null)
3687
3803
  /**
3688
3804
  * Suggested next steps. Always emitted (possibly empty for
3689
3805
  * forward-compat).
@@ -3756,6 +3872,14 @@ consumers: DeprecatedExportConsumer[]
3756
3872
  * are not visible, so the finding makes no removal claim.
3757
3873
  */
3758
3874
  public_api: boolean
3875
+ /**
3876
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
3877
+ * `~<k>` suffix when several findings of one type share an identity.
3878
+ * Line and column are not inputs, so the id survives line shifts,
3879
+ * reformats and reorders. A rename of the file or the symbol gives a
3880
+ * new id. Absent in output from older versions.
3881
+ */
3882
+ finding_id?: (string | null)
3759
3883
  /**
3760
3884
  * Suggested next steps. Always emitted (possibly empty for
3761
3885
  * forward-compat).
@@ -3818,6 +3942,14 @@ line: number
3818
3942
  * Workspace roots that import this package even though the declaring workspace does not.
3819
3943
  */
3820
3944
  used_in_workspaces?: string[]
3945
+ /**
3946
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
3947
+ * `~<k>` suffix when several findings of one type share an identity.
3948
+ * Line and column are not inputs, so the id survives line shifts,
3949
+ * reformats and reorders. A rename of the file or the symbol gives a
3950
+ * new id. Absent in output from older versions.
3951
+ */
3952
+ finding_id?: (string | null)
3821
3953
  /**
3822
3954
  * Suggested next steps. Always emitted (possibly empty for
3823
3955
  * forward-compat).
@@ -3871,6 +4003,14 @@ line: number
3871
4003
  * Workspace roots that import this package even though the declaring workspace does not.
3872
4004
  */
3873
4005
  used_in_workspaces?: string[]
4006
+ /**
4007
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4008
+ * `~<k>` suffix when several findings of one type share an identity.
4009
+ * Line and column are not inputs, so the id survives line shifts,
4010
+ * reformats and reorders. A rename of the file or the symbol gives a
4011
+ * new id. Absent in output from older versions.
4012
+ */
4013
+ finding_id?: (string | null)
3874
4014
  /**
3875
4015
  * Suggested next steps. Always emitted (possibly empty for
3876
4016
  * forward-compat).
@@ -3924,6 +4064,14 @@ line: number
3924
4064
  * Workspace roots that import this package even though the declaring workspace does not.
3925
4065
  */
3926
4066
  used_in_workspaces?: string[]
4067
+ /**
4068
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4069
+ * `~<k>` suffix when several findings of one type share an identity.
4070
+ * Line and column are not inputs, so the id survives line shifts,
4071
+ * reformats and reorders. A rename of the file or the symbol gives a
4072
+ * new id. Absent in output from older versions.
4073
+ */
4074
+ finding_id?: (string | null)
3927
4075
  /**
3928
4076
  * Suggested next steps. Always emitted (possibly empty for
3929
4077
  * forward-compat).
@@ -3977,6 +4125,14 @@ line: number
3977
4125
  * 0-based byte column offset.
3978
4126
  */
3979
4127
  col: number
4128
+ /**
4129
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4130
+ * `~<k>` suffix when several findings of one type share an identity.
4131
+ * Line and column are not inputs, so the id survives line shifts,
4132
+ * reformats and reorders. A rename of the file or the symbol gives a
4133
+ * new id. Absent in output from older versions.
4134
+ */
4135
+ finding_id?: (string | null)
3980
4136
  /**
3981
4137
  * Suggested next steps. Always emitted (possibly empty for
3982
4138
  * forward-compat).
@@ -4032,6 +4188,14 @@ line: number
4032
4188
  * 0-based byte column offset.
4033
4189
  */
4034
4190
  col: number
4191
+ /**
4192
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4193
+ * `~<k>` suffix when several findings of one type share an identity.
4194
+ * Line and column are not inputs, so the id survives line shifts,
4195
+ * reformats and reorders. A rename of the file or the symbol gives a
4196
+ * new id. Absent in output from older versions.
4197
+ */
4198
+ finding_id?: (string | null)
4035
4199
  /**
4036
4200
  * Suggested next steps. Always emitted (possibly empty for
4037
4201
  * forward-compat).
@@ -4096,6 +4260,14 @@ line: number
4096
4260
  * 0-based byte column offset.
4097
4261
  */
4098
4262
  col: number
4263
+ /**
4264
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4265
+ * `~<k>` suffix when several findings of one type share an identity.
4266
+ * Line and column are not inputs, so the id survives line shifts,
4267
+ * reformats and reorders. A rename of the file or the symbol gives a
4268
+ * new id. Absent in output from older versions.
4269
+ */
4270
+ finding_id?: (string | null)
4099
4271
  /**
4100
4272
  * Suggested next steps. Always emitted (possibly empty for
4101
4273
  * forward-compat).
@@ -4153,6 +4325,14 @@ col: number
4153
4325
  * Used by the LSP to underline just the specifier, not the entire import line.
4154
4326
  */
4155
4327
  specifier_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)
4156
4336
  /**
4157
4337
  * Suggested next steps. Always emitted (possibly empty for
4158
4338
  * forward-compat).
@@ -4186,6 +4366,14 @@ package_name: string
4186
4366
  * Import sites where this unlisted dependency is used (file path, line, column).
4187
4367
  */
4188
4368
  imported_from: ImportSite[]
4369
+ /**
4370
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4371
+ * `~<k>` suffix when several findings of one type share an identity.
4372
+ * Line and column are not inputs, so the id survives line shifts,
4373
+ * reformats and reorders. A rename of the file or the symbol gives a
4374
+ * new id. Absent in output from older versions.
4375
+ */
4376
+ finding_id?: (string | null)
4189
4377
  /**
4190
4378
  * Suggested next steps. Always emitted (possibly empty for
4191
4379
  * forward-compat).
@@ -4243,6 +4431,14 @@ export_name: string
4243
4431
  * Locations where this export name appears.
4244
4432
  */
4245
4433
  locations: DuplicateLocation[]
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)
4246
4442
  /**
4247
4443
  * Suggested next steps. Always emitted (possibly empty for
4248
4444
  * forward-compat).
@@ -4296,6 +4492,14 @@ path: string
4296
4492
  * 1-based line number of the dependency entry in package.json.
4297
4493
  */
4298
4494
  line: number
4495
+ /**
4496
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4497
+ * `~<k>` suffix when several findings of one type share an identity.
4498
+ * Line and column are not inputs, so the id survives line shifts,
4499
+ * reformats and reorders. A rename of the file or the symbol gives a
4500
+ * new id. Absent in output from older versions.
4501
+ */
4502
+ finding_id?: (string | null)
4299
4503
  /**
4300
4504
  * Suggested next steps. Always emitted (possibly empty for
4301
4505
  * forward-compat).
@@ -4333,6 +4537,14 @@ path: string
4333
4537
  * 1-based line number of the dependency entry in package.json.
4334
4538
  */
4335
4539
  line: number
4540
+ /**
4541
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4542
+ * `~<k>` suffix when several findings of one type share an identity.
4543
+ * Line and column are not inputs, so the id survives line shifts,
4544
+ * reformats and reorders. A rename of the file or the symbol gives a
4545
+ * new id. Absent in output from older versions.
4546
+ */
4547
+ finding_id?: (string | null)
4336
4548
  /**
4337
4549
  * Suggested next steps. Always emitted (possibly empty for
4338
4550
  * forward-compat).
@@ -4371,6 +4583,14 @@ path: string
4371
4583
  * 1-based line number of the dependency entry in package.json.
4372
4584
  */
4373
4585
  line: number
4586
+ /**
4587
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4588
+ * `~<k>` suffix when several findings of one type share an identity.
4589
+ * Line and column are not inputs, so the id survives line shifts,
4590
+ * reformats and reorders. A rename of the file or the symbol gives a
4591
+ * new id. Absent in output from older versions.
4592
+ */
4593
+ finding_id?: (string | null)
4374
4594
  /**
4375
4595
  * Suggested next steps. Always emitted (possibly empty for
4376
4596
  * forward-compat).
@@ -4425,6 +4645,14 @@ edges?: CircularDependencyEdge[]
4425
4645
  * Whether this cycle crosses workspace package boundaries.
4426
4646
  */
4427
4647
  is_cross_package?: boolean
4648
+ /**
4649
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4650
+ * `~<k>` suffix when several findings of one type share an identity.
4651
+ * Line and column are not inputs, so the id survives line shifts,
4652
+ * reformats and reorders. A rename of the file or the symbol gives a
4653
+ * new id. Absent in output from older versions.
4654
+ */
4655
+ finding_id?: (string | null)
4428
4656
  /**
4429
4657
  * Suggested next steps. Always emitted (possibly empty for
4430
4658
  * forward-compat).
@@ -4487,6 +4715,14 @@ export interface ReExportCycleFinding {
4487
4715
  */
4488
4716
  files: string[]
4489
4717
  kind: ReExportCycleKind
4718
+ /**
4719
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4720
+ * `~<k>` suffix when several findings of one type share an identity.
4721
+ * Line and column are not inputs, so the id survives line shifts,
4722
+ * reformats and reorders. A rename of the file or the symbol gives a
4723
+ * new id. Absent in output from older versions.
4724
+ */
4725
+ finding_id?: (string | null)
4490
4726
  /**
4491
4727
  * Suggested next steps. Always emitted (possibly empty for
4492
4728
  * forward-compat).
@@ -4505,6 +4741,109 @@ introduced?: (AuditIntroduced | null)
4505
4741
  */
4506
4742
  effective_severity?: (EffectiveSeverity | null)
4507
4743
  }
4744
+ /**
4745
+ * Wire-shape envelope for a [`PackageCycle`] finding. Mirrors
4746
+ * [`CircularDependencyFinding`]: flattens the bare finding and carries a
4747
+ * typed `actions` array (`refactor-cycle` primary plus `suppress-line`
4748
+ * secondary).
4749
+ */
4750
+ export interface PackageCycleFinding {
4751
+ /**
4752
+ * Workspace package labels in cycle order. The first entry is the
4753
+ * lexicographically smallest label; the last entry imports the first.
4754
+ * A label is the package name. When two or more workspace packages
4755
+ * share a name, the label is `name (root)` with the project-relative
4756
+ * package root, so that each label names one package.
4757
+ */
4758
+ packages: string[]
4759
+ /**
4760
+ * Package root directories in cycle order: `package_roots[i]` is the
4761
+ * root of `packages[i]`.
4762
+ */
4763
+ package_roots: string[]
4764
+ /**
4765
+ * Number of packages in the cycle.
4766
+ */
4767
+ length: number
4768
+ /**
4769
+ * One example import per hop, in cycle order: `edges[i]` goes from
4770
+ * `packages[i]` to `packages[(i + 1) % length]`.
4771
+ */
4772
+ edges: PackageCycleEdge[]
4773
+ /**
4774
+ * True when the group of packages that holds this cycle has more
4775
+ * cycles than fallow lists. The listing stops at 20 cycles per group,
4776
+ * or earlier on a very dense package graph. Break a listed cycle and
4777
+ * run again to see the rest.
4778
+ */
4779
+ group_truncated: boolean
4780
+ /**
4781
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4782
+ * `~<k>` suffix when several findings of one type share an identity.
4783
+ * Line and column are not inputs, so the id survives line shifts,
4784
+ * reformats and reorders. A rename of the file or the symbol gives a
4785
+ * new id. Absent in output from older versions.
4786
+ */
4787
+ finding_id?: (string | null)
4788
+ /**
4789
+ * Suggested next steps. Always emitted (possibly empty for
4790
+ * forward-compat).
4791
+ */
4792
+ actions: IssueAction[]
4793
+ /**
4794
+ * Set by the audit pass when this finding is introduced relative to
4795
+ * the merge-base.
4796
+ */
4797
+ introduced?: (AuditIntroduced | null)
4798
+ /**
4799
+ * Gate severity of this finding after `rules` and `overrides[].rules`
4800
+ * resolve for its path. CI formats read it for the annotation, SARIF
4801
+ * and CodeClimate level. Absent in output from older versions. Not
4802
+ * part of the finding identity, baseline keys or fingerprints.
4803
+ */
4804
+ effective_severity?: (EffectiveSeverity | null)
4805
+ }
4806
+ /**
4807
+ * One package hop in a [`PackageCycle`]: `from_package` imports
4808
+ * `to_package`, and `path` holds one example import for that hop.
4809
+ *
4810
+ * The example import is the first runtime import by `(path, line)`. When
4811
+ * every import on the hop is type-only, it is the first type-only import.
4812
+ */
4813
+ export interface PackageCycleEdge {
4814
+ /**
4815
+ * Label of the importing workspace package, as in
4816
+ * [`PackageCycle::packages`].
4817
+ */
4818
+ from_package: string
4819
+ /**
4820
+ * Label of the imported workspace package, as in
4821
+ * [`PackageCycle::packages`].
4822
+ */
4823
+ to_package: string
4824
+ /**
4825
+ * File in `from_package` that holds the example import.
4826
+ */
4827
+ path: string
4828
+ /**
4829
+ * File in `to_package` that the example import resolves to.
4830
+ */
4831
+ target_path: string
4832
+ /**
4833
+ * 1-based line number of the example import.
4834
+ */
4835
+ line: number
4836
+ /**
4837
+ * 0-based byte column offset of the example import.
4838
+ */
4839
+ col: number
4840
+ /**
4841
+ * True when every import from `from_package` to `to_package` is
4842
+ * type-only. A type-only hop has no runtime effect, but it can still
4843
+ * force a build order (for example with declaration builds).
4844
+ */
4845
+ type_only: boolean
4846
+ }
4508
4847
  /**
4509
4848
  * Wire-shape envelope for a [`BoundaryViolation`] finding. Mirrors
4510
4849
  * [`UnusedFileFinding`]: flattens the bare finding and carries a typed
@@ -4517,7 +4856,9 @@ export interface BoundaryViolationFinding {
4517
4856
  */
4518
4857
  from_path: string
4519
4858
  /**
4520
- * The file being imported that violates the boundary.
4859
+ * The file being imported that violates the boundary. When the import
4860
+ * goes through a re-export chain, this is the origin module that
4861
+ * declares the imported symbol, not the barrel.
4521
4862
  */
4522
4863
  to_path: string
4523
4864
  /**
@@ -4540,6 +4881,19 @@ line: number
4540
4881
  * 0-based byte column offset of the import statement.
4541
4882
  */
4542
4883
  col: number
4884
+ /**
4885
+ * The barrel file that the source file imports directly, when the
4886
+ * violation comes from a re-export chain. Absent for a direct import.
4887
+ */
4888
+ via_path?: (string | null)
4889
+ /**
4890
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4891
+ * `~<k>` suffix when several findings of one type share an identity.
4892
+ * Line and column are not inputs, so the id survives line shifts,
4893
+ * reformats and reorders. A rename of the file or the symbol gives a
4894
+ * new id. Absent in output from older versions.
4895
+ */
4896
+ finding_id?: (string | null)
4543
4897
  /**
4544
4898
  * Suggested next steps. Always emitted (possibly empty for
4545
4899
  * forward-compat).
@@ -4576,6 +4930,14 @@ line: number
4576
4930
  * 0-based byte column offset used for diagnostics.
4577
4931
  */
4578
4932
  col: number
4933
+ /**
4934
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4935
+ * `~<k>` suffix when several findings of one type share an identity.
4936
+ * Line and column are not inputs, so the id survives line shifts,
4937
+ * reformats and reorders. A rename of the file or the symbol gives a
4938
+ * new id. Absent in output from older versions.
4939
+ */
4940
+ finding_id?: (string | null)
4579
4941
  /**
4580
4942
  * Suggested next steps.
4581
4943
  */
@@ -4624,6 +4986,14 @@ callee: string
4624
4986
  * consumers can see both the written path and the rule that fired.
4625
4987
  */
4626
4988
  pattern: string
4989
+ /**
4990
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
4991
+ * `~<k>` suffix when several findings of one type share an identity.
4992
+ * Line and column are not inputs, so the id survives line shifts,
4993
+ * reformats and reorders. A rename of the file or the symbol gives a
4994
+ * new id. Absent in output from older versions.
4995
+ */
4996
+ finding_id?: (string | null)
4627
4997
  /**
4628
4998
  * Suggested next steps.
4629
4999
  */
@@ -4681,6 +5051,14 @@ severity: PolicyViolationSeverity
4681
5051
  * The rule's author-provided message, when set.
4682
5052
  */
4683
5053
  message?: (string | null)
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)
4684
5062
  /**
4685
5063
  * Suggested next steps.
4686
5064
  */
@@ -4713,6 +5091,14 @@ origin: SuppressionOrigin
4713
5091
  * comment or tag that has no reason.
4714
5092
  */
4715
5093
  missing_reason?: boolean
5094
+ /**
5095
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5096
+ * `~<k>` suffix when several findings of one type share an identity.
5097
+ * Line and column are not inputs, so the id survives line shifts,
5098
+ * reformats and reorders. A rename of the file or the symbol gives a
5099
+ * new id. Absent in output from older versions.
5100
+ */
5101
+ finding_id?: (string | null)
4716
5102
  /**
4717
5103
  * Suggested next steps. Always emitted.
4718
5104
  */
@@ -4755,6 +5141,14 @@ line: number
4755
5141
  * output.
4756
5142
  */
4757
5143
  hardcoded_consumers?: string[]
5144
+ /**
5145
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5146
+ * `~<k>` suffix when several findings of one type share an identity.
5147
+ * Line and column are not inputs, so the id survives line shifts,
5148
+ * reformats and reorders. A rename of the file or the symbol gives a
5149
+ * new id. Absent in output from older versions.
5150
+ */
5151
+ finding_id?: (string | null)
4758
5152
  /**
4759
5153
  * Suggested next steps. Always emitted.
4760
5154
  */
@@ -4790,6 +5184,14 @@ path: string
4790
5184
  * 1-based line number of the empty group header within the source file.
4791
5185
  */
4792
5186
  line: number
5187
+ /**
5188
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5189
+ * `~<k>` suffix when several findings of one type share an identity.
5190
+ * Line and column are not inputs, so the id survives line shifts,
5191
+ * reformats and reorders. A rename of the file or the symbol gives a
5192
+ * new id. Absent in output from older versions.
5193
+ */
5194
+ finding_id?: (string | null)
4793
5195
  /**
4794
5196
  * Suggested next steps. Always emitted.
4795
5197
  */
@@ -4846,6 +5248,14 @@ line: number
4846
5248
  * catalog or to add the entry to the named catalog.
4847
5249
  */
4848
5250
  available_in_catalogs?: string[]
5251
+ /**
5252
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5253
+ * `~<k>` suffix when several findings of one type share an identity.
5254
+ * Line and column are not inputs, so the id survives line shifts,
5255
+ * reformats and reorders. A rename of the file or the symbol gives a
5256
+ * new id. Absent in output from older versions.
5257
+ */
5258
+ finding_id?: (string | null)
4849
5259
  /**
4850
5260
  * Suggested next steps. Always emitted; position 0 is the discriminated
4851
5261
  * primary (see struct docs).
@@ -4916,6 +5326,14 @@ line: number
4916
5326
  * use the conservative package-manifest fallback.
4917
5327
  */
4918
5328
  hint?: (string | null)
5329
+ /**
5330
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5331
+ * `~<k>` suffix when several findings of one type share an identity.
5332
+ * Line and column are not inputs, so the id survives line shifts,
5333
+ * reformats and reorders. A rename of the file or the symbol gives a
5334
+ * new id. Absent in output from older versions.
5335
+ */
5336
+ finding_id?: (string | null)
4919
5337
  /**
4920
5338
  * Suggested next steps. Always emitted.
4921
5339
  */
@@ -4972,6 +5390,14 @@ path: string
4972
5390
  * 1-based line number of the entry within the source file.
4973
5391
  */
4974
5392
  line: number
5393
+ /**
5394
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5395
+ * `~<k>` suffix when several findings of one type share an identity.
5396
+ * Line and column are not inputs, so the id survives line shifts,
5397
+ * reformats and reorders. A rename of the file or the symbol gives a
5398
+ * new id. Absent in output from older versions.
5399
+ */
5400
+ finding_id?: (string | null)
4975
5401
  /**
4976
5402
  * Suggested next steps. Always emitted.
4977
5403
  */
@@ -5019,6 +5445,14 @@ line: number
5019
5445
  * 0-based byte column offset of the export.
5020
5446
  */
5021
5447
  col: number
5448
+ /**
5449
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5450
+ * `~<k>` suffix when several findings of one type share an identity.
5451
+ * Line and column are not inputs, so the id survives line shifts,
5452
+ * reformats and reorders. A rename of the file or the symbol gives a
5453
+ * new id. Absent in output from older versions.
5454
+ */
5455
+ finding_id?: (string | null)
5022
5456
  /**
5023
5457
  * Suggested next steps. Always emitted (possibly empty for
5024
5458
  * forward-compat).
@@ -5067,6 +5501,14 @@ line: number
5067
5501
  * 0-based byte column offset of the barrel's first offending re-export.
5068
5502
  */
5069
5503
  col: number
5504
+ /**
5505
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5506
+ * `~<k>` suffix when several findings of one type share an identity.
5507
+ * Line and column are not inputs, so the id survives line shifts,
5508
+ * reformats and reorders. A rename of the file or the symbol gives a
5509
+ * new id. Absent in output from older versions.
5510
+ */
5511
+ finding_id?: (string | null)
5070
5512
  /**
5071
5513
  * Suggested next steps. Always emitted (possibly empty for
5072
5514
  * forward-compat).
@@ -5110,6 +5552,14 @@ line: number
5110
5552
  * 0-based byte column offset of the misplaced directive statement.
5111
5553
  */
5112
5554
  col: number
5555
+ /**
5556
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5557
+ * `~<k>` suffix when several findings of one type share an identity.
5558
+ * Line and column are not inputs, so the id survives line shifts,
5559
+ * reformats and reorders. A rename of the file or the symbol gives a
5560
+ * new id. Absent in output from older versions.
5561
+ */
5562
+ finding_id?: (string | null)
5113
5563
  /**
5114
5564
  * Suggested next steps. Always emitted (possibly empty for
5115
5565
  * forward-compat).
@@ -5155,6 +5605,14 @@ line: number
5155
5605
  * 0-based byte column offset of the inject / getContext call.
5156
5606
  */
5157
5607
  col: number
5608
+ /**
5609
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5610
+ * `~<k>` suffix when several findings of one type share an identity.
5611
+ * Line and column are not inputs, so the id survives line shifts,
5612
+ * reformats and reorders. A rename of the file or the symbol gives a
5613
+ * new id. Absent in output from older versions.
5614
+ */
5615
+ finding_id?: (string | null)
5158
5616
  /**
5159
5617
  * Suggested next steps. Always emitted (possibly empty for
5160
5618
  * forward-compat).
@@ -5211,6 +5669,14 @@ line: number
5211
5669
  * 0-based byte column offset.
5212
5670
  */
5213
5671
  col: number
5672
+ /**
5673
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5674
+ * `~<k>` suffix when several findings of one type share an identity.
5675
+ * Line and column are not inputs, so the id survives line shifts,
5676
+ * reformats and reorders. A rename of the file or the symbol gives a
5677
+ * new id. Absent in output from older versions.
5678
+ */
5679
+ finding_id?: (string | null)
5214
5680
  /**
5215
5681
  * Suggested next steps. Always emitted (possibly empty for
5216
5682
  * forward-compat).
@@ -5260,6 +5726,14 @@ line: number
5260
5726
  * 0-based byte column offset (file-level finding, always 0).
5261
5727
  */
5262
5728
  col: number
5729
+ /**
5730
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5731
+ * `~<k>` suffix when several findings of one type share an identity.
5732
+ * Line and column are not inputs, so the id survives line shifts,
5733
+ * reformats and reorders. A rename of the file or the symbol gives a
5734
+ * new id. Absent in output from older versions.
5735
+ */
5736
+ finding_id?: (string | null)
5263
5737
  /**
5264
5738
  * Suggested next steps. Always emitted (possibly empty for
5265
5739
  * forward-compat).
@@ -5313,6 +5787,14 @@ line: number
5313
5787
  * 0-based byte column offset (file-level finding, always 0).
5314
5788
  */
5315
5789
  col: number
5790
+ /**
5791
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5792
+ * `~<k>` suffix when several findings of one type share an identity.
5793
+ * Line and column are not inputs, so the id survives line shifts,
5794
+ * reformats and reorders. A rename of the file or the symbol gives a
5795
+ * new id. Absent in output from older versions.
5796
+ */
5797
+ finding_id?: (string | null)
5316
5798
  /**
5317
5799
  * Suggested next steps. Always emitted (possibly empty for
5318
5800
  * forward-compat).
@@ -5358,6 +5840,14 @@ line: number
5358
5840
  * 0-based byte column offset of the prop declaration.
5359
5841
  */
5360
5842
  col: number
5843
+ /**
5844
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5845
+ * `~<k>` suffix when several findings of one type share an identity.
5846
+ * Line and column are not inputs, so the id survives line shifts,
5847
+ * reformats and reorders. A rename of the file or the symbol gives a
5848
+ * new id. Absent in output from older versions.
5849
+ */
5850
+ finding_id?: (string | null)
5361
5851
  /**
5362
5852
  * Suggested next steps. Always emitted (possibly empty for
5363
5853
  * forward-compat).
@@ -5403,6 +5893,14 @@ line: number
5403
5893
  * 0-based byte column offset of the emit declaration.
5404
5894
  */
5405
5895
  col: number
5896
+ /**
5897
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5898
+ * `~<k>` suffix when several findings of one type share an identity.
5899
+ * Line and column are not inputs, so the id survives line shifts,
5900
+ * reformats and reorders. A rename of the file or the symbol gives a
5901
+ * new id. Absent in output from older versions.
5902
+ */
5903
+ finding_id?: (string | null)
5406
5904
  /**
5407
5905
  * Suggested next steps. Always emitted (possibly empty for
5408
5906
  * forward-compat).
@@ -5448,6 +5946,14 @@ line: number
5448
5946
  * 0-based byte column offset of the input declaration.
5449
5947
  */
5450
5948
  col: number
5949
+ /**
5950
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
5951
+ * `~<k>` suffix when several findings of one type share an identity.
5952
+ * Line and column are not inputs, so the id survives line shifts,
5953
+ * reformats and reorders. A rename of the file or the symbol gives a
5954
+ * new id. Absent in output from older versions.
5955
+ */
5956
+ finding_id?: (string | null)
5451
5957
  /**
5452
5958
  * Suggested next steps. Always emitted (possibly empty for
5453
5959
  * forward-compat).
@@ -5493,6 +5999,14 @@ line: number
5493
5999
  * 0-based byte column offset of the output declaration.
5494
6000
  */
5495
6001
  col: number
6002
+ /**
6003
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
6004
+ * `~<k>` suffix when several findings of one type share an identity.
6005
+ * Line and column are not inputs, so the id survives line shifts,
6006
+ * reformats and reorders. A rename of the file or the symbol gives a
6007
+ * new id. Absent in output from older versions.
6008
+ */
6009
+ finding_id?: (string | null)
5496
6010
  /**
5497
6011
  * Suggested next steps. Always emitted (possibly empty for
5498
6012
  * forward-compat).
@@ -5539,6 +6053,14 @@ line: number
5539
6053
  * 0-based byte column offset of the `dispatch('<name>')` call.
5540
6054
  */
5541
6055
  col: number
6056
+ /**
6057
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
6058
+ * `~<k>` suffix when several findings of one type share an identity.
6059
+ * Line and column are not inputs, so the id survives line shifts,
6060
+ * reformats and reorders. A rename of the file or the symbol gives a
6061
+ * new id. Absent in output from older versions.
6062
+ */
6063
+ finding_id?: (string | null)
5542
6064
  /**
5543
6065
  * Suggested next steps. Always emitted (possibly empty for
5544
6066
  * forward-compat).
@@ -5580,6 +6102,14 @@ line: number
5580
6102
  * 0-based byte column offset of the export.
5581
6103
  */
5582
6104
  col: number
6105
+ /**
6106
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
6107
+ * `~<k>` suffix when several findings of one type share an identity.
6108
+ * Line and column are not inputs, so the id survives line shifts,
6109
+ * reformats and reorders. A rename of the file or the symbol gives a
6110
+ * new id. Absent in output from older versions.
6111
+ */
6112
+ finding_id?: (string | null)
5583
6113
  /**
5584
6114
  * Suggested next steps. Always emitted (possibly empty for
5585
6115
  * forward-compat).
@@ -5627,6 +6157,14 @@ col: number
5627
6157
  * determinable.
5628
6158
  */
5629
6159
  route_dir?: (string | null)
6160
+ /**
6161
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
6162
+ * `~<k>` suffix when several findings of one type share an identity.
6163
+ * Line and column are not inputs, so the id survives line shifts,
6164
+ * reformats and reorders. A rename of the file or the symbol gives a
6165
+ * new id. Absent in output from older versions.
6166
+ */
6167
+ finding_id?: (string | null)
5630
6168
  /**
5631
6169
  * Suggested next steps. Always emitted (possibly empty for
5632
6170
  * forward-compat).
@@ -5668,6 +6206,14 @@ depth: number
5668
6206
  * finding anchor is the first hop (`path` / `line` for suppression + CI).
5669
6207
  */
5670
6208
  hops: PropDrillHop[]
6209
+ /**
6210
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
6211
+ * `~<k>` suffix when several findings of one type share an identity.
6212
+ * Line and column are not inputs, so the id survives line shifts,
6213
+ * reformats and reorders. A rename of the file or the symbol gives a
6214
+ * new id. Absent in output from older versions.
6215
+ */
6216
+ finding_id?: (string | null)
5671
6217
  /**
5672
6218
  * Suggested next steps. Always emitted (possibly empty for
5673
6219
  * forward-compat).
@@ -5733,6 +6279,14 @@ component: string
5733
6279
  * at the render site).
5734
6280
  */
5735
6281
  child_component: string
6282
+ /**
6283
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
6284
+ * `~<k>` suffix when several findings of one type share an identity.
6285
+ * Line and column are not inputs, so the id survives line shifts,
6286
+ * reformats and reorders. A rename of the file or the symbol gives a
6287
+ * new id. Absent in output from older versions.
6288
+ */
6289
+ finding_id?: (string | null)
5736
6290
  /**
5737
6291
  * Suggested next steps. Always emitted (possibly empty for
5738
6292
  * forward-compat).
@@ -5791,6 +6345,14 @@ group_size: number
5791
6345
  * here, because the group is real regardless of suppression.
5792
6346
  */
5793
6347
  sharing_components: DuplicatePropShapeMember[]
6348
+ /**
6349
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
6350
+ * `~<k>` suffix when several findings of one type share an identity.
6351
+ * Line and column are not inputs, so the id survives line shifts,
6352
+ * reformats and reorders. A rename of the file or the symbol gives a
6353
+ * new id. Absent in output from older versions.
6354
+ */
6355
+ finding_id?: (string | null)
5794
6356
  /**
5795
6357
  * Suggested next steps. Always emitted (possibly empty for
5796
6358
  * forward-compat).
@@ -5995,6 +6557,14 @@ unrecognised_format?: boolean
5995
6557
  * uses the same value for its stderr note.
5996
6558
  */
5997
6559
  saved_by?: string
6560
+ /**
6561
+ * `legacy` when the loaded dead-code baseline has no `identity`, so its
6562
+ * entries use the old key forms and some of them hold a line. The run
6563
+ * still applies the file. `--save-baseline` rewrites it with line-free
6564
+ * keys. Absent for a current baseline and on `dupes` and `health`. The
6565
+ * value set is OPEN.
6566
+ */
6567
+ format?: string
5998
6568
  /**
5999
6569
  * Which channels narrowed this run, present and non-empty exactly when
6000
6570
  * `change_scoped` is true. Both members are derived from one function, so
@@ -6012,6 +6582,75 @@ saved_by?: string
6012
6582
  */
6013
6583
  scope_reasons?: ScopeReason[]
6014
6584
  }
6585
+ /**
6586
+ * The result of a `--finding-id` query, present only when the run received
6587
+ * one or more `--finding-id` values.
6588
+ *
6589
+ * A requested id that is missing from a conclusive run means "fixed,
6590
+ * suppressed, or ignored by config", never "unknown": an inline suppression
6591
+ * comment or an `ignoreFindings` entry is a choice a person made to hide the
6592
+ * finding, so it counts as absent. A missing id in a run that is not
6593
+ * conclusive is unknown, never resolved.
6594
+ *
6595
+ * Every list keeps the order of `requested`. `found` and `missing` partition
6596
+ * `requested`. `filtered` is a subset of `missing`.
6597
+ */
6598
+ export interface FindingIdQuery {
6599
+ /**
6600
+ * The requested ids, without duplicates, in the order of the arguments.
6601
+ */
6602
+ requested: string[]
6603
+ /**
6604
+ * The requested ids that this report contains.
6605
+ */
6606
+ found: string[]
6607
+ /**
6608
+ * The requested ids that this report does not contain. When `conclusive`
6609
+ * is true, a missing id is fixed, suppressed, or ignored by config.
6610
+ * Otherwise its state is unknown.
6611
+ */
6612
+ missing: string[]
6613
+ /**
6614
+ * The missing ids that the analysis still found before a filter of this
6615
+ * run (scope, baseline, issue-type filter) removed them. Such a finding
6616
+ * still exists.
6617
+ */
6618
+ filtered: string[]
6619
+ /**
6620
+ * True when no option of this run can hide a finding without a fix, and
6621
+ * no requested id was filtered. Only then does a missing id mean that
6622
+ * the analysis no longer reports the finding.
6623
+ */
6624
+ conclusive: boolean
6625
+ /**
6626
+ * Why the query is not conclusive, sorted. Empty exactly when
6627
+ * `conclusive` is true.
6628
+ */
6629
+ inconclusive_reasons: FindingIdQueryReason[]
6630
+ /**
6631
+ * A stable hash (`af1:<16 hex digits>`) of every input other than the
6632
+ * source code that decides which findings the run reports:
6633
+ * - the fallow version;
6634
+ * - the merged config after `extends` (without keys that only shape other
6635
+ * commands), the loaded external plugins and rule packs;
6636
+ * - production mode, `includeEntryExports`, the effective rules, the
6637
+ * type-aware mode, requirement and project list, the file size limit;
6638
+ * - the root-relative path and content of each repository `.gitignore`,
6639
+ * `.ignore` and `.git/info/exclude`, each `package.json`, each
6640
+ * `tsconfig*.json` and `jsconfig*.json` with the files its `extends`
6641
+ * names, and each file that matches a built-in or external plugin
6642
+ * config pattern (for example `vite.config.ts`).
6643
+ *
6644
+ * File content is normalized (CRLF to LF, trailing newlines removed).
6645
+ * Known exclusions: the global git excludes file and other machine
6646
+ * environment outside the `FALLOW_*` variables. Store the fingerprint
6647
+ * with a verdict. A later query with another fingerprint is unknown, even
6648
+ * when `conclusive` is true. An edit to a source file keeps it; an edit
6649
+ * to a manifest or project config changes it, also when the edit fixes a
6650
+ * dependency finding.
6651
+ */
6652
+ analysis_fingerprint: string
6653
+ }
6015
6654
  /**
6016
6655
  * Result of regression detection (`--fail-on-regression`). Compares current
6017
6656
  * issue counts against a baseline from config or an explicit file.
@@ -6061,9 +6700,11 @@ reason?: (string | null)
6061
6700
  * empty object is never emitted: it would assert that something was asked and
6062
6701
  * all of it applied, which is a different and false claim.
6063
6702
  *
6064
- * The names this build can emit are `changed-since`, `diff-filter` and
6065
- * `sarif-file`. The reasons are `git-missing`, `not-a-repository`,
6066
- * `git-failed` and `invalid-ref` for `changed-since`, `oversize`,
6703
+ * The names this build can emit are `changed-since`, `diff-filter`,
6704
+ * `package-baselines` and `sarif-file`. The reasons are `git-missing`,
6705
+ * `not-a-repository`, `git-failed` and `invalid-ref` for `changed-since`,
6706
+ * `unknown-workspace`, `git-missing`, `not-a-repository` and `git-failed`
6707
+ * for `package-baselines`, `oversize`,
6067
6708
  * `unreadable`, `not-utf8`, `foreign-namespace` and `ambiguous-base` for
6068
6709
  * `diff-filter`, and `directory-create-failed`, `write-failed` and
6069
6710
  * `serialize-failed` for `sarif-file`. Every set is OPEN: a name a consumer
@@ -6079,8 +6720,9 @@ reason?: (string | null)
6079
6720
  * widened the analysis, which is what `affects` exists to prevent.
6080
6721
  *
6081
6722
  * `scope_size` is emitted for `diff-filter`, in added lines, and for
6082
- * `changed-since`, in changed files that the run analyzed. `sarif-file`
6083
- * measures no scope. A consumer reads the unit off the name, so a name that
6723
+ * `changed-since`, in changed files that the run analyzed. `package-baselines`
6724
+ * and `sarif-file` measure no scope; the applied package refs travel in
6725
+ * `package_baselines`. A consumer reads the unit off the name, so a name that
6084
6726
  * starts to measure its own scope in a later release needs no change here.
6085
6727
  *
6086
6728
  * `invalid-ref` is reachable only through the programmatic API. The
@@ -6106,7 +6748,8 @@ affects: RequestEffect
6106
6748
  * `changed-since`, the diff source label (`--diff-file pr.diff`,
6107
6749
  * `--diff-stdin`, `$FALLOW_DIFF_FILE build/pr.diff`, or
6108
6750
  * `diffFile pr.diff` for the programmatic option) for `diff-filter`,
6109
- * the target path for `sarif-file`. Echoed rather than normalised, so a
6751
+ * `workspaces.changedSince` for `package-baselines`, the target path for
6752
+ * `sarif-file`. Echoed rather than normalised, so a
6110
6753
  * consumer must not join it to the project root the way it joins every
6111
6754
  * other path-shaped field.
6112
6755
  */
@@ -6151,6 +6794,19 @@ reason?: (string | null)
6151
6794
  */
6152
6795
  message?: (string | null)
6153
6796
  }
6797
+ /**
6798
+ * One applied baseline for an exact, project-relative workspace root.
6799
+ */
6800
+ export interface PackageBaselineStatus {
6801
+ /**
6802
+ * Workspace package root, relative to the analysis root with `/` separators.
6803
+ */
6804
+ workspace_root: string
6805
+ /**
6806
+ * Git ref used to select changed files in this package.
6807
+ */
6808
+ reference: string
6809
+ }
6154
6810
  /**
6155
6811
  * A read-only follow-up command fallow surfaces from the current findings,
6156
6812
  * emitted as the top-level `next_steps` array on each command's JSON envelope.
@@ -8362,6 +9018,48 @@ percentile: number
8362
9018
  * when empty.
8363
9019
  */
8364
9020
  actions?: RuntimeCoverageAction[]
9021
+ /**
9022
+ * Per-call cost inputs and the speed-work score for this hot function.
9023
+ * Omitted when the hot path has no `stable_id` or no static counterpart
9024
+ * in this checkout.
9025
+ */
9026
+ optimization_target?: (RuntimeCoverageOptimizationTarget | null)
9027
+ }
9028
+ /**
9029
+ * Speed-work inputs for one hot function: how often it runs and how much
9030
+ * work each call does. `importance` ranks the risk of a change; this block
9031
+ * ranks where speed work gives the largest gain.
9032
+ */
9033
+ export interface RuntimeCoverageOptimizationTarget {
9034
+ /**
9035
+ * `invocations` multiplied by the per-call cost that `cost_basis` names.
9036
+ * Uncapped integer. Compare it only between hot paths with the same
9037
+ * `cost_basis`: sort by `cost_basis` first, then by `cost_score`
9038
+ * descending. On the `cognitive` basis the per-call cost is at least 1.
9039
+ */
9040
+ cost_score: number
9041
+ cost_basis: RuntimeCoverageCostBasis
9042
+ /**
9043
+ * Static cognitive complexity of the function. A static proxy for the
9044
+ * work per call, not a measurement.
9045
+ */
9046
+ cognitive: number
9047
+ /**
9048
+ * Static cyclomatic complexity of the function.
9049
+ */
9050
+ cyclomatic: number
9051
+ /**
9052
+ * Number of lines in the function body.
9053
+ */
9054
+ line_count: number
9055
+ /**
9056
+ * Peak executions of one block inside the function per call, from V8
9057
+ * block coverage. `1.0` means no block ran more than once per call. A
9058
+ * loop body that runs 3 times per call gives `3.0`. Calls to other
9059
+ * functions do not change the value.
9060
+ * Omitted when the coverage input has no block counts for the function.
9061
+ */
9062
+ inner_iterations_per_call?: (number | null)
8365
9063
  }
8366
9064
  /**
8367
9065
  * One blast-radius entry in `runtime_coverage.blast_radius`: how far a
@@ -10925,6 +11623,14 @@ to: string
10925
11623
  * chain is a real compile-time coupling.
10926
11624
  */
10927
11625
  type_only: boolean
11626
+ /**
11627
+ * Whether the edge carries a runtime value but no static one: the target
11628
+ * loads only on demand (`import()`, a lazy glob or template pattern) or
11629
+ * on another thread (a worker URL, a worker loader request,
11630
+ * `child_process.fork`). False for a
11631
+ * static hop and for a type-only hop.
11632
+ */
11633
+ dynamic: boolean
10928
11634
  /**
10929
11635
  * 1-based line in `from` of the imported binding that creates this edge:
10930
11636
  * the first value-carrying symbol on the import, or the first symbol when
@@ -11264,6 +11970,13 @@ body: string
11264
11970
  * Stable finding fingerprint used for comment reconciliation.
11265
11971
  */
11266
11972
  fingerprint: string
11973
+ /**
11974
+ * The fingerprint that an older Fallow release wrote into the
11975
+ * `fallow-fingerprint:v2:` marker of this comment, when it is different
11976
+ * from `fingerprint`. For one release, an existing comment whose marker
11977
+ * holds this value is the same comment. Omitted when equal.
11978
+ */
11979
+ legacy_fingerprint?: (string | null)
11267
11980
  /**
11268
11981
  * True when the body was cut to fit the provider size limit; omitted
11269
11982
  * when false.
@@ -11283,6 +11996,13 @@ position: GitLabReviewPosition
11283
11996
  * Stable finding fingerprint used for comment reconciliation.
11284
11997
  */
11285
11998
  fingerprint: string
11999
+ /**
12000
+ * The fingerprint that an older Fallow release wrote into the
12001
+ * `fallow-fingerprint:v2:` marker of this comment, when it is different
12002
+ * from `fingerprint`. For one release, an existing comment whose marker
12003
+ * holds this value is the same comment. Omitted when equal.
12004
+ */
12005
+ legacy_fingerprint?: (string | null)
11286
12006
  /**
11287
12007
  * True when the body was cut to fit the provider size limit; omitted
11288
12008
  * when false.
@@ -12092,6 +12812,10 @@ gate_outcomes?: (GateOutcomes | null)
12092
12812
  * never "nothing failed". See [`crate::RequestOutcomes`].
12093
12813
  */
12094
12814
  request_outcomes?: (RequestOutcomes | null)
12815
+ /**
12816
+ * Applied package Git refs, omitted outside package-baseline runs.
12817
+ */
12818
+ package_baselines?: PackageBaselineStatus[]
12095
12819
  /**
12096
12820
  * `_meta` block with metric / rule definitions, emitted when `--explain`
12097
12821
  * is passed (always present in MCP responses).
@@ -12250,6 +12974,14 @@ total_issues: number
12250
12974
  * One bucket per resolver key.
12251
12975
  */
12252
12976
  groups: CheckGroupedEntry[]
12977
+ /**
12978
+ * `true` when the `unused-load-data-key` detector abstained for the whole
12979
+ * project. The abstain has no file, so it is on the root and not in a
12980
+ * group. An empty `unused_load_data_keys` with this flag set does not
12981
+ * mean the project is clean: the rule could not run safely. Serialized
12982
+ * only when `true`, like the flat `CheckOutput` field.
12983
+ */
12984
+ unused_load_data_keys_global_abstain?: boolean
12253
12985
  /**
12254
12986
  * This run's view of the loaded baseline, present only in baseline runs.
12255
12987
  * Carries the staleness counts, the advisory verdict and `gate_trips`, the
@@ -12259,6 +12991,14 @@ groups: CheckGroupedEntry[]
12259
12991
  * can report `matched_entries: 0` on a healthy baseline.
12260
12992
  */
12261
12993
  baseline_staleness?: (BaselineStaleness | null)
12994
+ /**
12995
+ * The answer to `--finding-id`, present only when the run received one
12996
+ * or more `--finding-id` values. The report then holds only the
12997
+ * requested findings. Read `missing` as resolved only when `conclusive`
12998
+ * is true; a scope, a baseline or a filter can hide a finding that still
12999
+ * exists. See [`crate::FindingIdQuery`].
13000
+ */
13001
+ finding_id_query?: (FindingIdQuery | null)
12262
13002
  /**
12263
13003
  * The verdict of every gate this run evaluated, keyed by name. The CLI
12264
13004
  * always emits it, with the command's default exit rule in it also when
@@ -12279,6 +13019,10 @@ gate_outcomes?: (GateOutcomes | null)
12279
13019
  * never "nothing failed". See [`crate::RequestOutcomes`].
12280
13020
  */
12281
13021
  request_outcomes?: (RequestOutcomes | null)
13022
+ /**
13023
+ * Applied package Git refs, omitted outside package-baseline runs.
13024
+ */
13025
+ package_baselines?: PackageBaselineStatus[]
12282
13026
  /**
12283
13027
  * `_meta` block with docs and rule definitions, when `--explain` was
12284
13028
  * passed.
@@ -12438,6 +13182,12 @@ circular_dependencies: CircularDependencyFinding[]
12438
13182
  * suppression breaks the cycle).
12439
13183
  */
12440
13184
  re_export_cycles?: ReExportCycleFinding[]
13185
+ /**
13186
+ * Dependency cycles between workspace packages, built from resolved
13187
+ * cross-package imports. Wrapped in [`PackageCycleFinding`] so each
13188
+ * entry carries a typed `actions` array natively.
13189
+ */
13190
+ package_cycles?: PackageCycleFinding[]
12441
13191
  /**
12442
13192
  * Imports that cross architecture boundary rules. Wrapped in
12443
13193
  * [`BoundaryViolationFinding`] so each entry carries a typed `actions`
@@ -13906,9 +14656,12 @@ elapsed_ms: ElapsedMs
13906
14656
  /**
13907
14657
  * The verdict of every gate this run evaluated, keyed by name. The CLI
13908
14658
  * always emits it, with the default exit rule of each section that ran
13909
- * (`error-severity-findings`, `health-findings`). The machine formats of
13910
- * the combined run exit 0 for findings, so most entries have `enforced:
13911
- * false`. For the default exit rules (`error-severity-findings`,
14659
+ * (`error-severity-findings`, `health-findings`). Without
14660
+ * `--fail-on-issues` or `--ci`, the machine formats of the combined run
14661
+ * exit 0 for findings, so most entries have `enforced: false`. With one of
14662
+ * these flags, the findings rules and `duplication-threshold` are
14663
+ * `enforced`, and every format exits 1 when one fails. For the default
14664
+ * exit rules (`error-severity-findings`,
13912
14665
  * `health-findings`), `status` gives the verdict of the human run. An
13913
14666
  * advisory entry can report `fail` without a failure of the human run: an
13914
14667
  * example is a `stale-baseline` entry that `--fail-on-stale-baseline` did
@@ -13927,6 +14680,11 @@ gate_outcomes?: (GateOutcomes | null)
13927
14680
  * never "nothing failed". See [`crate::RequestOutcomes`].
13928
14681
  */
13929
14682
  request_outcomes?: (RequestOutcomes | null)
14683
+ /**
14684
+ * Applied package Git refs of the `check` and `dupes` sections. The map
14685
+ * does not narrow the `health` section.
14686
+ */
14687
+ package_baselines?: PackageBaselineStatus[]
13930
14688
  /**
13931
14689
  * Per-section `_meta` blocks, when `--explain` was passed.
13932
14690
  */
@@ -14063,6 +14821,15 @@ total_flags: number
14063
14821
  * change.
14064
14822
  */
14065
14823
  workspace_diagnostics?: WorkspaceDiagnostic[]
14824
+ /**
14825
+ * One row per flag with the reasons the flag can be retired.
14826
+ *
14827
+ * Present only with `--retirement`. Without that option the key is
14828
+ * omitted, so the envelope stays byte-identical and `schema_version`
14829
+ * does not move. The per-site `feature_flags[]` array is the same with
14830
+ * and without the option.
14831
+ */
14832
+ retirement?: (FlagRetirementReport | null)
14066
14833
  /**
14067
14834
  * `_meta` block; see [`FeatureFlagsMeta`].
14068
14835
  */
@@ -14138,6 +14905,347 @@ dead_export_count: number
14138
14905
  */
14139
14906
  dead_exports: string[]
14140
14907
  }
14908
+ /**
14909
+ * The `retirement` block of `fallow flags --retirement --format json`.
14910
+ */
14911
+ export interface FlagRetirementReport {
14912
+ /**
14913
+ * The analysis clock that ages count from, as an RFC 3339 UTC
14914
+ * timestamp. `null` when the age mode is `off`, and also when no git
14915
+ * history is available: outside a repository, on a branch without
14916
+ * commits, or in a shallow clone. A `workspace_diagnostics` entry then
14917
+ * gives the reason.
14918
+ */
14919
+ generated_at_clock?: (string | null)
14920
+ age_mode: FlagAgeMode
14921
+ /**
14922
+ * The vendor export that the report read. Present only with
14923
+ * `--flag-state`.
14924
+ */
14925
+ vendor_state?: (RetirementVendorState | null)
14926
+ summary: RetirementSummary
14927
+ /**
14928
+ * Verdict of `--fail-on-regression` against a flags regression
14929
+ * baseline. Present only when the gate ran.
14930
+ */
14931
+ regression?: (FlagRegressionResult | null)
14932
+ /**
14933
+ * Verdict of `--max-flag-age`. Present only with that option.
14934
+ */
14935
+ max_flag_age?: (FlagAgeGate | null)
14936
+ /**
14937
+ * One row per flag after the `--min-age`, `--reason`, `--sort` and
14938
+ * `--top` options. A row with an empty `reasons` array is not a
14939
+ * candidate.
14940
+ */
14941
+ flags: RetirementFlag[]
14942
+ }
14943
+ /**
14944
+ * The `--flag-state` vendor export that the report read.
14945
+ */
14946
+ export interface RetirementVendorState {
14947
+ /**
14948
+ * The vendor name from the export, for example `launchdarkly`.
14949
+ */
14950
+ source: string
14951
+ /**
14952
+ * When the export was made, as the export gives it.
14953
+ */
14954
+ exported_at: string
14955
+ /**
14956
+ * Days between `exported_at` and the analysis clock. `null` when the
14957
+ * date cannot be read.
14958
+ */
14959
+ export_age_days?: (number | null)
14960
+ /**
14961
+ * Number of flags in the export.
14962
+ */
14963
+ flags: number
14964
+ }
14965
+ /**
14966
+ * Totals of the retirement report.
14967
+ */
14968
+ export interface RetirementSummary {
14969
+ /**
14970
+ * Distinct flags in the code in scope, before `--min-age` and
14971
+ * `--reason`. The `vendor-only` rows of a `--flag-state` export do not
14972
+ * count here, so the count does not change when a key is added in the
14973
+ * vendor only. `by_reason` counts them.
14974
+ */
14975
+ distinct_flags: number
14976
+ /**
14977
+ * Rows in scope with at least one reason, `vendor-only` rows included.
14978
+ */
14979
+ candidates: number
14980
+ /**
14981
+ * Number of rows in scope per reason.
14982
+ */
14983
+ by_reason: {
14984
+ [k: string]: number
14985
+ }
14986
+ }
14987
+ /**
14988
+ * Verdict of the flags regression gate.
14989
+ */
14990
+ export interface FlagRegressionResult {
14991
+ status: RegressionStatus
14992
+ /**
14993
+ * The `--tolerance` value. Absent when the status is `skipped`.
14994
+ */
14995
+ tolerance?: (number | null)
14996
+ /**
14997
+ * How to read `tolerance`. Absent when the status is `skipped`.
14998
+ */
14999
+ tolerance_kind?: (RegressionToleranceKind | null)
15000
+ /**
15001
+ * The compared counts: `distinct_flags` first, then each `--reason`
15002
+ * code. Empty when the status is `skipped`.
15003
+ */
15004
+ metrics: FlagRegressionMetric[]
15005
+ /**
15006
+ * Whether one count grew more than the tolerance.
15007
+ */
15008
+ exceeded: boolean
15009
+ /**
15010
+ * Why the gate did not run. Present only when the status is `skipped`.
15011
+ */
15012
+ reason?: (string | null)
15013
+ }
15014
+ /**
15015
+ * One count that the flags regression gate compares.
15016
+ */
15017
+ export interface FlagRegressionMetric {
15018
+ /**
15019
+ * `distinct_flags`, or a reason code from `--reason`.
15020
+ */
15021
+ metric: string
15022
+ /**
15023
+ * The count in the baseline.
15024
+ */
15025
+ baseline: number
15026
+ /**
15027
+ * The count in this run.
15028
+ */
15029
+ current: number
15030
+ /**
15031
+ * `current - baseline`.
15032
+ */
15033
+ delta: number
15034
+ /**
15035
+ * Whether the growth is more than the tolerance.
15036
+ */
15037
+ exceeded: boolean
15038
+ }
15039
+ /**
15040
+ * Verdict of `--max-flag-age`.
15041
+ */
15042
+ export interface FlagAgeGate {
15043
+ status: RegressionStatus
15044
+ /**
15045
+ * The `--max-flag-age` value in days.
15046
+ */
15047
+ max_days: number
15048
+ /**
15049
+ * Whether one flag in scope is older than `max_days`.
15050
+ */
15051
+ exceeded: boolean
15052
+ /**
15053
+ * Flags in the code in scope without a measured age. The gate cannot
15054
+ * check these flags.
15055
+ */
15056
+ unmeasured: number
15057
+ /**
15058
+ * Why the gate did not run. Present only when the status is `skipped`.
15059
+ */
15060
+ reason?: (string | null)
15061
+ /**
15062
+ * The flags in scope that are older than `max_days`, oldest first.
15063
+ * The `--reason`, `--min-age` and `--top` options do not change this
15064
+ * list.
15065
+ */
15066
+ flags: FlagAgeGateEntry[]
15067
+ }
15068
+ /**
15069
+ * A flag that is older than `--max-flag-age`.
15070
+ */
15071
+ export interface FlagAgeGateEntry {
15072
+ /**
15073
+ * Flag identifier.
15074
+ */
15075
+ flag_name: string
15076
+ kind: RetirementFlagKind
15077
+ /**
15078
+ * Flag SDK, for SDK flags with a known provider.
15079
+ */
15080
+ sdk_name?: (string | null)
15081
+ /**
15082
+ * Workspace root of the flag, in a project with workspaces.
15083
+ */
15084
+ workspace?: (string | null)
15085
+ /**
15086
+ * Age of the flag in days.
15087
+ */
15088
+ age_days: number
15089
+ }
15090
+ /**
15091
+ * One flag in the retirement report.
15092
+ */
15093
+ export interface RetirementFlag {
15094
+ /**
15095
+ * Flag identifier.
15096
+ */
15097
+ flag_name: string
15098
+ kind: RetirementFlagKind
15099
+ /**
15100
+ * Flag SDK, for SDK flags with a known provider.
15101
+ */
15102
+ sdk_name?: (string | null)
15103
+ /**
15104
+ * Workspace root relative to the analysed root, when the project has
15105
+ * workspaces and the flag is inside one. Part of the flag identity.
15106
+ */
15107
+ workspace?: (string | null)
15108
+ /**
15109
+ * Every site of the flag, sorted by path, line and column.
15110
+ */
15111
+ sites: RetirementSite[]
15112
+ /**
15113
+ * Number of sites in this row that read the flag.
15114
+ */
15115
+ read_sites: number
15116
+ /**
15117
+ * Whether every read site is in a test, story or mock file. Read sites
15118
+ * of the same flag in other workspaces count too.
15119
+ */
15120
+ test_only: boolean
15121
+ /**
15122
+ * First commit that added the flag name. Set in `pickaxe` mode only.
15123
+ */
15124
+ first_seen?: (FlagCommit | null)
15125
+ /**
15126
+ * Oldest commit among the lines that still hold the flag.
15127
+ */
15128
+ oldest_surviving_site?: (FlagCommit | null)
15129
+ /**
15130
+ * Newest commit among the lines that still hold the flag.
15131
+ */
15132
+ last_touched?: (FlagCommit | null)
15133
+ /**
15134
+ * Days between the flag's oldest known commit and the analysis clock.
15135
+ * In `blame` mode this is a lower bound.
15136
+ */
15137
+ age_days?: (number | null)
15138
+ /**
15139
+ * Retirement reasons, in report order. Empty for a flag that is not a
15140
+ * candidate.
15141
+ */
15142
+ reasons: RetirementReason[]
15143
+ /**
15144
+ * Evidence for each reason.
15145
+ */
15146
+ evidence: RetirementEvidence[]
15147
+ /**
15148
+ * Follow-up actions. Empty for a flag that is not a candidate.
15149
+ */
15150
+ actions: RetirementAction[]
15151
+ /**
15152
+ * The vendor state of the flag. Present only with `--flag-state`, for
15153
+ * a flag whose key is in the export.
15154
+ */
15155
+ vendor?: (RetirementVendor | null)
15156
+ }
15157
+ /**
15158
+ * One site of a flag in the retirement report.
15159
+ */
15160
+ export interface RetirementSite {
15161
+ /**
15162
+ * File path relative to the analysed root.
15163
+ */
15164
+ path: string
15165
+ /**
15166
+ * 1-based line.
15167
+ */
15168
+ line: number
15169
+ /**
15170
+ * 0-based byte column.
15171
+ */
15172
+ col: number
15173
+ role: FlagSiteRole
15174
+ /**
15175
+ * Whether the file is a test, story or mock file.
15176
+ */
15177
+ in_test: boolean
15178
+ }
15179
+ /**
15180
+ * A commit that git history links to a flag.
15181
+ */
15182
+ export interface FlagCommit {
15183
+ /**
15184
+ * Abbreviated commit hash.
15185
+ */
15186
+ commit: string
15187
+ /**
15188
+ * Commit date in UTC, as `YYYY-MM-DD`.
15189
+ */
15190
+ date: string
15191
+ }
15192
+ /**
15193
+ * One piece of evidence for a retirement reason.
15194
+ */
15195
+ export interface RetirementEvidence {
15196
+ reason: RetirementReason
15197
+ /**
15198
+ * File path relative to the analysed root. For `vendor-only`, the path
15199
+ * of the `--flag-state` file: relative to the root when the file is
15200
+ * inside it, else as given.
15201
+ */
15202
+ path: string
15203
+ /**
15204
+ * 1-based line.
15205
+ */
15206
+ line: number
15207
+ /**
15208
+ * What the evidence shows.
15209
+ */
15210
+ detail: string
15211
+ }
15212
+ /**
15213
+ * A follow-up action for a retirement candidate.
15214
+ */
15215
+ export interface RetirementAction {
15216
+ type: RetirementActionType
15217
+ /**
15218
+ * Always `false`: Fallow never removes a flag.
15219
+ */
15220
+ auto_fixable: boolean
15221
+ /**
15222
+ * Human-readable action description.
15223
+ */
15224
+ description: string
15225
+ }
15226
+ /**
15227
+ * The vendor state of one flag in the retirement report.
15228
+ */
15229
+ export interface RetirementVendor {
15230
+ /**
15231
+ * The key in the vendor export, before `flags.vendorKeyPrefix` is
15232
+ * removed.
15233
+ */
15234
+ key: string
15235
+ state: VendorFlagState
15236
+ /**
15237
+ * Whether the flag serves one variation, when the export says so.
15238
+ */
15239
+ serves_single_variation?: (boolean | null)
15240
+ /**
15241
+ * When the vendor created the flag, as the export gives it.
15242
+ */
15243
+ created_at?: (string | null)
15244
+ /**
15245
+ * When the vendor last evaluated the flag, as the export gives it.
15246
+ */
15247
+ last_evaluated_at?: (string | null)
15248
+ }
14141
15249
  /**
14142
15250
  * Optional `_meta` block for [`FeatureFlagsOutput`]. Both fields are optional
14143
15251
  * because the two contributors are independent: `feature_flags` details are
@@ -16515,6 +17623,16 @@ export type EmptyCatalogGroup = EmptyCatalogGroupFinding;
16515
17623
  */
16516
17624
  export type MisconfiguredDependencyOverride = MisconfiguredDependencyOverrideFinding;
16517
17625
 
17626
+ /**
17627
+ * Backwards-compat alias for the pre-#384 bare `PackageCycle` name.
17628
+ * The wire shape is byte-identical: `PackageCycleFinding` flattens the bare
17629
+ * finding's fields via `#[serde(flatten)]` and adds `actions[]` plus
17630
+ * the optional audit-mode `introduced` flag. Consumers that imported
17631
+ * `PackageCycle` from `fallow/types` pre-migration continue to work via
17632
+ * this alias; new code should prefer `PackageCycleFinding`.
17633
+ */
17634
+ export type PackageCycle = PackageCycleFinding;
17635
+
16518
17636
  /**
16519
17637
  * Backwards-compat alias for the pre-#384 bare `PrivateTypeLeak` name.
16520
17638
  * The wire shape is byte-identical: `PrivateTypeLeakFinding` flattens the bare