fallow 2.102.0 → 2.104.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.
@@ -25,7 +25,7 @@
25
25
 
26
26
 
27
27
  /**
28
- * Schemas for the JSON output of fallow commands. Object-shaped envelopes covered by the `FallowOutput` contract carry a top-level `kind` discriminator (for example `dead-code`, `dead-code-grouped`, `health`, `dupes`, `combined`, `audit`, `explain`, `inspect_target`, `impact`, `security`, `coverage-setup`, `coverage-analyze`, `list-boundaries`, `review-envelope`, and `review-reconcile`). Consumers should branch on `kind` instead of probing for unique field presence. `--legacy-envelope` removes only the document-root `kind` for one compatibility cycle. `CodeClimateOutput` is a bare JSON array (per the Code Climate / GitLab Code Quality spec) and stays a sibling root branch discriminated by checking whether the document root is an array.
28
+ * Schemas for the JSON output of fallow commands. Object-shaped envelopes covered by the `FallowOutput` contract carry a top-level `kind` discriminator (for example `dead-code`, `dead-code-grouped`, `health`, `dupes`, `combined`, `audit`, `explain`, `inspect_target`, `impact`, `security`, `coverage-setup`, `coverage-analyze`, `list-boundaries`, `review-envelope`, and `review-reconcile`). Consumers should branch on `kind` instead of probing for unique field presence. `CodeClimateOutput` is a bare JSON array (per the Code Climate / GitLab Code Quality spec) and stays a sibling root branch discriminated by checking whether the document root is an array.
29
29
  */
30
30
  export type FallowJsonOutput = (FallowOutput | CodeClimateOutput)
31
31
  /**
@@ -34,11 +34,9 @@ export type FallowJsonOutput = (FallowOutput | CodeClimateOutput)
34
34
  * schema derived from this enum drives the document-root `oneOf` in
35
35
  * `docs/output-schema.json`.
36
36
  *
37
- * The default wire shape now carries a top-level `kind` discriminator so
38
- * agents and schema-validating clients can select the variant in O(1) instead
39
- * of probing for unique field presence. `--legacy-envelope` is a one-cycle
40
- * compatibility flag that removes only this document-root `kind` field from
41
- * CLI JSON output; nested report objects are not rewritten.
37
+ * The wire shape carries a top-level `kind` discriminator so agents and
38
+ * schema-validating clients can select the variant in O(1) instead of probing
39
+ * for unique field presence.
42
40
  *
43
41
  * One envelope is intentionally NOT in this enum:
44
42
  * - `CodeClimateOutput` serializes as a bare JSON array
@@ -119,6 +117,9 @@ export type SchemaVersion = 7
119
117
  * a bare string (e.g. `"2.74.0"`).
120
118
  */
121
119
  export type ToolVersion = string
120
+ /**
121
+ * Audit command singleton carried by [`AuditOutput`].
122
+ */
122
123
  export type AuditCommand = "audit"
123
124
  /**
124
125
  * Verdict for the audit command.
@@ -450,7 +451,8 @@ export type UntestedFileActionType = ("add-tests" | "suppress-file")
450
451
  */
451
452
  export type UntestedExportActionType = ("add-test-import" | "suppress-file")
452
453
  /**
453
- * Churn trend indicator based on comparing recent vs older halves of the analysis period.
454
+ * Churn trend indicator based on comparing recent vs older halves of the
455
+ * analysis period.
454
456
  */
455
457
  export type ChurnTrend = ("accelerating" | "stable" | "cooling")
456
458
  export type ContributorIdentifierFormat = ("raw" | "handle" | "anonymized" | "hash")
