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.
- package/README.md +2 -2
- package/package.json +10 -10
- package/schema.json +17 -0
- package/skills/fallow/SKILL.md +11 -10
- package/skills/fallow/references/cli-reference.md +60 -12
- package/skills/fallow/references/gotchas.md +13 -7
- package/skills/fallow/references/patterns.md +5 -5
- package/types/output-contract.d.ts +448 -122
|
@@ -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.
|
|
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
|
|
38
|
-
*
|
|
39
|
-
*
|
|
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
|
|
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.
|
|
788
|
-
*
|
|
789
|
-
*
|
|
790
|
-
*
|
|
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
|
-
*
|
|
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
|
|
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
|
|
3631
|
-
*
|
|
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
|
|
3722
|
-
*
|
|
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
|
-
*
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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-
|
|
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
|
|
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 (0
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
|
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-
|
|
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-
|
|
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
|
|
5708
|
+
* Metric identifier, e.g. `"score"` or `"dead_file_pct"`.
|
|
5571
5709
|
*/
|
|
5572
5710
|
name: string
|
|
5573
5711
|
/**
|
|
5574
|
-
* Human-readable label
|
|
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
|
|
5724
|
+
* Absolute change (current - previous).
|
|
5587
5725
|
*/
|
|
5588
5726
|
delta: number
|
|
5589
5727
|
direction: TrendDirection
|
|
5590
5728
|
/**
|
|
5591
|
-
* Unit for display
|
|
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
|
|
5746
|
+
* The numerator, e.g. dead files count.
|
|
5609
5747
|
*/
|
|
5610
5748
|
value: number
|
|
5611
5749
|
/**
|
|
5612
|
-
* The denominator
|
|
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
|
|
5621
|
-
* each
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
|
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
|
|
6652
|
-
*
|
|
6653
|
-
*
|
|
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
|
-
*
|
|
6693
|
-
*
|
|
6694
|
-
*
|
|
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
|
|
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
|
|
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
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
|
7297
|
+
* per-group `HealthActionContext`
|
|
6981
7298
|
* suppresses inline hints.
|
|
6982
7299
|
*/
|
|
6983
7300
|
actions_meta?: (HealthActionsMeta | null)
|
|
6984
7301
|
}
|
|
6985
7302
|
/**
|
|
6986
|
-
*
|
|
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
|
-
*
|
|
6992
|
-
*
|
|
6993
|
-
*
|
|
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
|
|
7007
|
-
*
|
|
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
|
|
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
|
-
*
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
8709
|
-
*
|
|
8710
|
-
*
|
|
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
|
-
*
|
|
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
|
|
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
|
-
*
|
|
9130
|
+
* Ranked decisions, highest consequence first.
|
|
8814
9131
|
*/
|
|
8815
9132
|
decisions: Decision[]
|
|
8816
9133
|
/**
|
|
8817
|
-
* Present when more than
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
|
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
|
|
9434
|
+
* The agent's fenced free-text framing.
|
|
9118
9435
|
*/
|
|
9119
9436
|
agent_framing: string
|
|
9120
9437
|
/**
|
|
9121
|
-
* The agent's optional concern category
|
|
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`].
|