@@ -597,6 +599,24 @@ export type CssCandidateActionType = ("verify-unused" | "verify-undefined" | "co
597
599
  * Discriminant for [`UnusedAtRule::kind`].
598
600
  */
599
601
  export type UnusedAtRuleKind = ("property-registration" | "layer")
602
+ /**
603
+ * The surface through which a design token is consumed. The `theme-var` /
604
+ * `css-var` / `utility` / `apply` kinds are Tailwind v4 `@theme` consumption; the
605
+ * `js-member` kind is CSS-in-JS consumption (a cross-module member access on an
606
+ * imported StyleX/vanilla-extract token binding). The kind is the disjoint origin
607
+ * signal that distinguishes a Tailwind token entry from a CSS-in-JS token entry in
608
+ * the shared `token_consumers` list.
609
+ */
610
+ export type ConsumerKind = ("theme-var" | "css-var" | "utility" | "apply" | "js-member")
611
+ /**
612
+ * Trust level for a [`StylingHealth`] grade. TWO variants (not the three-tier
613
+ * `high`/`medium`/`low` of [`crate::Confidence`] / `FeatureFlagConfidence`) ON
614
+ * PURPOSE: styling confidence is binary (the grade is either reliable for the
615
+ * analyzed surface or it is not), not three distinct evidence tiers, so a
616
+ * never-emitted `Medium` would be dead surface. Serializes lowercase (`"high"` /
617
+ * `"low"`), matching the sibling confidence enums' vocabulary.
618
+ */
619
+ export type StylingHealthConfidence = ("high" | "low")
600
620
  export type InspectTargetDescriptor = ({
601
621
  file: string
602
622
  type: "file"
@@ -784,12 +804,14 @@ export type RiskClass = ("low" | "medium" | "high")
784
804
  */
785
805
  export type ReviewEffort = ("glance" | "review" | "deep_dive")
786
806
  /**
787
- * The focus label for a review unit. EXACTLY two variants: `Skip` is NOT
788
- * representable, so the type system is the guarantee that free mode never emits
789
- * a `skip` label (safe explicit-skip is paid, runtime-backed only). Mirrors
790
- * the decision surface's "cut category not representable" structural posture.
807
+ * The focus label for a review unit. `Skip` is the SAFE explicit-skip label and
808
+ * is runtime-backed ONLY: it is producible solely on the paid runtime path
809
+ * and solely for a unit runtime-proves cold with zero risk signals. Free mode
810
+ * (no runtime evidence) emits only `ReviewHere` / `NotPrioritized`, never `Skip`
811
+ * (the build-focus-map labeller cannot reach the `Skip` arm without runtime
812
+ * input), so the free-tier "rank but never skip" stance holds by construction.
791
813
  */
792
- export type FocusLabel = ("review-here" | "not-prioritized")
814
+ export type FocusLabel = ("review-here" | "not-prioritized" | "skip")
793
815
  /**
794
816
  * A per-unit confidence flag. The EXACT panel-decided strings: a dynamically-
795
817
  * wired or re-export-heavy unit carries one so its static-reachability signal is
@@ -851,7 +873,7 @@ duplication?: (DupesReportPayload | null)
851
873
  complexity?: (HealthReport | null)
852
874
  /**
853
875
  * Read-only follow-up commands computed from this run's findings. See
854
- * [`CheckOutput::next_steps`] for the contract.
876
+ * `CheckOutput::next_steps` for the contract.
855
877
  */
856
878
  next_steps?: NextStep[]
857
879
  }
@@ -3611,7 +3633,7 @@ reason: string
3611
3633
  }
3612
3634
  /**
3613
3635
  * Wire-shape payload for `fallow dupes --format json` (the body that
3614
- * flattens into [`crate::output_envelope::DupesOutput`] and is also
3636
+ * flattens into the `DupesOutput` envelope and is also
3615
3637
  * emitted under the `dupes` / `duplication` key inside the combined and
3616
3638
  * audit envelopes).
3617
3639
  *
@@ -3627,8 +3649,8 @@ export interface DupesReportPayload {
3627
3649
  clone_groups: CloneGroupFinding[]
3628
3650
  /**
3629
3651
  * Clone families, each wrapped with typed actions. Inner `groups`
3630
- * inside each [`CloneFamilyFinding`] are themselves wrapped as
3631
- * [`CloneGroupFinding`] entries carrying their own `actions[]` (and
3652
+ * inside each `CloneFamilyFinding` are themselves wrapped as
3653
+ * `CloneGroupFinding` entries carrying their own `actions[]` (and
3632
3654
  * optional audit-mode `introduced` flag), so JSON-Schema strict
3633
3655
  * consumers and TS consumers reading `clone_families[].groups[]` see
3634
3656
  * the same shape as the top-level `clone_groups[]` array (preserves
@@ -3718,8 +3740,8 @@ end_col: number
3718
3740
  fragment: string
3719
3741
  }
3720
3742
  /**
3721
- * Per-action wire shape attached to each [`CloneGroupFinding`] and
3722
- * [`AttributedCloneGroupFinding`]. Mirrors the action types previously
3743
+ * Per-action wire shape attached to each `CloneGroupFinding` and
3744
+ * `AttributedCloneGroupFinding`. Mirrors the action types previously
3723
3745
  * emitted by `inject_dupes_actions::build_clone_group_actions` in
3724
3746
  * `crates/cli/src/report/json.rs`: `extract-shared` plus `suppress-line`.
3725
3747
  */
@@ -3748,7 +3770,7 @@ comment?: (string | null)
3748
3770
  * Unlike most `*Finding` wrappers this one is NOT `#[serde(flatten)]` over
3749
3771
  * the bare [`CloneFamily`], because the family's nested
3750
3772
  * `groups: Vec<CloneGroup>` field needs to carry the typed
3751
- * [`CloneGroupFinding`] wrapper too (so every nested clone group gets its
3773
+ * `CloneGroupFinding` wrapper too (so every nested clone group gets its
3752
3774
  * own `actions[]` array, matching the legacy post-pass behavior; see issue
3753
3775
  * #393 regression test). The wire shape stays byte-identical to the
3754
3776
  * previous post-pass output. No `introduced` field because `fallow audit`
@@ -3756,7 +3778,7 @@ comment?: (string | null)
3756
3778
  */
3757
3779
  export interface CloneFamilyFinding {
3758
3780
  /**
3759
- * The files involved in this family (sorted for stable output).
3781
+ * The files involved in this family.
3760
3782
  */
3761
3783
  files: string[]
3762
3784
  /**
@@ -3779,7 +3801,7 @@ total_duplicated_tokens: number
3779
3801
  suggestions: RefactoringSuggestion[]
3780
3802
  /**
3781
3803
  * Suggested next steps: an `extract-shared` primary, one
3782
- * `apply-suggestion` per [`RefactoringSuggestion`] on the family, and
3804
+ * `apply-suggestion` per `RefactoringSuggestion` on the family, and
3783
3805
  * a trailing `suppress-line`. Always emitted (possibly empty for
3784
3806
  * forward-compat).
3785
3807
  */
@@ -3800,10 +3822,10 @@ description: string
3800
3822
  estimated_savings: number
3801
3823
  }
3802
3824
  /**
3803
- * Per-action wire shape attached to each [`CloneFamilyFinding`]. Mirrors
3825
+ * Per-action wire shape attached to each `CloneFamilyFinding`. Mirrors
3804
3826
  * the action types previously emitted by
3805
3827
  * `build_clone_family_actions`: `extract-shared`, one `apply-suggestion`
3806
- * per [`RefactoringSuggestion`] on the family, and a trailing
3828
+ * per `RefactoringSuggestion` on the family, and a trailing
3807
3829
  * `suppress-line`.
3808
3830
  */
3809
3831
  export interface CloneFamilyAction {
@@ -3912,7 +3934,7 @@ export interface HealthReport {
3912
3934
  /**
3913
3935
  * Functions and synthetic template entries exceeding complexity
3914
3936
  * thresholds, sorted by the --sort criteria. Each entry wraps its
3915
- * inner [`ComplexityViolation`] payload (flattened on the wire) with
3937
+ * inner `ComplexityViolation` payload (flattened on the wire) with
3916
3938
  * the typed `actions` list and an optional audit-mode `introduced`
3917
3939
  * flag.
3918
3940
  */
@@ -3957,7 +3979,7 @@ prop_drilling_chains?: PropDrillingChainFinding[]
3957
3979
  /**
3958
3980
  * Hotspot entries combining git churn with complexity. Only present when
3959
3981
  * --hotspots is used. Sorted by score descending (highest risk first).
3960
- * Each entry wraps its inner [`HotspotEntry`] payload (flattened on the
3982
+ * Each entry wraps its inner `HotspotEntry` payload (flattened on the
3961
3983
  * wire) with a typed `actions` list.
3962
3984
  */
3963
3985
  hotspots?: HotspotFinding[]
@@ -3982,7 +4004,7 @@ large_functions?: LargeFunctionEntry[]
3982
4004
  /**
3983
4005
  * Ranked refactoring recommendations. Only present when --targets is used.
3984
4006
  * Sorted by efficiency (priority/effort) descending. Each entry wraps
3985
- * its inner [`RefactoringTarget`] payload (flattened on the wire) with
4007
+ * its inner `RefactoringTarget` payload (flattened on the wire) with
3986
4008
  * a typed `actions` list.
3987
4009
  */
3988
4010
  targets?: RefactoringTargetFinding[]
@@ -4013,6 +4035,14 @@ framework_health?: (FrameworkHealthDiagnostics | null)
4013
4035
  * over-complex selectors, deep nesting). Present only with `--css`.
4014
4036
  */
4015
4037
  css_analytics?: (CssAnalyticsReport | null)
4038
+ /**
4039
+ * Styling-health score and letter grade: a SECOND health axis derived from
4040
+ * the CSS analytics (the design-system axis), orthogonal to the JS/TS code
4041
+ * `health_score`. Present only with `--css` (the same condition as
4042
+ * `css_analytics`), so a plain `fallow health` run is byte-unchanged. The
4043
+ * code score is never affected by this field.
4044
+ */
4045
+ styling_health?: (StylingHealth | null)
4016
4046
  }
4017
4047
  /**
4018
4048
  * Wire envelope for a single complexity finding.
@@ -4189,7 +4219,7 @@ max_crap: number
4189
4219
  * `comment` plus `placement`, and the coverage-leaning actions
4190
4220
  * (`add-tests`, `increase-coverage`) carry only `note`.
4191
4221
  *
4192
- * [`ComplexityViolation`]: ../../fallow-cli/src/health_types/scores.rs
4222
+ * [`ComplexityViolation`]: ../../fallow-output/src/health_scores.rs
4193
4223
  */
4194
4224
  export interface HealthFindingAction {
4195
4225
  type: HealthFindingActionType
@@ -4287,7 +4317,7 @@ cognitive: number
4287
4317
  crap?: (number | null)
4288
4318
  }
4289
4319
  /**
4290
- * Project-wide vital signs , a fixed set of metrics for trend tracking.
4320
+ * Project-wide vital signs: a fixed set of metrics for trend tracking.
4291
4321
  *
4292
4322
  * Metrics are `Option` when the data source was not available in the current run
4293
4323
  * (e.g., `duplication_pct` is `None` unless the duplication pipeline was run,
@@ -4328,7 +4358,7 @@ hotspot_count?: (number | null)
4328
4358
  */
4329
4359
  hotspot_top_pct_count?: (number | null)
4330
4360
  /**
4331
- * Average maintainability index across all scored files (0100).
4361
+ * Average maintainability index across all scored files (0-100).
4332
4362
  */
4333
4363
  maintainability_avg?: (number | null)
4334
4364
  /**
@@ -4616,7 +4646,7 @@ path: string
4616
4646
  value_export_count: number
4617
4647
  /**
4618
4648
  * Suggested next steps: an `add-tests` primary and a `suppress-file`
4619
- * secondary. Always emitted (possibly empty for forward-compat).
4649
+ * secondary. Always emitted for the current wire contract.
4620
4650
  */
4621
4651
  actions: UntestedFileAction[]
4622
4652
  }
@@ -4630,7 +4660,7 @@ actions: UntestedFileAction[]
4630
4660
  * struct shape; the field that is populated (`note` for `add-tests`,
4631
4661
  * `comment` for `suppress-file`) depends on the `kind`.
4632
4662
  *
4633
- * [`UntestedFile`]: ../../fallow-cli/src/health_types/coverage.rs
4663
+ * [`UntestedFile`]: ../../fallow-output/src/health_coverage_gaps.rs
4634
4664
  */
4635
4665
  export interface UntestedFileAction {
4636
4666
  type: UntestedFileActionType
@@ -4693,7 +4723,7 @@ actions: UntestedExportAction[]
4693
4723
  * `add-test-import` reflects that a test-reachable reference chain, not
4694
4724
  * just any test coverage, is what closes the gap.
4695
4725
  *
4696
- * [`UntestedExport`]: ../../fallow-cli/src/health_types/coverage.rs
4726
+ * [`UntestedExport`]: ../../fallow-output/src/health_coverage_gaps.rs
4697
4727
  */
4698
4728
  export interface UntestedExportAction {
4699
4729
  type: UntestedExportActionType
@@ -4784,7 +4814,7 @@ commits: number
4784
4814
  * `ownership-drift`) are appended only when `--ownership` is active AND
4785
4815
  * the corresponding signal fires for the hotspot.
4786
4816
  *
4787
- * [`HotspotEntry`]: ../../fallow-cli/src/health_types/scores.rs
4817
+ * [`HotspotEntry`]: ../../fallow-output/src/health_scores.rs
4788
4818
  */
4789
4819
  export interface HotspotAction {
4790
4820
  type: HotspotActionType
@@ -4870,6 +4900,27 @@ watermark?: (RuntimeCoverageWatermark | null)
4870
4900
  * Non-fatal merge or coverage diagnostics. Omitted when empty.
4871
4901
  */
4872
4902
  warnings?: RuntimeCoverageMessage[]
4903
+ /**
4904
+ * Whether an autonomous agent may act on this report (fallow-rs/fallow-cloud#316,
4905
+ * mirrors the cloud runtime-context contract). `false` when the capture
4906
+ * carries no usable runtime evidence (no tracked functions); then
4907
+ * `actionability_verdict` is `insufficient_evidence` and
4908
+ * `actionability_reason` explains. F4: a non-action floor, never a gate on a
4909
+ * positive verdict.
4910
+ */
4911
+ actionable: boolean
4912
+ /**
4913
+ * Why the report is non-actionable; `null` when `actionable` is true.
4914
+ */
4915
+ actionability_reason?: (string | null)
4916
+ /**
4917
+ * First-class non-action verdict (`insufficient_evidence`) when not
4918
+ * actionable; `null` otherwise. Mirrors the cloud runtime-context `verdict`;
4919
+ * named distinctly from the report-context `verdict` above to avoid a
4920
+ * collision.
4921
+ */
4922
+ actionability_verdict?: (string | null)
4923
+ provenance: RuntimeCoverageProvenance
4873
4924
  }
4874
4925
  /**
4875
4926
  * Summary block mirroring `fallow_cov_protocol::Summary` (0.3 shape).
@@ -4910,7 +4961,7 @@ coverage_percent: number
4910
4961
  trace_count: number
4911
4962
  /**
4912
4963
  * Days of observation covered by the supplied dump (Phase 2 local analysis
4913
- * emits 0 , set by the beacon/cloud in Phase 3+).
4964
+ * emits 0, set by the beacon/cloud in Phase 3+).
4914
4965
  */
4915
4966
  period_days: number
4916
4967
  /**
@@ -5005,6 +5056,13 @@ evidence: RuntimeCoverageEvidence
5005
5056
  * Suggested actions for this finding. Omitted when empty.
5006
5057
  */
5007
5058
  actions?: RuntimeCoverageAction[]
5059
+ /**
5060
+ * The discriminator inputs that produced this verdict (#321), emitted so an
5061
+ * agent can reproduce it and see the confidence cap. `None` for findings
5062
+ * not built from the merge pipeline (e.g. baseline round-trips). Omitted
5063
+ * from JSON when absent.
5064
+ */
5065
+ discriminators?: (RuntimeCoverageDiscriminators | null)
5008
5066
  }
5009
5067
  /**
5010
5068
  * Supporting evidence for a finding (mirrors `fallow_cov_protocol::Evidence`).
@@ -5057,6 +5115,48 @@ description: string
5057
5115
  */
5058
5116
  auto_fixable: boolean
5059
5117
  }
5118
+ /**
5119
+ * Discriminator inputs that PRODUCED a finding's verdict (fallow-rs/fallow-cloud#321),
5120
+ * emitted alongside the verdict so an agent can reproduce it and see the
5121
+ * minimum-observation confidence cap instead of re-deriving them from scratch.
5122
+ * F4: these make the EXISTING Fallow-owned discriminators legible; they are not
5123
+ * a new or external signal and gate nothing. Pairs with `evidence.static_status`
5124
+ * (the static half of the discriminator set).
5125
+ */
5126
+ export interface RuntimeCoverageDiscriminators {
5127
+ /**
5128
+ * Three-state runtime tracking: `called` (invocations > 0), `never_called`
5129
+ * (V8 tracked it, invocations == 0), or `untracked` (V8 never saw it). The
5130
+ * ONLY signal that can issue a deletion verdict.
5131
+ */
5132
+ tracking_state: string
5133
+ /**
5134
+ * `invocations / trace_count` for this function; `null` when untracked (no
5135
+ * invocation count). The per-function value behind the low-traffic split.
5136
+ */
5137
+ invocation_ratio?: (number | null)
5138
+ /**
5139
+ * Active/low_traffic split ratio in effect (CLI default 0.001). A tracked
5140
+ * function whose `invocation_ratio` is below this reads `low_traffic`, else
5141
+ * `active`.
5142
+ */
5143
+ low_traffic_threshold: number
5144
+ /**
5145
+ * Total observed invocations across all functions (the `invocation_ratio`
5146
+ * denominator), echoed per finding so the verdict is self-contained.
5147
+ */
5148
+ trace_count: number
5149
+ /**
5150
+ * High-confidence verdict floor (CLI default 5000). When `trace_count` is
5151
+ * below it, confidence is capped regardless of the per-function signal.
5152
+ */
5153
+ min_observation_volume: number
5154
+ /**
5155
+ * `trace_count >= min_observation_volume`: whether the dump cleared the
5156
+ * confidence floor. `false` means this verdict's confidence is capped.
5157
+ */
5158
+ meets_observation_volume: boolean
5159
+ }
5060
5160
  export interface RuntimeCoverageHotPath {
5061
5161
  /**
5062
5162
  * Stable content-hash ID of the form `fallow:hot:<hash>`.
@@ -5194,6 +5294,44 @@ code: string
5194
5294
  */
5195
5295
  message: string
5196
5296
  }
5297
+ /**
5298
+ * Provenance of a runtime-coverage report (fallow-rs/fallow-cloud#319), mirroring
5299
+ * the cloud runtime-context `provenance` block so the local-capture and cloud
5300
+ * surfaces present one portable shape. F4: provenance is context only; it never
5301
+ * gates a verdict or confidence.
5302
+ */
5303
+ export interface RuntimeCoverageProvenance {
5304
+ data_source: RuntimeCoverageDataSource
5305
+ /**
5306
+ * `true` / `false` / `unknown`. Always `unknown` for a local capture: the
5307
+ * local path has no deployment-origin signal (the cloud may resolve it).
5308
+ */
5309
+ is_production: string
5310
+ /**
5311
+ * Age in whole days of the most recent evidence; `0` for a fresh local
5312
+ * capture, `null` when no runtime data is present.
5313
+ */
5314
+ freshness_days?: (number | null)
5315
+ /**
5316
+ * `functions_untracked / (functions_tracked + functions_untracked)`, in
5317
+ * `[0, 1]`. High ratios mark a thin / partial capture.
5318
+ */
5319
+ untracked_ratio: number
5320
+ /**
5321
+ * Fraction of resolution-attempted functions whose position could not be
5322
+ * mapped to source, in `[0, 1]`. `0` for a local capture (positions resolve
5323
+ * natively or via the sidecar).
5324
+ */
5325
+ unresolved_ratio: number
5326
+ /**
5327
+ * Whether `freshness_days` exceeds `stale_after_days`.
5328
+ */
5329
+ stale: boolean
5330
+ /**
5331
+ * The documented staleness cutoff (days), echoed so the rule travels in-band.
5332
+ */
5333
+ stale_after_days: number
5334
+ }
5197
5335
  /**
5198
5336
  * Combined coverage, runtime, complexity, and change-scope verdicts.
5199
5337
  */
@@ -5465,7 +5603,7 @@ fingerprint: string
5465
5603
  * the target's `evidence.complex_functions` back to the matching
5466
5604
  * `ComplexityViolation` and read placement from THAT action instead.
5467
5605
  *
5468
- * [`RefactoringTarget`]: ../../fallow-cli/src/health_types/targets.rs
5606
+ * [`RefactoringTarget`]: ../../fallow-output/src/health_targets.rs
5469
5607
  */
5470
5608
  export interface RefactoringTargetAction {
5471
5609
  type: RefactoringTargetActionType
@@ -5483,7 +5621,7 @@ description: string
5483
5621
  /**
5484
5622
  * Recommendation category for `apply-refactoring` actions. Mirrors
5485
5623
  * the parent target's
5486
- * [`category`](../../fallow-cli/src/health_types/targets.rs.html)
5624
+ * [`category`](../../fallow-output/src/health_targets.rs.html)
5487
5625
  * field so consumers can route on the action alone.
5488
5626
  */
5489
5627
  category?: (string | null)
@@ -5567,11 +5705,11 @@ snapshot_schema_version?: (number | null)
5567
5705
  */
5568
5706
  export interface TrendMetric {
5569
5707
  /**
5570
- * Metric identifier (e.g., `"score"`, `"dead_file_pct"`).
5708
+ * Metric identifier, e.g. `"score"` or `"dead_file_pct"`.
5571
5709
  */
5572
5710
  name: string
5573
5711
  /**
5574
- * Human-readable label (e.g., `"Health Score"`, `"Dead Files"`).
5712
+ * Human-readable label, e.g. `"Health Score"` or `"Dead Files"`.
5575
5713
  */
5576
5714
  label: string
5577
5715
  /**
@@ -5583,12 +5721,12 @@ previous: number
5583
5721
  */
5584
5722
  current: number
5585
5723
  /**
5586
- * Absolute change (current previous).
5724
+ * Absolute change (current - previous).
5587
5725
  */
5588
5726
  delta: number
5589
5727
  direction: TrendDirection
5590
5728
  /**
5591
- * Unit for display (e.g., `"%"`, `""`, `"pts"`).
5729
+ * Unit for display, e.g. `"%"`, `""`, or `"pts"`.
5592
5730
  */
5593
5731
  unit: string
5594
5732
  /**
@@ -5605,11 +5743,11 @@ current_count?: (TrendCount | null)
5605
5743
  */
5606
5744
  export interface TrendCount {
5607
5745
  /**
5608
- * The numerator (e.g., dead files count).
5746
+ * The numerator, e.g. dead files count.
5609
5747
  */
5610
5748
  value: number
5611
5749
  /**
5612
- * The denominator (e.g., total files).
5750
+ * The denominator, e.g. total files.
5613
5751
  */
5614
5752
  total: number
5615
5753
  }
@@ -5617,10 +5755,10 @@ total: number
5617
5755
  * Auditable breadcrumb recording when health-finding `suppress-line`
5618
5756
  * action hints were omitted from the report.
5619
5757
  *
5620
- * Set at construction time on [`HealthReport::actions_meta`] (and on
5621
- * each [`HealthGroup::actions_meta`](crate::health_types::HealthGroup)
5758
+ * Set at construction time on `HealthReport::actions_meta` (and on
5759
+ * each `HealthGroup::actions_meta`
5622
5760
  * when grouped) by the report builder, derived from the active
5623
- * [`HealthActionContext`]. Lets consumers see "where did the
5761
+ * `HealthActionContext`. Lets consumers see "where did the
5624
5762
  * suppress-line hints go?" without having to grep the config or CLI
5625
5763
  * history.
5626
5764
  *
@@ -5632,8 +5770,8 @@ total: number
5632
5770
  */
5633
5771
  export interface HealthActionsMeta {
5634
5772
  /**
5635
- * Always `true` when the breadcrumb is emitted. Absent from the wire
5636
- * when no suppression occurred.
5773
+ * Always `true` when the breadcrumb is emitted. Absent from the wire when
5774
+ * no suppression occurred.
5637
5775
  */
5638
5776
  suppression_hints_omitted: boolean
5639
5777
  /**
@@ -5770,6 +5908,18 @@ unused_font_faces?: UnusedFontFace[]
5770
5908
  * downstream repo. Sorted by `(path, line, token)`.
5771
5909
  */
5772
5910
  unused_theme_tokens?: UnusedThemeToken[]
5911
+ /**
5912
+ * A location-aware reverse index of Tailwind v4 `@theme` token consumers:
5913
+ * per token, where it is consumed (`var()` reads, `@apply` bodies, generated
5914
+ * utility classes) and through which surface, plus the full `consumer_count`
5915
+ * (a static lower bound) and the defining site. Built from the same gated
5916
+ * candidate set as `unused_theme_tokens` (v4 + non-plugin + non-published +
5917
+ * whole-scope), so a token with `consumer_count: 0` is the same "nothing
5918
+ * consumes this" signal. Sorted by token; empty when the project is not
5919
+ * Tailwind v4 or a plugin / published-library / partial-scope run gated the
5920
+ * scan out.
5921
+ */
5922
+ token_consumers?: TokenConsumers[]
5773
5923
  /**
5774
5924
  * The project authors `font-size` values in several units (`px`, `rem`,
5775
5925
  * `em`, `%`), with a per-unit distinct-value count: a type-scale
@@ -5956,11 +6106,16 @@ nesting_depth: number
5956
6106
  /**
5957
6107
  * Project-wide CSS analytics aggregates across every analyzed stylesheet
5958
6108
  * (including stylesheets with no notable rule, which are not listed
5959
- * individually).
6109
+ * individually in `files`).
5960
6110
  */
5961
6111
  export interface CssAnalyticsSummary {
5962
6112
  /**
5963
- * Stylesheets analyzed (standard CSS only; SCSS is skipped).
6113
+ * Stylesheets analyzed: standard `.css` files, Vue/Svelte SFC `<style>`
6114
+ * blocks, and (dep-gated) CSS-in-JS, both the tagged-template form and the
6115
+ * object form (`style({...})` / `stylex.create({...})` / `css({...})`). SCSS
6116
+ * is skipped. Note: flat atomic object CSS-in-JS (StyleX/Panda) is counted
6117
+ * here and contributes to these aggregates, but has no notable rules, so its
6118
+ * files never appear in the per-file `files` list.
5964
6119
  */
5965
6120
  files_analyzed: number
5966
6121
  /**
@@ -6414,6 +6569,92 @@ line: number
6414
6569
  */
6415
6570
  actions: CssCandidateAction[]
6416
6571
  }
6572
+ /**
6573
+ * A location-aware reverse index of where one design token is consumed, so an
6574
+ * agent editing the token can see its blast radius before changing or removing
6575
+ * it. Covers TWO token origins. The always-available discriminator is the `token`
6576
+ * SHAPE: a Tailwind token is the `--`-prefixed custom property (`--color-brand`),
6577
+ * a CSS-in-JS token is a dotted access path with no `--` prefix
6578
+ * (`vars.color.primary`). The per-consumer `kind` also discriminates origin, but
6579
+ * only when `consumer_count > 0` (a `consumer_count: 0` entry has an empty
6580
+ * `consumers` array and thus no `kind`), so branch on the `token` prefix for the
6581
+ * zero-consumer case. The two origins:
6582
+ *
6583
+ * - Tailwind v4 `@theme` tokens (kinds `theme-var` / `css-var` / `utility` /
6584
+ * `apply`), built from the same gated candidate set as `unused_theme_tokens`
6585
+ * (v4 + non-plugin + non-published + whole-scope), so a `consumer_count: 0`
6586
+ * corroborates the `unused_theme_tokens` "nothing consumes this" finding.
6587
+ * - CSS-in-JS tokens (kind `js-member`) from StyleX `defineVars` /
6588
+ * vanilla-extract `createTheme` family definitions, consumed via cross-module
6589
+ * member access. NOTE: CSS-in-JS has NO corroborating dead-token finding (there
6590
+ * is no `unused_theme_tokens` analogue), so a CSS-in-JS `consumer_count: 0` is a
6591
+ * weaker signal than the Tailwind case (and the cross-file scan is relative-import
6592
+ * only, so alias / bare-package imports are not counted).
6593
+ *
6594
+ * This is DESCRIPTIVE context (a blast-radius lookup), not a finding, so it
6595
+ * deliberately carries no `actions` array (unlike the cleanup-candidate types in
6596
+ * this module). `consumer_count` is always a STATIC lower bound (a computed class
6597
+ * name like `bg-${color}`, or a CSS-in-JS access through an unresolved alias
6598
+ * import, is not counted).
6599
+ */
6600
+ export interface TokenConsumers {
6601
+ /**
6602
+ * The token identity. For a Tailwind `@theme` token this is the full custom
6603
+ * property as authored, INCLUDING the `--` prefix (`--color-brand`). For a
6604
+ * CSS-in-JS token (kind `js-member`) this is the binding-qualified dotted
6605
+ * access path, NO `--` prefix (`vars.color.primary`), matching how consumers
6606
+ * read it. The presence of the `--` prefix distinguishes the two origins.
6607
+ */
6608
+ token: string
6609
+ /**
6610
+ * For a Tailwind token, the v4 theme namespace (`color`, `radius`,
6611
+ * `font-weight`, ...). For a CSS-in-JS token (kind `js-member`), the defining
6612
+ * export BINDING the token set is accessed through (`vars`), which identifies
6613
+ * the token set, NOT a semantic group. (The field is thus overloaded by
6614
+ * origin; branch on `consumers[].kind` or the `token` shape.)
6615
+ */
6616
+ namespace: string
6617
+ /**
6618
+ * Project-root-relative, forward-slash path to the declaring stylesheet
6619
+ * (Tailwind) or the JS/TS token-definition file (CSS-in-JS).
6620
+ */
6621
+ definition_path: string
6622
+ /**
6623
+ * 1-based line of the token's definition (inside the `@theme` block for
6624
+ * Tailwind; the token key inside the `defineVars`/`createTheme` object for
6625
+ * CSS-in-JS).
6626
+ */
6627
+ definition_line: number
6628
+ /**
6629
+ * The FULL number of consumer locations found, a STATIC LOWER BOUND: a
6630
+ * computed class name (`bg-${color}`) or a value read outside CSS/markup the
6631
+ * scan never sees is not counted. This is the aggregate over every consumer,
6632
+ * computed BEFORE [`consumers`](Self::consumers) is capped to a sample.
6633
+ */
6634
+ consumer_count: number
6635
+ /**
6636
+ * A capped, deterministically-sorted sample of consumer locations (at most
6637
+ * [`TOKEN_CONSUMER_SAMPLE_CAP`]). The full count lives in
6638
+ * [`consumer_count`](Self::consumer_count); use this list to jump to
6639
+ * representative consumers, not to enumerate every one.
6640
+ */
6641
+ consumers: TokenConsumerLocation[]
6642
+ }
6643
+ /**
6644
+ * Where one Tailwind v4 `@theme` token is consumed, and through which surface.
6645
+ * One entry in a [`TokenConsumers::consumers`] sample.
6646
+ */
6647
+ export interface TokenConsumerLocation {
6648
+ /**
6649
+ * Project-root-relative, forward-slash path to the consuming file.
6650
+ */
6651
+ path: string
6652
+ /**
6653
+ * 1-based line of the consuming reference in that file.
6654
+ */
6655
+ line: number
6656
+ kind: ConsumerKind
6657
+ }
6417
6658
  /**
6418
6659
  * A design-token notation-consistency candidate: the distinct notations used
6419
6660
  * across the codebase for one value axis (today, length units on `font-size`),
@@ -6452,6 +6693,75 @@ notation: string
6452
6693
  */
6453
6694
  count: number
6454
6695
  }
6696
+ /**
6697
+ * Project-level styling-health score: a SECOND health axis computed purely from
6698
+ * the structural CSS analytics (`CssAnalyticsReport`), orthogonal to the JS/TS
6699
+ * code-health [`HealthScore`]. Surfaced only alongside the `--css` analytics, so
6700
+ * a plain `fallow health` run is byte-unchanged. The code score and grade stay
6701
+ * untouched: styling health is additive, never folded into the code score.
6702
+ *
6703
+ * Like [`HealthScore`], the score starts at 100 and subtracts capped per-category
6704
+ * penalties; the grade reuses the shared [`letter_grade`] thresholds verbatim
6705
+ * (A>=85, B>=70, C>=55, D>=40, F<40), so the two axes are read on one scale.
6706
+ */
6707
+ export interface StylingHealth {
6708
+ formula_version: number
6709
+ score: number
6710
+ grade: string
6711
+ penalties: StylingHealthPenalties
6712
+ confidence: StylingHealthConfidence
6713
+ /**
6714
+ * Human-readable reason the grade is low-confidence: either the declaration
6715
+ * and stylesheet counts a thin grade was computed from, or that structure is
6716
+ * not assessable for compile-time-atomic CSS-in-JS. `None` when confidence is
6717
+ * `High`. Prose, not a stable machine field: gate on `confidence`, not on
6718
+ * this string.
6719
+ */
6720
+ confidence_reason?: (string | null)
6721
+ }
6722
+ /**
6723
+ * Per-category penalty breakdown for the styling-health score. Each field is the
6724
+ * number of points subtracted from a starting 100 for one CSS signal family,
6725
+ * already capped at its category ceiling. A `0.0` field means "the signal was
6726
+ * evaluated and clean"; the whole struct is only ever built when CSS analytics
6727
+ * were produced, so there is no "missing pipeline" ambiguity to model with
6728
+ * `Option` here (the parent `StylingHealth` is itself `Option` on the report).
6729
+ */
6730
+ export interface StylingHealthPenalties {
6731
+ /**
6732
+ * Copy-paste declaration blocks (`duplicate_declaration_blocks`), scaled by
6733
+ * total removable declarations. Capped at 20pt.
6734
+ */
6735
+ duplication: number
6736
+ /**
6737
+ * Dead styling surface, two independently-normalized terms summed and capped
6738
+ * at 20pt: (a) unused `@theme` tokens as a share of the total `@theme` token
6739
+ * population (size-independent, so a declaration-sparse Tailwind project is
6740
+ * not penalized for a few dead tokens); plus (b) the other dead entities
6741
+ * (unreferenced classes, unused `@property`/`@layer` at-rules, dead
6742
+ * `@font-face` families) as a share of `total_declarations`.
6743
+ */
6744
+ dead_surface: number
6745
+ /**
6746
+ * Broken references: markup classes one edit from a defined class
6747
+ * (`unresolved_class_references`) and animations referencing a `@keyframes`
6748
+ * defined nowhere (`undefined_keyframes`). Capped at 15pt.
6749
+ */
6750
+ broken_references: number
6751
+ /**
6752
+ * Design-token erosion: mixed `font-size` units (`font_size_unit_mix`),
6753
+ * Tailwind arbitrary-value bypasses (`tailwind_arbitrary_values`), and
6754
+ * distinct HARDCODED `box-shadow`/`border-radius`/`line-height` values above
6755
+ * per-axis baselines (the v3 value-sprawl drift sub-term; `var(--*)`-
6756
+ * referenced values are not counted). Capped at 10pt.
6757
+ */
6758
+ token_erosion: number
6759
+ /**
6760
+ * Structural smells from the summary aggregates: `!important` density and
6761
+ * deep style-rule nesting. Capped at 10pt.
6762
+ */
6763
+ structural: number
6764
+ }
6455
6765
  /**
6456
6766
  * Envelope emitted by `fallow explain <issue-type> --format json`.
6457
6767
  *
@@ -6648,10 +6958,9 @@ _meta?: (Meta | null)
6648
6958
  }
6649
6959
  /**
6650
6960
  * Envelope emitted by `fallow list --boundaries --format json`. Surfaces
6651
- * the architecture boundary zones, rules, and (issue #373) the user's
6652
- * pre-expansion `autoDiscover` logical groups so consumers can render
6653
- * grouping intent that `expand_auto_discover` would otherwise flatten out
6654
- * of `zones[]`.
6961
+ * the architecture boundary zones, rules, and the user's pre-expansion
6962
+ * `autoDiscover` logical groups so consumers can render grouping intent that
6963
+ * expansion would otherwise flatten out of `zones[]`.
6655
6964
  */
6656
6965
  export interface ListBoundariesOutput {
6657
6966
  boundaries: BoundariesListing
@@ -6688,10 +6997,10 @@ from: string
6688
6997
  allow: string[]
6689
6998
  }
6690
6999
  /**
6691
- * A pre-expansion `autoDiscover` logical group surfaced for observability
6692
- * (issue #373). Captured during `expand_auto_discover` so consumers can
6693
- * see the user-authored parent name and grouping intent after expansion
6694
- * would otherwise flatten it out of [`BoundariesListing::zones`].
7000
+ * A pre-expansion `autoDiscover` logical group surfaced for observability.
7001
+ * Captured during expansion so consumers can see the user-authored parent
7002
+ * name and grouping intent after expansion would otherwise flatten it out of
7003
+ * [`BoundariesListing::zones`].
6695
7004
  */
6696
7005
  export interface BoundariesListLogicalGroup {
6697
7006
  name: string
@@ -6779,7 +7088,7 @@ elapsed_ms: ElapsedMs
6779
7088
  /**
6780
7089
  * Functions and synthetic template entries exceeding complexity
6781
7090
  * thresholds, sorted by the --sort criteria. Each entry wraps its
6782
- * inner [`ComplexityViolation`] payload (flattened on the wire) with
7091
+ * inner `ComplexityViolation` payload (flattened on the wire) with
6783
7092
  * the typed `actions` list and an optional audit-mode `introduced`
6784
7093
  * flag.
6785
7094
  */
@@ -6824,7 +7133,7 @@ prop_drilling_chains?: PropDrillingChainFinding[]
6824
7133
  /**
6825
7134
  * Hotspot entries combining git churn with complexity. Only present when
6826
7135
  * --hotspots is used. Sorted by score descending (highest risk first).
6827
- * Each entry wraps its inner [`HotspotEntry`] payload (flattened on the
7136
+ * Each entry wraps its inner `HotspotEntry` payload (flattened on the
6828
7137
  * wire) with a typed `actions` list.
6829
7138
  */
6830
7139
  hotspots?: HotspotFinding[]
@@ -6849,7 +7158,7 @@ large_functions?: LargeFunctionEntry[]
6849
7158
  /**
6850
7159
  * Ranked refactoring recommendations. Only present when --targets is used.
6851
7160
  * Sorted by efficiency (priority/effort) descending. Each entry wraps
6852
- * its inner [`RefactoringTarget`] payload (flattened on the wire) with
7161
+ * its inner `RefactoringTarget` payload (flattened on the wire) with
6853
7162
  * a typed `actions` list.
6854
7163
  */
6855
7164
  targets?: RefactoringTargetFinding[]
@@ -6880,13 +7189,21 @@ framework_health?: (FrameworkHealthDiagnostics | null)
6880
7189
  * over-complex selectors, deep nesting). Present only with `--css`.
6881
7190
  */
6882
7191
  css_analytics?: (CssAnalyticsReport | null)
7192
+ /**
7193
+ * Styling-health score and letter grade: a SECOND health axis derived from
7194
+ * the CSS analytics (the design-system axis), orthogonal to the JS/TS code
7195
+ * `health_score`. Present only with `--css` (the same condition as
7196
+ * `css_analytics`), so a plain `fallow health` run is byte-unchanged. The
7197
+ * code score is never affected by this field.
7198
+ */
7199
+ styling_health?: (StylingHealth | null)
6883
7200
  grouped_by?: (GroupByMode | null)
6884
7201
  groups?: (HealthGroup[] | null)
6885
7202
  _meta?: (Meta | null)
6886
7203
  workspace_diagnostics?: WorkspaceDiagnostic[]
6887
7204
  /**
6888
7205
  * Read-only follow-up commands computed from this run's findings. See
6889
- * [`CheckOutput::next_steps`] for the contract.
7206
+ * `CheckOutput::next_steps` for the contract.
6890
7207
  */
6891
7208
  next_steps?: NextStep[]
6892
7209
  }
@@ -6901,7 +7218,7 @@ next_steps?: NextStep[]
6901
7218
  * files in the group, so they answer "what is the health of workspace X" in
6902
7219
  * a single invocation. `files_analyzed` and `functions_above_threshold`
6903
7220
  * summarise the subset for parity with the project-level
6904
- * [`crate::health_types::HealthSummary`].
7221
+ * project-level health summary.
6905
7222
  */
6906
7223
  export interface HealthGroup {
6907
7224
  /**
@@ -6948,7 +7265,7 @@ health_score?: (HealthScore | null)
6948
7265
  /**
6949
7266
  * Findings restricted to files in this group. Each entry is the typed
6950
7267
  * [`HealthFinding`] wrapper around a
6951
- * [`ComplexityViolation`](crate::health_types::ComplexityViolation)
7268
+ * `ComplexityViolation`
6952
7269
  * payload.
6953
7270
  */
6954
7271
  findings?: HealthFinding[]
@@ -6959,7 +7276,7 @@ file_scores?: FileHealthScore[]
6959
7276
  /**
6960
7277
  * Hotspots restricted to files in this group. Each entry is the typed
6961
7278
  * [`HotspotFinding`] wrapper around a
6962
- * [`HotspotEntry`](crate::health_types::HotspotEntry) payload.
7279
+ * `HotspotEntry` payload.
6963
7280
  */
6964
7281
  hotspots?: HotspotFinding[]
6965
7282
  /**
@@ -6969,7 +7286,7 @@ large_functions?: LargeFunctionEntry[]
6969
7286
  /**
6970
7287
  * Refactoring targets in files belonging to this group. Each entry is
6971
7288
  * the typed [`RefactoringTargetFinding`] wrapper around a
6972
- * [`RefactoringTarget`](crate::health_types::RefactoringTarget)
7289
+ * `RefactoringTarget`
6973
7290
  * payload.
6974
7291
  */
6975
7292
  targets?: RefactoringTargetFinding[]
@@ -6977,21 +7294,17 @@ targets?: RefactoringTargetFinding[]
6977
7294
  * Auditable breadcrumb recording why `suppress-line` action hints
6978
7295
  * were omitted from this group's findings. Mirrors the project-level
6979
7296
  * `HealthReport.actions_meta`; populated at construction time when the
6980
- * per-group [`HealthActionContext`](crate::health_types::HealthActionContext)
7297
+ * per-group `HealthActionContext`
6981
7298
  * suppresses inline hints.
6982
7299
  */
6983
7300
  actions_meta?: (HealthActionsMeta | null)
6984
7301
  }
6985
7302
  /**
6986
- * Wire-shape payload for `fallow dupes --format json` (the body that
6987
- * flattens into [`crate::output_envelope::DupesOutput`] and is also
6988
- * emitted under the `dupes` / `duplication` key inside the combined and
6989
- * audit envelopes).
7303
+ * Envelope emitted by `fallow dupes --format json`.
6990
7304
  *
6991
- * Mirrors [`DuplicationReport`] field-for-field, except `clone_groups`
6992
- * and `clone_families` carry the typed wrapper envelopes instead of bare
6993
- * findings, so the schema (and any TS / agent consumer) sees the typed
6994
- * `actions[]` natively.
7305
+ * `Report` and `Group` are generic so the envelope can live in
7306
+ * `fallow-output` while duplication report wrappers and grouped output
7307
+ * internals continue to migrate out of CLI/API-specific crates.
6995
7308
  */
6996
7309
  export interface DupesOutput {
6997
7310
  schema_version: SchemaVersion
@@ -7003,8 +7316,8 @@ elapsed_ms: ElapsedMs
7003
7316
  clone_groups: CloneGroupFinding[]
7004
7317
  /**
7005
7318
  * Clone families, each wrapped with typed actions. Inner `groups`
7006
- * inside each [`CloneFamilyFinding`] are themselves wrapped as
7007
- * [`CloneGroupFinding`] entries carrying their own `actions[]` (and
7319
+ * inside each `CloneFamilyFinding` are themselves wrapped as
7320
+ * `CloneGroupFinding` entries carrying their own `actions[]` (and
7008
7321
  * optional audit-mode `introduced` flag), so JSON-Schema strict
7009
7322
  * consumers and TS consumers reading `clone_families[].groups[]` see
7010
7323
  * the same shape as the top-level `clone_groups[]` array (preserves
@@ -7026,7 +7339,7 @@ groups?: (DuplicationGroup[] | null)
7026
7339
  _meta?: (Meta | null)
7027
7340
  /**
7028
7341
  * Workspace-discovery diagnostics surfaced during config load
7029
- * (issue #473). See [`CheckOutput::workspace_diagnostics`] for the full
7342
+ * (issue #473). See `CheckOutput::workspace_diagnostics` for the full
7030
7343
  * contract; the same list is repeated on each top-level command's
7031
7344
  * envelope so single-command consumers see it without having to look at
7032
7345
  * a separate top-level field.
@@ -7034,7 +7347,7 @@ _meta?: (Meta | null)
7034
7347
  workspace_diagnostics?: WorkspaceDiagnostic[]
7035
7348
  /**
7036
7349
  * Read-only follow-up commands computed from this run's findings. See
7037
- * [`CheckOutput::next_steps`] for the contract.
7350
+ * `CheckOutput::next_steps` for the contract.
7038
7351
  */
7039
7352
  next_steps?: NextStep[]
7040
7353
  }
@@ -7067,7 +7380,7 @@ clone_families: CloneFamilyFinding[]
7067
7380
  * Wire-shape envelope for an [`AttributedCloneGroup`] finding (per-bucket
7068
7381
  * duplication attribution emitted under `fallow dupes --group-by`).
7069
7382
  * Flattens the attributed group and carries the same typed
7070
- * `CloneGroupAction` array as [`CloneGroupFinding`]; no `introduced`
7383
+ * `CloneGroupAction` array as `CloneGroupFinding`; no `introduced`
7071
7384
  * field because `fallow audit` does not run on grouped output.
7072
7385
  */
7073
7386
  export interface AttributedCloneGroupFinding {
@@ -7076,7 +7389,13 @@ export interface AttributedCloneGroupFinding {
7076
7389
  * this clone group. Ties broken alphabetically (smallest key wins).
7077
7390
  */
7078
7391
  primary_owner: string
7392
+ /**
7393
+ * Number of tokens in the clone group.
7394
+ */
7079
7395
  token_count: number
7396
+ /**
7397
+ * Number of source lines in the clone group.
7398
+ */
7080
7399
  line_count: number
7081
7400
  /**
7082
7401
  * Each instance carries its own `owner` field alongside the standard
@@ -7486,7 +7805,7 @@ thin_wrappers?: ThinWrapperFinding[]
7486
7805
  duplicate_prop_shapes?: DuplicatePropShapeFinding[]
7487
7806
  }
7488
7807
  /**
7489
- * The rendered impact report, derived purely from the store (no analysis run).
7808
+ * The rendered impact report, derived purely from the store.
7490
7809
  */
7491
7810
  export interface ImpactReport {
7492
7811
  schema_version: ImpactReportSchemaVersion
@@ -7582,18 +7901,24 @@ duplication: number
7582
7901
  export interface TrendSummary {
7583
7902
  direction: ImpactTrendDirection
7584
7903
  /**
7585
- * Signed delta in total issues (current minus previous).
7904
+ * Signed delta in total issues, current minus previous.
7586
7905
  */
7587
7906
  total_delta: number
7588
7907
  previous_total: number
7589
7908
  current_total: number
7590
7909
  }
7910
+ /**
7911
+ * A commit-gate containment event recorded by `fallow impact`.
7912
+ */
7591
7913
  export interface ContainmentEvent {
7592
7914
  blocked_at: string
7593
7915
  cleared_at: string
7594
7916
  git_sha?: (string | null)
7595
7917
  blocked_counts: ImpactCounts
7596
7918
  }
7919
+ /**
7920
+ * A resolved or suppressed finding attribution event.
7921
+ */
7597
7922
  export interface ResolutionEvent {
7598
7923
  kind: string
7599
7924
  path: string
@@ -7602,7 +7927,7 @@ git_sha?: (string | null)
7602
7927
  timestamp: string
7603
7928
  }
7604
7929
  /**
7605
- * The cross-repo aggregate report (`fallow impact --all --format json`).
7930
+ * The cross-repo aggregate report, `fallow impact --all --format json`.
7606
7931
  */
7607
7932
  export interface CrossRepoImpactReport {
7608
7933
  schema_version: CrossRepoImpactSchemaVersion
@@ -8235,17 +8560,8 @@ top_files_limit: number
8235
8560
  * One sampled unresolved-callee row.
8236
8561
  */
8237
8562
  export interface SecurityUnresolvedCalleeSample {
8238
- /**
8239
- * Project-relative source path.
8240
- */
8241
8563
  path: string
8242
- /**
8243
- * 1-based source line.
8244
- */
8245
8564
  line: number
8246
- /**
8247
- * 0-based byte column.
8248
- */
8249
8565
  col: number
8250
8566
  reason: SkippedSecurityCalleeReason
8251
8567
  expression_kind: SkippedSecurityCalleeExpressionKind
@@ -8254,9 +8570,6 @@ expression_kind: SkippedSecurityCalleeExpressionKind
8254
8570
  * Count of unresolved callees in one file.
8255
8571
  */
8256
8572
  export interface SecurityUnresolvedCalleeTopFile {
8257
- /**
8258
- * Project-relative source path.
8259
- */
8260
8573
  path: string
8261
8574
  /**
8262
8575
  * Number of unresolved callees in this file.
@@ -8397,13 +8710,7 @@ export interface SecuritySurvivor {
8397
8710
  */
8398
8711
  finding_id: string
8399
8712
  verdict: SecurityVerifierVerdictStatus
8400
- /**
8401
- * Short verifier reason.
8402
- */
8403
8713
  reason?: (string | null)
8404
- /**
8405
- * Short verifier rationale.
8406
- */
8407
8714
  rationale?: (string | null)
8408
8715
  /**
8409
8716
  * Optional verifier-provided confidence or review priority.
@@ -8463,9 +8770,6 @@ suggestion: string
8463
8770
  * One file inside a blind-spot group.
8464
8771
  */
8465
8772
  export interface SecurityBlindSpotFile {
8466
- /**
8467
- * Project-relative source path.
8468
- */
8469
8773
  path: string
8470
8774
  /**
8471
8775
  * Count in the bounded diagnostic sample.
@@ -8485,10 +8789,13 @@ dupes?: (DupesReportPayload | null)
8485
8789
  health?: (HealthReport | null)
8486
8790
  /**
8487
8791
  * Read-only follow-up commands aggregated across the combined run's
8488
- * findings. See [`CheckOutput::next_steps`] for the contract.
8792
+ * findings. See `CheckOutput::next_steps` for the contract.
8489
8793
  */
8490
8794
  next_steps?: NextStep[]
8491
8795
  }
8796
+ /**
8797
+ * Optional `_meta` block for [`CombinedOutput`].
8798
+ */
8492
8799
  export interface CombinedMeta {
8493
8800
  check?: (Meta | null)
8494
8801
  dupes?: (Meta | null)
@@ -8677,10 +8984,11 @@ export interface FocusMap {
8677
8984
  */
8678
8985
  review_here: FocusUnit[]
8679
8986
  /**
8680
- * EVERY `not-prioritized` unit (the escape hatch). Always present and fully
8987
+ * EVERY de-prioritized unit (`not-prioritized`, plus runtime-backed `skip`
8988
+ * units on the paid path) -- the escape hatch. Always present and fully
8681
8989
  * enumerated so a reviewer can always "show me what you de-prioritized"; the
8682
8990
  * human brief collapses it by default and re-expands under
8683
- * `--show-deprioritized`.
8991
+ * `--show-deprioritized`. Nothing is ever hidden, including a `skip`.
8684
8992
  */
8685
8993
  deprioritized: FocusUnit[]
8686
8994
  }
@@ -8705,9 +9013,9 @@ reason: string
8705
9013
  confidence?: ConfidenceFlag[]
8706
9014
  }
8707
9015
  /**
8708
- * The composite attention score, with the four deterministic component
8709
- * sub-scores kept on the wire so the runtime seam can re-weight `total`
8710
- * without recomputing the signals.
9016
+ * The composite attention score, with the deterministic component sub-scores
9017
+ * kept on the wire so the runtime layer adds its weight without recomputing the
9018
+ * signals.
8711
9019
  */
8712
9020
  export interface FocusScore {
8713
9021
  /**
@@ -8728,7 +9036,16 @@ risk_zone: number
8728
9036
  */
8729
9037
  change_shape: number
8730
9038
  /**
8731
- * The summed total. The paid runtime layer multiplies a runtime hot/cold weight in here.
9039
+ * Runtime-weight component (paid): a hot path (runtime evidence of high
9040
+ * invocation) adds an invocation-bucketed weight so it amplifies the blast
9041
+ * and outranks an otherwise-equal cold unit. `0` in free mode (no runtime
9042
+ * input), so the free-tier total stays the four deterministic components and
9043
+ * is byte-identical to the no-runtime baseline.
9044
+ */
9045
+ runtime?: number
9046
+ /**
9047
+ * The summed total of every present component (the four deterministic ones
9048
+ * plus the runtime weight).
8732
9049
  */
8733
9050
  total: number
8734
9051
  }
@@ -8786,7 +9103,7 @@ export interface RoutingFacts {
8786
9103
  units: RoutingUnit[]
8787
9104
  }
8788
9105
  /**
8789
- * One routed unit (a changed file) with its experts and bus-factor flag.
9106
+ * One routed unit with its experts and bus-factor flag.
8790
9107
  */
8791
9108
  export interface RoutingUnit {
8792
9109
  /**
@@ -8810,11 +9127,11 @@ bus_factor_one?: boolean
8810
9127
  */
8811
9128
  export interface DecisionSurface {
8812
9129
  /**
8813
- * Up to `cap` ranked decisions, highest consequence first.
9130
+ * Ranked decisions, highest consequence first.
8814
9131
  */
8815
9132
  decisions: Decision[]
8816
9133
  /**
8817
- * Present when more than `cap` decisions were extracted.
9134
+ * Present when more than the cap were extracted.
8818
9135
  */
8819
9136
  truncated?: (TruncationNote | null)
8820
9137
  /**
@@ -8840,7 +9157,7 @@ category: DecisionCategory
8840
9157
  */
8841
9158
  question: string
8842
9159
  /**
8843
- * Root-relative file the decision is anchored at (for suppression + routing).
9160
+ * Root-relative file the decision is anchored at.
8844
9161
  */
8845
9162
  anchor_file: string
8846
9163
  /**
@@ -8848,7 +9165,7 @@ anchor_file: string
8848
9165
  */
8849
9166
  anchor_line: number
8850
9167
  /**
8851
- * The raw fallow-emitted candidate key the `signal_id` hashes (the evidence).
9168
+ * The raw fallow-emitted candidate key the `signal_id` hashes.
8852
9169
  */
8853
9170
  signal_key: string
8854
9171
  /**
@@ -8873,7 +9190,7 @@ consequence: number
8873
9190
  */
8874
9191
  expert: string[]
8875
9192
  /**
8876
- * Whether the anchor file's only qualified owner is one person (bus-factor-1).
9193
+ * Whether the anchor file's only qualified owner is one person.
8877
9194
  */
8878
9195
  bus_factor_one?: boolean
8879
9196
  /**
@@ -8894,7 +9211,7 @@ internal_consumer_count: number
8894
9211
  tradeoff: string
8895
9212
  }
8896
9213
  /**
8897
- * A note for the decisions collapsed below the cap.
9214
+ * A note for decisions collapsed below the cap.
8898
9215
  */
8899
9216
  export interface TruncationNote {
8900
9217
  /**
@@ -8955,7 +9272,7 @@ export interface ReviewDirection {
8955
9272
  */
8956
9273
  order: string[]
8957
9274
  /**
8958
- * The coherent review units, in `order`.
9275
+ * Coherent review units, in `order`.
8959
9276
  */
8960
9277
  units: DirectionUnit[]
8961
9278
  }
@@ -8986,7 +9303,7 @@ scoring_budget: number
8986
9303
  */
8987
9304
  out_of_diff: string[]
8988
9305
  /**
8989
- * The routed expert(s) to ask, from ownership routing.
9306
+ * Routed expert(s), when ownership signals are available.
8990
9307
  */
8991
9308
  expert: string[]
8992
9309
  }
@@ -9041,7 +9358,7 @@ judgment_shape: string
9041
9358
  */
9042
9359
  echo_field: string
9043
9360
  /**
9044
- * The constant naming the anti-hallucination rule.
9361
+ * The anchoring rule name.
9045
9362
  */
9046
9363
  anchoring_rule: string
9047
9364
  }
@@ -9114,11 +9431,11 @@ change_anchor: string
9114
9431
  */
9115
9432
  anchor_kind: string
9116
9433
  /**
9117
- * The agent's framing, FENCED: this is non-deterministic agent prose.
9434
+ * The agent's fenced free-text framing.
9118
9435
  */
9119
9436
  agent_framing: string
9120
9437
  /**
9121
- * The agent's optional concern category (advisory).
9438
+ * The agent's optional concern category.
9122
9439
  */
9123
9440
  concern?: (string | null)
9124
9441
  /**
@@ -9159,6 +9476,15 @@ categories: string[]
9159
9476
  severity: CodeClimateSeverity
9160
9477
  fingerprint: string
9161
9478
  location: CodeClimateLocation
9479
+ /**
9480
+ * Optional owner attribution used by grouped dead-code output.
9481
+ */
9482
+ owner?: (string | null)
9483
+ /**
9484
+ * Optional grouping attribution used by grouped health and duplication
9485
+ * output.
9486
+ */
9487
+ group?: (string | null)
9162
9488
  }
9163
9489
  /**
9164
9490
  * Location block inside [`CodeClimateIssue::location`].