fallow 3.42.0 → 3.43.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.
@@ -228,7 +228,15 @@ export type TypeAwareAbstentionReason = ("no-project" | "ambiguous-project" | "b
228
228
  /**
229
229
  * Schema projection for the dead-code envelope's exact version.
230
230
  */
231
- export type CheckSchemaVersion = 10
231
+ export type CheckSchemaVersion = 11
232
+ /**
233
+ * A direct property operation. Calls are not classified as writes.
234
+ */
235
+ export type StateOperation = ("read" | "assign" | "read_modify_write" | "update" | "delete")
236
+ /**
237
+ * Runtime relationships that static observations cannot establish.
238
+ */
239
+ export type UnknownStateRelation = "unknown"
232
240
  /**
233
241
  * A suggested action attached to a finding in the JSON output. Each finding
234
242
  * carries an `actions` array; consumers (agents, IDE clients, CI bots) can
@@ -285,7 +293,7 @@ export type IssueAction = (FixAction | SuppressLineAction | SuppressFileAction |
285
293
  * Discriminant string for [`FixAction`]. Kebab-case per the JSON output
286
294
  * contract.
287
295
  */
288
- export type FixActionType = ("remove-export" | "delete-file" | "remove-dependency" | "move-dependency" | "remove-enum-member" | "remove-class-member" | "resolve-import" | "install-dependency" | "remove-duplicate" | "move-to-dev" | "move-to-prod" | "refactor-cycle" | "refactor-re-export-cycle" | "refactor-boundary" | "export-type" | "migrate-deprecated-export" | "remove-catalog-entry" | "remove-empty-catalog-group" | "update-catalog-reference" | "add-catalog-entry" | "remove-catalog-reference" | "remove-dependency-override" | "fix-dependency-override" | "resolve-policy-violation" | "move-to-server-module" | "split-mixed-barrel" | "hoist-directive" | "wire-server-action" | "provide-inject" | "use-load-data" | "render-component" | "use-component-prop" | "review-component-prop" | "emit-component-event" | "wire-svelte-event" | "compose-effect-layer" | "fail-tagged-error" | "remove-catch-tag-handler" | "resolve-route-collision" | "resolve-dynamic-segment-name-conflict" | "add-suppression-reason" | "remove-stale-suppression")
296
+ export type FixActionType = ("remove-export" | "delete-file" | "remove-dependency" | "move-dependency" | "remove-enum-member" | "remove-class-member" | "resolve-import" | "install-dependency" | "remove-duplicate" | "move-to-dev" | "move-to-prod" | "refactor-cycle" | "refactor-re-export-cycle" | "refactor-boundary" | "export-type" | "migrate-deprecated-export" | "remove-catalog-entry" | "remove-empty-catalog-group" | "update-catalog-reference" | "add-catalog-entry" | "remove-catalog-reference" | "remove-dependency-override" | "fix-dependency-override" | "resolve-policy-violation" | "move-to-server-module" | "split-mixed-barrel" | "hoist-directive" | "wire-server-action" | "provide-inject" | "use-load-data" | "render-component" | "use-component-prop" | "review-component-prop" | "review-constant-parameter" | "emit-component-event" | "wire-svelte-event" | "compose-effect-layer" | "fail-tagged-error" | "remove-catch-tag-handler" | "resolve-route-collision" | "resolve-dynamic-segment-name-conflict" | "add-suppression-reason" | "remove-stale-suppression")
289
297
  /**
290
298
  * Singleton discriminant for [`SuppressLineAction`].
291
299
  */
@@ -461,6 +469,19 @@ export type DependencyOverrideSource = ("pnpm-workspace.yaml" | "package.json")
461
469
  * surfacing them statically catches the issue first.
462
470
  */
463
471
  export type DependencyOverrideMisconfigReason = ("unparsable-key" | "empty-value")
472
+ /**
473
+ * Why the rule reports a parameter.
474
+ */
475
+ export type ConstantParameterReason = ("identical-argument" | "never-passed" | "unused-default")
476
+ /**
477
+ * The evidence that a [`ConstantParameter`] finding needs beyond the
478
+ * syntactic call facts.
479
+ */
480
+ export type ConstantParameterEvidence = "type-aware"
481
+ /**
482
+ * The type of a [`ConstantParameterValue`].
483
+ */
484
+ export type ConstantParameterValueKind = ("boolean" | "null" | "undefined" | "number" | "string" | "binding")
464
485
  /**
465
486
  * Kind of an Effect layer definition.
466
487
  */
@@ -666,6 +687,8 @@ kind: "boundaries-not-configured"
666
687
  } | {
667
688
  kind: "rule-packs-not-configured"
668
689
  } | {
690
+ kind: "client-server-leak-no-client-roots"
691
+ } | {
669
692
  kind: "excluded-by-default-ignore"
670
693
  /**
671
694
  * The built-in glob that matched, verbatim (for example
@@ -1452,7 +1475,7 @@ export type DupesSchemaVersion = (4 | 10)
1452
1475
  * The schema emitter registers this type by name and points the
1453
1476
  * `ArchitectureOutput` and `ArchitectureGroupedOutput` definitions at it.
1454
1477
  */
1455
- export type ArchitectureSchemaVersion = 1
1478
+ export type ArchitectureSchemaVersion = 2
1456
1479
  /**
1457
1480
  * Wire-version discriminator for [`ImpactReport`]. Independent from the global
1458
1481
  * `SchemaVersion` (the impact report versions on its own cadence) and from the
@@ -1715,7 +1738,7 @@ export type DoctorStatus = ("pass" | "warn" | "fail")
1715
1738
  /**
1716
1739
  * Stable identifier for a doctor check. Declaration order is output order.
1717
1740
  */
1718
- export type DoctorCheckId = ("root" | "config" | "workspaces" | "plugins" | "type-aware" | "dependencies" | "cache" | "graph-cache")
1741
+ export type DoctorCheckId = ("root" | "config" | "workspaces" | "plugins" | "type-aware" | "dependencies" | "cache" | "graph-cache" | "mutation-runner")
1719
1742
  /**
1720
1743
  * Stable category for a doctor check.
1721
1744
  */
@@ -1833,9 +1856,16 @@ export type MutantStatus = ("killed" | "timeout" | "survived" | "no_coverage" |
1833
1856
  */
1834
1857
  export type MutantFailureKind = ("assertion" | "error" | "timeout")
1835
1858
  /**
1836
- * Why a survivor may be equivalent, as far as the type check can tell.
1859
+ * Why a survivor may be equivalent: a fact of the type check or of the
1860
+ * call evidence. The hint is advisory and never changes the status.
1837
1861
  */
1838
- export type MutantEquivalenceHint = "type-non-nullish"
1862
+ export type MutantEquivalenceHint = ("type-non-nullish" | "constant-parameter")
1863
+ /**
1864
+ * The verdict of one replay. A replay never decides that a mutant is
1865
+ * equivalent: equal results on both sides give `no_witness_found`, which
1866
+ * says only that this input shows no difference.
1867
+ */
1868
+ export type MutationReplayVerdict = ("witness" | "no_witness_found" | "unstable" | "timeout" | "not_callable" | "not_replayable")
1839
1869
  /**
1840
1870
  * Why the type check did not check a survivor.
1841
1871
  */
@@ -1848,6 +1878,10 @@ export type MutationRecheckOutcome = ("killed" | "survived" | "no_coverage" | "t
1848
1878
  * How one mutant of a compare differs from the saved report.
1849
1879
  */
1850
1880
  export type MutationCompareChange = ("regressed" | "inconclusive" | "added" | "removed")
1881
+ /**
1882
+ * What a record pass keeps of the arguments.
1883
+ */
1884
+ export type MutationRecordMode = ("shapes" | "values")
1851
1885
  /**
1852
1886
  * Version singleton for a mutation plan.
1853
1887
  */
@@ -1868,6 +1902,18 @@ export type MutationInspectStatus = ("fresh" | "stale")
1868
1902
  * Why an inspect packet is stale.
1869
1903
  */
1870
1904
  export type MutationStaleReason = ("file-missing" | "no-digest" | "source-changed" | "mutant-not-reproduced")
1905
+ /**
1906
+ * Where the arguments of a replay come from.
1907
+ */
1908
+ export type MutationReplayInputSource = ("argument" | "recorded")
1909
+ /**
1910
+ * The side of one replay call.
1911
+ */
1912
+ export type MutationReplaySide = ("original" | "mutant")
1913
+ /**
1914
+ * The outcome of one replay call.
1915
+ */
1916
+ export type MutationReplayOutcome = ("returned" | "threw" | "timed_out" | "not_callable")
1871
1917
  /**
1872
1918
  * Version singleton for the open tasks of a mutation report.
1873
1919
  */
@@ -2224,6 +2270,11 @@ symbol_impacts?: SemanticSymbolImpact[]
2224
2270
  * Advisory project-local public-signature coupling.
2225
2271
  */
2226
2272
  type_coupling?: (TypeCouplingReport | null)
2273
+ /**
2274
+ * The call evidence of the `constant-parameter` rule. Present when the
2275
+ * rule sent candidates to the companion.
2276
+ */
2277
+ call_evidence?: (TypeAwareCallEvidenceMeta | null)
2227
2278
  /**
2228
2279
  * Whether the semantic companion executed at least one query.
2229
2280
  */
@@ -2894,6 +2945,36 @@ export interface TypeCouplingCycle {
2894
2945
  */
2895
2946
  files: string[]
2896
2947
  }
2948
+ /**
2949
+ * The call evidence that the `constant-parameter` rule asked the companion
2950
+ * for.
2951
+ */
2952
+ export interface TypeAwareCallEvidenceMeta {
2953
+ /**
2954
+ * Parameters with a default whose arguments the companion typed.
2955
+ */
2956
+ default_candidates: number
2957
+ /**
2958
+ * Methods of exported classes whose calls the companion read.
2959
+ */
2960
+ method_candidates: number
2961
+ /**
2962
+ * Findings that the evidence proved.
2963
+ */
2964
+ findings: number
2965
+ /**
2966
+ * The count of each reason that a candidate got no evidence, such as
2967
+ * `outside-program` or `decorator`. An open set: a later version can
2968
+ * add a reason.
2969
+ */
2970
+ abstention_reasons?: {
2971
+ [k: string]: number
2972
+ }
2973
+ /**
2974
+ * Duration of the request as reported by the companion.
2975
+ */
2976
+ elapsed_ms: number
2977
+ }
2897
2978
  /**
2898
2979
  * Closed abstention reason counts for stable machine consumption.
2899
2980
  */
@@ -3079,6 +3160,10 @@ total_issues: number
3079
3160
  */
3080
3161
  entry_points?: (EntryPoints | null)
3081
3162
  summary: CheckSummary
3163
+ /**
3164
+ * Optional architecture inventory, excluded from issue totals and gates.
3165
+ */
3166
+ shared_state?: (SharedStateInventory | null)
3082
3167
  /**
3083
3168
  * Files not reachable from any entry point. Wrapped in
3084
3169
  * [`UnusedFileFinding`] so each entry carries a typed `actions` array
@@ -3364,6 +3449,10 @@ unused_component_props?: UnusedComponentPropFinding[]
3364
3449
  * Used optional component inputs absent from inspected reachable callers. Off by default.
3365
3450
  */
3366
3451
  absent_component_props?: AbsentComponentPropFinding[]
3452
+ /**
3453
+ * Parameters that each visible call passes in one way. Off by default.
3454
+ */
3455
+ constant_parameters?: ConstantParameterFinding[]
3367
3456
  /**
3368
3457
  * Vue `<script setup>` `defineEmits` events emitted nowhere in their own SFC
3369
3458
  * (no `emit('<name>')` call). Wrapped in [`UnusedComponentEmitFinding`] so
@@ -3690,6 +3779,11 @@ unused_component_props?: number
3690
3779
  * Optional consumed props omitted by known reachable callers, for manual review.
3691
3780
  */
3692
3781
  absent_component_props?: number
3782
+ /**
3783
+ * Parameters that each visible call passes in one way, for manual review.
3784
+ * Absent while zero, so a run with the opt-in rule off keeps its shape.
3785
+ */
3786
+ constant_parameters?: number
3693
3787
  /**
3694
3788
  * Vue `<script setup>` emits emitted nowhere inside their own SFC.
3695
3789
  */
@@ -3845,6 +3939,131 @@ route_collisions?: number
3845
3939
  */
3846
3940
  dynamic_segment_name_conflicts?: number
3847
3941
  }
3942
+ /**
3943
+ * Versioned advisory inventory. Its observations are never counted as findings.
3944
+ */
3945
+ export interface SharedStateInventory {
3946
+ /**
3947
+ * Inventory contract version.
3948
+ */
3949
+ version: number
3950
+ /**
3951
+ * False if source parsing or retention limits omitted supported evidence.
3952
+ */
3953
+ complete: boolean
3954
+ /**
3955
+ * Whether bounded fact retention omitted sites.
3956
+ */
3957
+ truncated: boolean
3958
+ /**
3959
+ * Imported value property writes.
3960
+ */
3961
+ imported_writes: ImportedStateWrite[]
3962
+ /**
3963
+ * Exact global root/slot groups.
3964
+ */
3965
+ globals: GlobalStateGroup[]
3966
+ }
3967
+ /**
3968
+ * A write through an imported value binding with one declaration origin.
3969
+ */
3970
+ export interface ImportedStateWrite {
3971
+ /**
3972
+ * Stable observation identity.
3973
+ */
3974
+ id: string
3975
+ writer: StateSite
3976
+ declaration: StateSite
3977
+ /**
3978
+ * Canonical exported name.
3979
+ */
3980
+ binding: string
3981
+ /**
3982
+ * Exact property segments relative to the imported value.
3983
+ */
3984
+ property: string[]
3985
+ operation: StateOperation
3986
+ /**
3987
+ * Manual guidance.
3988
+ */
3989
+ actions: StateAction[]
3990
+ }
3991
+ /**
3992
+ * A retained source location.
3993
+ */
3994
+ export interface StateSite {
3995
+ /**
3996
+ * Project-relative source path.
3997
+ */
3998
+ path: string
3999
+ /**
4000
+ * One-based source line.
4001
+ */
4002
+ line: number
4003
+ /**
4004
+ * One-based byte column.
4005
+ */
4006
+ column: number
4007
+ /**
4008
+ * Original byte offset.
4009
+ */
4010
+ offset: number
4011
+ }
4012
+ /**
4013
+ * Manual review guidance. Inventory observations cannot be automatically fixed.
4014
+ */
4015
+ export interface StateAction {
4016
+ /**
4017
+ * Human-readable next step.
4018
+ */
4019
+ description: string
4020
+ /**
4021
+ * Always false.
4022
+ */
4023
+ auto_fixable: boolean
4024
+ }
4025
+ /**
4026
+ * One exact root and custom slot, with retained reads and writes across files.
4027
+ */
4028
+ export interface GlobalStateGroup {
4029
+ /**
4030
+ * Stable observation identity.
4031
+ */
4032
+ id: string
4033
+ /**
4034
+ * Exact root spelling. Roots are never normalized across runtimes.
4035
+ */
4036
+ root: string
4037
+ /**
4038
+ * Direct custom slot.
4039
+ */
4040
+ slot: string
4041
+ /**
4042
+ * Sorted read sites.
4043
+ */
4044
+ reads: GlobalStateAccess[]
4045
+ /**
4046
+ * Sorted write sites.
4047
+ */
4048
+ writes: GlobalStateAccess[]
4049
+ same_runtime: UnknownStateRelation
4050
+ execution_order: UnknownStateRelation
4051
+ /**
4052
+ * Manual guidance.
4053
+ */
4054
+ actions: StateAction[]
4055
+ }
4056
+ /**
4057
+ * A source access within a global group.
4058
+ */
4059
+ export interface GlobalStateAccess {
4060
+ site: StateSite
4061
+ /**
4062
+ * Full path, including the direct slot.
4063
+ */
4064
+ property: string[]
4065
+ operation: StateOperation
4066
+ }
3848
4067
  /**
3849
4068
  * Wire-shape envelope for an [`UnusedFile`] finding. The bare finding
3850
4069
  * flattens in via `#[serde(flatten)]`, with a typed `actions` array
@@ -6635,6 +6854,141 @@ line: number
6635
6854
  */
6636
6855
  col: number
6637
6856
  }
6857
+ /**
6858
+ * Wire-shape envelope for a [`ConstantParameter`] finding. No action is
6859
+ * auto-fixable: a change of the function and each call is a refactor that
6860
+ * needs the tests, and a default that differs from the constant can change
6861
+ * behavior.
6862
+ */
6863
+ export interface ConstantParameterFinding {
6864
+ /**
6865
+ * Source path of the function.
6866
+ */
6867
+ path: string
6868
+ /**
6869
+ * The module-scope binding name of the function. For a method of an
6870
+ * exported class, which only type-aware mode reports, `Class.method`.
6871
+ */
6872
+ function_name: string
6873
+ /**
6874
+ * The parameter name. For an option key, the local binding of the key
6875
+ * in the object pattern: `abort` for `{ signal: abort }`.
6876
+ */
6877
+ parameter_name: string
6878
+ /**
6879
+ * 0-based index of the parameter. A TypeScript `this` parameter does
6880
+ * not count.
6881
+ */
6882
+ parameter_index: number
6883
+ /**
6884
+ * The property key, when the finding is about one key of an
6885
+ * object-pattern parameter: `retries` in `{ retries = 3 }`. Absent for
6886
+ * a plain parameter.
6887
+ */
6888
+ option_key?: (string | null)
6889
+ /**
6890
+ * 1-based line of the parameter, or of the key binding.
6891
+ */
6892
+ line: number
6893
+ /**
6894
+ * 0-based byte column of the parameter, or of the key binding.
6895
+ */
6896
+ col: number
6897
+ reason: ConstantParameterReason
6898
+ /**
6899
+ * The evidence that the finding needs beyond the syntactic call facts.
6900
+ * Absent for a finding that the call facts prove alone.
6901
+ */
6902
+ evidence?: (ConstantParameterEvidence | null)
6903
+ /**
6904
+ * The value that each call passes. Present if and only if `reason` is
6905
+ * `identical-argument`.
6906
+ */
6907
+ value?: (ConstantParameterValue | null)
6908
+ /**
6909
+ * `true` when the parameter has the TypeScript `?` marker.
6910
+ */
6911
+ optional: boolean
6912
+ /**
6913
+ * `true` when the parameter, or the option key, has a default value.
6914
+ */
6915
+ has_default: boolean
6916
+ /**
6917
+ * The count of conditional tests in the function whose test is the
6918
+ * parameter, `!parameter` or `!!parameter`: the test of an `if`, a
6919
+ * `?:`, a `while`, a `do` or a `for`. Nested functions count. A
6920
+ * comparison such as `parameter === true` and an operand of `&&` or
6921
+ * `||` do not count.
6922
+ */
6923
+ condition_reads: number
6924
+ /**
6925
+ * The count of calls that the rule read for this parameter. A
6926
+ * recursive call that passes the parameter on unchanged does not count.
6927
+ */
6928
+ call_site_count: number
6929
+ /**
6930
+ * The first calls in source order, at most 20. The list is never longer
6931
+ * than `call_site_count`.
6932
+ */
6933
+ inspected_call_sites: ConstantParameterCallSite[]
6934
+ /**
6935
+ * What the finding means and what static analysis does not prove.
6936
+ */
6937
+ explanation: string
6938
+ /**
6939
+ * Stable id of this finding: `dc1:<rule>:<16 hex digits>`, with a
6940
+ * `~<k>` suffix when several findings of one type share an identity.
6941
+ * Line and column are not inputs, so the id survives line shifts,
6942
+ * reformats and reorders. A rename of the file, the function or the
6943
+ * parameter gives a new id. Absent in output from older versions.
6944
+ */
6945
+ finding_id?: (string | null)
6946
+ /**
6947
+ * Suggested next steps. Always emitted.
6948
+ */
6949
+ actions: IssueAction[]
6950
+ /**
6951
+ * Set by the audit pass when this finding is introduced relative to
6952
+ * the merge-base.
6953
+ */
6954
+ introduced?: (AuditIntroduced | null)
6955
+ /**
6956
+ * Gate severity of this finding after `rules` and `overrides[].rules`
6957
+ * resolve for its path. Not part of the finding identity, baseline keys
6958
+ * or fingerprints.
6959
+ */
6960
+ effective_severity?: (EffectiveSeverity | null)
6961
+ }
6962
+ /**
6963
+ * The value that each call passes: a literal, or an immutable binding.
6964
+ */
6965
+ export interface ConstantParameterValue {
6966
+ kind: ConstantParameterValueKind
6967
+ /**
6968
+ * The value as text. A number uses the JavaScript `String(n)` form,
6969
+ * except that negative zero is `-0`. A string is the raw value with no
6970
+ * quotes. `null`, `undefined`, `true` and `false` are the keyword. A
6971
+ * binding is its name.
6972
+ */
6973
+ text: string
6974
+ }
6975
+ /**
6976
+ * One inspected call of the reported function.
6977
+ */
6978
+ export interface ConstantParameterCallSite {
6979
+ /**
6980
+ * Caller source path.
6981
+ */
6982
+ path: string
6983
+ /**
6984
+ * 1-based line of the call.
6985
+ */
6986
+ line: number
6987
+ /**
6988
+ * 0-based byte column of the call.
6989
+ */
6990
+ col: number
6991
+ }
6638
6992
  /**
6639
6993
  * Wire-shape envelope for an [`UnusedComponentEmit`] finding. There is no safe
6640
6994
  * auto-fix: removing a declared emit is judgement-bearing (the event may be
@@ -15382,6 +15736,10 @@ owners?: (string[] | null)
15382
15736
  * Findings in this group.
15383
15737
  */
15384
15738
  total_issues: number
15739
+ /**
15740
+ * Optional architecture inventory, excluded from issue totals and gates.
15741
+ */
15742
+ shared_state?: (SharedStateInventory | null)
15385
15743
  /**
15386
15744
  * Files not reachable from any entry point. Wrapped in
15387
15745
  * [`UnusedFileFinding`] so each entry carries a typed `actions` array
@@ -15667,6 +16025,10 @@ unused_component_props?: UnusedComponentPropFinding[]
15667
16025
  * Used optional component inputs absent from inspected reachable callers. Off by default.
15668
16026
  */
15669
16027
  absent_component_props?: AbsentComponentPropFinding[]
16028
+ /**
16029
+ * Parameters that each visible call passes in one way. Off by default.
16030
+ */
16031
+ constant_parameters?: ConstantParameterFinding[]
15670
16032
  /**
15671
16033
  * Vue `<script setup>` `defineEmits` events emitted nowhere in their own SFC
15672
16034
  * (no `emit('<name>')` call). Wrapped in [`UnusedComponentEmitFinding`] so
@@ -16281,13 +16643,13 @@ new_count: number
16281
16643
  */
16282
16644
  export interface SecurityFinding {
16283
16645
  /**
16284
- * Stable per-finding correlation id, identical across runs for the same
16285
- * rule + anchor path + line + column. An autonomous agent that triaged this
16286
- * candidate on a prior run uses it to correlate the candidate after a
16287
- * rebase. Equal to the SARIF `partialFingerprints["fallowSecurity/v2"]`
16288
- * value for the same finding (one shared helper computes both).
16646
+ * Location id (rule, path, line, column), equal to SARIF `fallowSecurity/v2`; edits move it.
16289
16647
  */
16290
16648
  finding_id: string
16649
+ /**
16650
+ * Line-independent id (`sec1:<hash>`, `~k` for repeats); a verdict may use it.
16651
+ */
16652
+ stable_finding_id?: (string | null)
16291
16653
  kind: SecurityFindingKind
16292
16654
  /**
16293
16655
  * The catalogue category id (e.g. `"dangerous-html"`). `Some` for
@@ -16370,9 +16732,8 @@ taint_flow?: (SecurityTaintFlow | null)
16370
16732
  */
16371
16733
  runtime?: (SecurityRuntimeContext | null)
16372
16734
  /**
16373
- * Internal projection used by `fallow security --surface`. The CLI strips
16374
- * this from per-finding JSON and promotes it to the top-level
16375
- * `attack_surface` field only when requested.
16735
+ * Internal projection used by `fallow security --surface`. The CLI strips this from
16736
+ * per-finding JSON and promotes it to the top-level `attack_surface` field only when requested.
16376
16737
  */
16377
16738
  attack_surface?: (SecurityAttackSurfaceEntry | null)
16378
16739
  }
@@ -16971,7 +17332,8 @@ elapsed_ms: ElapsedMs
16971
17332
  workspace_diagnostics?: WorkspaceDiagnostic[]
16972
17333
  summary: SecuritySurvivorsSummary
16973
17334
  /**
16974
- * Verifier-retained candidates keyed by finding id.
17335
+ * Verifier-retained candidates keyed by the candidate `finding_id`, also
17336
+ * when the verdict names the candidate by its `stable_finding_id`.
16975
17337
  */
16976
17338
  survivors: {
16977
17339
  [k: string]: SecuritySurvivor
@@ -17128,6 +17490,10 @@ total_issues: number
17128
17490
  */
17129
17491
  entry_points?: (EntryPoints | null)
17130
17492
  summary: CheckSummary
17493
+ /**
17494
+ * Optional architecture inventory, excluded from issue totals and gates.
17495
+ */
17496
+ shared_state?: (SharedStateInventory | null)
17131
17497
  /**
17132
17498
  * Files not reachable from any entry point. Wrapped in
17133
17499
  * [`UnusedFileFinding`] so each entry carries a typed `actions` array
@@ -17413,6 +17779,10 @@ unused_component_props?: UnusedComponentPropFinding[]
17413
17779
  * Used optional component inputs absent from inspected reachable callers. Off by default.
17414
17780
  */
17415
17781
  absent_component_props?: AbsentComponentPropFinding[]
17782
+ /**
17783
+ * Parameters that each visible call passes in one way. Off by default.
17784
+ */
17785
+ constant_parameters?: ConstantParameterFinding[]
17416
17786
  /**
17417
17787
  * Vue `<script setup>` `defineEmits` events emitted nowhere in their own SFC
17418
17788
  * (no `emit('<name>')` call). Wrapped in [`UnusedComponentEmitFinding`] so
@@ -18873,14 +19243,39 @@ change_shape: number
18873
19243
  /**
18874
19244
  * Runtime-weight component (paid): a hot path (runtime evidence of high
18875
19245
  * invocation) adds an invocation-bucketed weight so it amplifies the blast
18876
- * and outranks an otherwise-equal cold unit. `0` in free mode (no runtime
18877
- * input), so the free-tier total stays the four deterministic components and
18878
- * is byte-identical to the no-runtime baseline.
19246
+ * and outranks an otherwise-equal cold unit. `0` and omitted in free mode
19247
+ * (no runtime input).
18879
19248
  */
18880
19249
  runtime?: number
18881
19250
  /**
18882
- * The summed total of every present component (the four deterministic ones
18883
- * plus the runtime weight).
19251
+ * Churn component: the recency-weighted commit count of the file in the
19252
+ * churn window (90-day half-life), in capped bands. Omitted while it is
19253
+ * zero, which includes a test file and a run without a git history or on a
19254
+ * shallow clone.
19255
+ */
19256
+ churn?: number
19257
+ /**
19258
+ * Worsened component: the functions of the file whose complexity metrics
19259
+ * grew against the matched base finding (`worsened_metrics`), capped.
19260
+ * Omitted while it is zero, which includes a run without a base.
19261
+ */
19262
+ worsened?: number
19263
+ /**
19264
+ * Test-reach component: the changed exports of the file that no test
19265
+ * runs for real (`mocked-only`, `none`, or `none-file` in a project with
19266
+ * tests), capped. Omitted while it is zero.
19267
+ */
19268
+ test_reach?: number
19269
+ /**
19270
+ * Mutation component: the surviving mutants on the added lines of the
19271
+ * file, from the `--mutation-report` file, capped. Omitted while it is
19272
+ * zero. Without `--mutation-report` the component is not measured, which
19273
+ * does not mean that no mutant survives.
19274
+ */
19275
+ mutation?: number
19276
+ /**
19277
+ * The sum of every component, also of the components that the wire
19278
+ * omits because they are zero.
18884
19279
  */
18885
19280
  total: number
18886
19281
  }
@@ -20741,6 +21136,11 @@ compare?: (MutationCompare | null)
20741
21136
  * the run is not a recheck. The exit code of the run reads this entry.
20742
21137
  */
20743
21138
  gate_outcomes?: (GateOutcomes | null)
21139
+ /**
21140
+ * The argument recording of the dry run. Present only with
21141
+ * `--record-args`. It holds counts and reasons, never argument values.
21142
+ */
21143
+ recording?: (MutationRecordingOutput | null)
20744
21144
  }
20745
21145
  /**
20746
21146
  * The completion status of a run.
@@ -20846,12 +21246,22 @@ target: string
20846
21246
  test_ids: string[]
20847
21247
  status: MutationKillMatrixTargetStatus
20848
21248
  /**
20849
- * Why the evidence of this target is incomplete, sorted. The run-wide
20850
- * reasons `partial-mutation-run`, `baseline-failure`, and
20851
- * `missing-test-file-metadata` apply to each target.
21249
+ * Why the evidence of this target is incomplete, sorted.
21250
+ * `baseline-failure` means that a test failed with no active mutant, and
21251
+ * that the failure can affect this target: the failing test is a test
21252
+ * of the target or is in a test file of the target, or it covers, kills,
21253
+ * or ran without a mutant that a test of the target covers or kills.
21254
+ * `partial-mutation-run` means that the run is partial. When baseline
21255
+ * failures are the only cause of a partial run, only the targets with
21256
+ * `baseline-failure` get it. Each other cause applies to each target,
21257
+ * and so does `missing-test-file-metadata`.
20852
21258
  * `incomplete-mutant-results` means that a test of this target covers a
20853
21259
  * mutant with incomplete evidence. `unmatched-target` means that the
20854
- * target selects no test.
21260
+ * target selects no test. With it, `not-a-test-file` means that the
21261
+ * runner does not list the file of the target as a test file, and
21262
+ * `no-planned-code` means that the file reaches no planned code, so
21263
+ * the dry run does not run it. A run stops only when no target selects
21264
+ * a test.
20855
21265
  */
20856
21266
  reasons: string[]
20857
21267
  }
@@ -21109,6 +21519,14 @@ cached?: boolean
21109
21519
  * (`--resume`). The mutant did not run in this run.
21110
21520
  */
21111
21521
  resumed?: boolean
21522
+ /**
21523
+ * True when the status and its evidence come from the earlier report
21524
+ * of a `--recheck` run: the recheck did not select the mutant, its file
21525
+ * has the digest of that report, and each test file of its killing
21526
+ * tests exists. The mutant did not run in this run, and the kill matrix
21527
+ * of this run has no evidence of it.
21528
+ */
21529
+ carried?: boolean
21112
21530
  /**
21113
21531
  * The TypeScript diagnostic codes of the new errors of a
21114
21532
  * `compile_error` mutant, sorted, at most 8.
@@ -21121,6 +21539,12 @@ type_error_codes?: number[]
21121
21539
  * a verdict file. The hint can be wrong.
21122
21540
  */
21123
21541
  equivalence_hint?: (MutantEquivalenceHint | null)
21542
+ /**
21543
+ * The replay of a recorded input. Present only after a `--record-args
21544
+ * values` run, for a survived or uncovered mutant with a recorded input
21545
+ * of its export.
21546
+ */
21547
+ witness?: (MutantWitness | null)
21124
21548
  }
21125
21549
  /**
21126
21550
  * The edit of a mutant, without project text.
@@ -21204,6 +21628,28 @@ failure_kind?: (MutantFailureKind | null)
21204
21628
  */
21205
21629
  detail?: (string | null)
21206
21630
  }
21631
+ /**
21632
+ * The replay of a recorded input against a survived or uncovered mutant,
21633
+ * after a `fallow mutation --record-args values` run. It holds no argument
21634
+ * value: the values stay in the gitignored cache directory.
21635
+ */
21636
+ export interface MutantWitness {
21637
+ verdict: MutationReplayVerdict
21638
+ /**
21639
+ * The recorded input of the verdict. `fallow mutation tasks` joins its
21640
+ * values from the cache.
21641
+ */
21642
+ input_id?: (string | null)
21643
+ /**
21644
+ * The recorded inputs that the replay ran.
21645
+ */
21646
+ inputs_checked: number
21647
+ /**
21648
+ * Why the replay gave no witness, for example `no witness found (2
21649
+ * inputs, recorded, 3 calls of each side)`. Absent for a witness.
21650
+ */
21651
+ reason?: (string | null)
21652
+ }
21207
21653
  /**
21208
21654
  * The results of the mutants of one function.
21209
21655
  */
@@ -21433,9 +21879,9 @@ checked: number
21433
21879
  */
21434
21880
  compile_errors: number
21435
21881
  /**
21436
- * The mutants of the final report that have an `equivalence_hint`. They
21437
- * keep the status `survived`. A verdict that makes a mutant `equivalent`
21438
- * removes its hint and lowers this count.
21882
+ * The mutants of the final report that have the `type-non-nullish`
21883
+ * hint. They keep the status `survived`. A verdict that makes a mutant
21884
+ * `equivalent` removes its hint and lowers this count.
21439
21885
  */
21440
21886
  hinted?: number
21441
21887
  /**
@@ -21485,6 +21931,22 @@ unsettled: number
21485
21931
  * The rechecked mutants, sorted by file, line and mutant id.
21486
21932
  */
21487
21933
  mutants: MutationRecheckMutant[]
21934
+ /**
21935
+ * The mutants of the report that keep their result from the earlier
21936
+ * report (`carried`), because the recheck did not select them. The
21937
+ * summary counts them. The recheck does not run them again, so a test
21938
+ * that became weaker does not change their result.
21939
+ */
21940
+ carried?: number
21941
+ /**
21942
+ * The files of the earlier report outside this run whose earlier
21943
+ * results do not apply, sorted: the source changed after the report,
21944
+ * the test file of a killing test is gone, or the report has no digest
21945
+ * or no readable entry for the file. The report leaves out their
21946
+ * mutants. Run `fallow mutation` on them for new
21947
+ * results.
21948
+ */
21949
+ stale_files?: string[]
21488
21950
  }
21489
21951
  /**
21490
21952
  * One rechecked mutant.
@@ -21572,6 +22034,66 @@ status?: (MutantStatus | null)
21572
22034
  */
21573
22035
  previous_killing_tests: string[]
21574
22036
  }
22037
+ /**
22038
+ * The argument recording of a run.
22039
+ */
22040
+ export interface MutationRecordingOutput {
22041
+ mode: MutationRecordMode
22042
+ /**
22043
+ * True when the inputs are in the cache file
22044
+ * `<cache dir>/mutation/recorded-args.json`.
22045
+ */
22046
+ saved: boolean
22047
+ /**
22048
+ * Why the run recorded nothing or saved nothing, for example a runner
22049
+ * that records no arguments. Absent when the inputs are saved.
22050
+ */
22051
+ error?: (string | null)
22052
+ /**
22053
+ * The recorded exported functions, sorted by file and export.
22054
+ */
22055
+ functions: MutationRecordedFunction[]
22056
+ }
22057
+ /**
22058
+ * The recorded arguments of one exported function.
22059
+ */
22060
+ export interface MutationRecordedFunction {
22061
+ /**
22062
+ * The project-root-relative path of the file.
22063
+ */
22064
+ file: string
22065
+ /**
22066
+ * The export name. `fallow mutation inspect --replay` calls it.
22067
+ */
22068
+ export: string
22069
+ /**
22070
+ * The number of distinct inputs that the cache keeps.
22071
+ */
22072
+ input_count: number
22073
+ /**
22074
+ * The calls whose arguments the cache does not keep, by reason.
22075
+ */
22076
+ not_replayable: MutationNotReplayable[]
22077
+ }
22078
+ /**
22079
+ * The calls of one reason whose arguments a recording did not keep.
22080
+ */
22081
+ export interface MutationNotReplayable {
22082
+ /**
22083
+ * Why the arguments cannot be replayed. One of a fixed set: `a
22084
+ * function`, `a symbol`, `a proxy`, `a cyclic value`, `a class
22085
+ * instance`, `a value that is too large`, `an accessor property`, `an
22086
+ * object with a symbol key`, `an object that this runtime cannot check
22087
+ * for a proxy`, `a value that cannot be read`, `a value under a secret
22088
+ * key name` or `a string that looks like a secret`. It never holds text
22089
+ * of the code or of a value.
22090
+ */
22091
+ reason: string
22092
+ /**
22093
+ * The number of calls.
22094
+ */
22095
+ count: number
22096
+ }
21575
22097
  /**
21576
22098
  * The envelope of `fallow mutation --plan`. It runs no user code.
21577
22099
  */
@@ -21598,7 +22120,8 @@ test_files: string[]
21598
22120
  */
21599
22121
  no_test_files: boolean
21600
22122
  /**
21601
- * True when the plan applied the `framework-config` prune rule.
22123
+ * True when the plan applied the `framework-config` and
22124
+ * `build-tool-only` prune rules.
21602
22125
  */
21603
22126
  framework_config_checked: boolean
21604
22127
  /**
@@ -21609,6 +22132,7 @@ skipped_files: MutationSkippedFile[]
21609
22132
  * The paths of a `paths` scope that select no file.
21610
22133
  */
21611
22134
  unmatched_paths: string[]
22135
+ runner: MutationPlanRunner
21612
22136
  }
21613
22137
  /**
21614
22138
  * The totals of a plan.
@@ -21650,6 +22174,10 @@ pruned_side_effect_sink: number
21650
22174
  * Mutants in framework config exports.
21651
22175
  */
21652
22176
  pruned_framework_config: number
22177
+ /**
22178
+ * Mutants in files that only tool config files reach. Absent when 0.
22179
+ */
22180
+ pruned_build_tool_only?: number
21653
22181
  }
21654
22182
  /**
21655
22183
  * One mutant of a plan.
@@ -21718,7 +22246,50 @@ pending_reason?: (string | null)
21718
22246
  test_reach?: (MutantTestReach | null)
21719
22247
  }
21720
22248
  /**
21721
- * The envelope of `fallow mutation inspect`. It runs no user code.
22249
+ * The test runner of a plan. The plan reads the `package.json` of the
22250
+ * installed runner package and runs no code. A run that starts the runner
22251
+ * stops when `supported` is false: with `FALLOW_MUTATION_RUNNER_UNSUPPORTED`
22252
+ * for a version outside the range, and with the companion error
22253
+ * `runner-not-found` for a runner that is not installed. A run of a plan
22254
+ * with no test file or no mutant starts no runner.
22255
+ */
22256
+ export interface MutationPlanRunner {
22257
+ /**
22258
+ * The runner: `vitest`, `node-test` or `bun-test`.
22259
+ */
22260
+ name: string
22261
+ /**
22262
+ * The package or runtime that the supported range applies to.
22263
+ */
22264
+ package: string
22265
+ /**
22266
+ * The installed version of the package. `null` when the package is not
22267
+ * installed, or when `supported` is `null`.
22268
+ */
22269
+ installed_version?: (string | null)
22270
+ /**
22271
+ * The supported range, for example `>=4.1.0 <6.0.0`.
22272
+ */
22273
+ supported_range: string
22274
+ /**
22275
+ * True when the installed version is in the range. False when it is
22276
+ * outside the range or when the package is not installed. `null` for
22277
+ * `node-test` and `bun-test`: their range applies to the runtime, and a
22278
+ * run selects the runtime when it starts.
22279
+ */
22280
+ supported?: (boolean | null)
22281
+ /**
22282
+ * The problem when `supported` is false, else `null`.
22283
+ */
22284
+ message?: (string | null)
22285
+ /**
22286
+ * The install step when `supported` is false, else `null`.
22287
+ */
22288
+ help?: (string | null)
22289
+ }
22290
+ /**
22291
+ * The envelope of `fallow mutation inspect`. It runs no user code, except
22292
+ * with `--replay`.
21722
22293
  */
21723
22294
  export interface MutationInspectOutput {
21724
22295
  schema_version: MutationInspectSchemaVersion
@@ -21810,6 +22381,10 @@ killing_tests: string[]
21810
22381
  * True only for exact requested membership with terminal pass or fail results.
21811
22382
  */
21812
22383
  kill_matrix_complete: boolean
22384
+ /**
22385
+ * The replay of the mutant. Present only with `--replay`.
22386
+ */
22387
+ replay?: (MutationReplayOutput | null)
21813
22388
  }
21814
22389
  /**
21815
22390
  * The code of one mutant, from the current file.
@@ -21832,6 +22407,95 @@ original_lines: string
21832
22407
  */
21833
22408
  mutated_lines: string
21834
22409
  }
22410
+ /**
22411
+ * The replay of one export on the original and on one mutant (replay
22412
+ * contract 1).
22413
+ */
22414
+ export interface MutationReplayOutput {
22415
+ /**
22416
+ * The version of the replay contract of the runner companion.
22417
+ */
22418
+ contract_version: number
22419
+ verdict: MutationReplayVerdict
22420
+ /**
22421
+ * Why the replay did not run or did not end. Absent otherwise.
22422
+ */
22423
+ reason?: (string | null)
22424
+ /**
22425
+ * The export that the replay called. `null` when no export holds the
22426
+ * mutant.
22427
+ */
22428
+ export?: (string | null)
22429
+ input: MutationReplayInput
22430
+ /**
22431
+ * The inputs that the replay ran, in order, up to the first witness.
22432
+ */
22433
+ inputs_checked: number
22434
+ /**
22435
+ * The calls of each side. The sides take turns.
22436
+ */
22437
+ calls_per_side: number
22438
+ /**
22439
+ * The time limit of one call, in milliseconds.
22440
+ */
22441
+ call_timeout_ms: number
22442
+ /**
22443
+ * The fixed value of `Date.now()` in each call.
22444
+ */
22445
+ clock_ms: number
22446
+ /**
22447
+ * The seed of `Math.random` in each call.
22448
+ */
22449
+ seed: number
22450
+ /**
22451
+ * Each call, in call order.
22452
+ */
22453
+ calls: MutationReplayCall[]
22454
+ /**
22455
+ * The wall time of the replay request, in milliseconds. It differs
22456
+ * between two replays of the same input.
22457
+ */
22458
+ duration_ms: number
22459
+ }
22460
+ /**
22461
+ * The input of a replay.
22462
+ */
22463
+ export interface MutationReplayInput {
22464
+ source: MutationReplayInputSource
22465
+ /**
22466
+ * The id of a recorded input. Absent for `--args`.
22467
+ */
22468
+ input_id?: (string | null)
22469
+ /**
22470
+ * The arguments in the replay encoding: JSON values, and objects with a
22471
+ * `$replay` tag for `undefined`, special numbers, bigints, dates,
22472
+ * regular expressions, maps, sets and typed arrays.
22473
+ */
22474
+ args: unknown[]
22475
+ }
22476
+ /**
22477
+ * One call of a replay.
22478
+ */
22479
+ export interface MutationReplayCall {
22480
+ side: MutationReplaySide
22481
+ /**
22482
+ * The 1-based number of the call on its side.
22483
+ */
22484
+ index: number
22485
+ outcome: MutationReplayOutcome
22486
+ /**
22487
+ * The returned or thrown value in the replay encoding. An error is
22488
+ * `{"$replay": "error", "name", "message"}`. `null` for a call that
22489
+ * timed out.
22490
+ */
22491
+ value: (null | boolean | number | string | unknown[] | {
22492
+
22493
+ })
22494
+ /**
22495
+ * A short text of the value for people, at most 200 characters.
22496
+ */
22497
+ text: string
22498
+ }
21835
22499
  /**
21836
22500
  * The envelope of `fallow mutation tasks`: the open tasks of one saved
21837
22501
  * report, as one batch. It runs no user code.
@@ -21929,6 +22593,71 @@ stale_reason?: (MutationStaleReason | null)
21929
22593
  * test ids and the static test files of one mutant.
21930
22594
  */
21931
22595
  covering_test_files: string[]
22596
+ /**
22597
+ * The witness of the task: a recorded input that shows a difference, with
22598
+ * the results of both sides. Present only after a `--record-args
22599
+ * values` run.
22600
+ */
22601
+ witness?: (MutationTaskWitness | null)
22602
+ }
22603
+ /**
22604
+ * The witness of a task: the reference of the report, and the values from
22605
+ * the local cache when the cache still has them. Only the verdict
22606
+ * `witness` can have `args`, `original` and `mutant`.
22607
+ */
22608
+ export interface MutationTaskWitness {
22609
+ verdict: MutationReplayVerdict
22610
+ /**
22611
+ * The recorded input of the verdict.
22612
+ */
22613
+ input_id?: (string | null)
22614
+ /**
22615
+ * The recorded inputs that the replay ran.
22616
+ */
22617
+ inputs_checked: number
22618
+ /**
22619
+ * Why the replay gave no witness. Absent for a witness.
22620
+ */
22621
+ reason?: (string | null)
22622
+ /**
22623
+ * The command that replays the mutant again and shows both sides.
22624
+ */
22625
+ replay_command: string
22626
+ /**
22627
+ * The arguments of the input in the replay encoding: JSON, and objects
22628
+ * with a `$replay` tag for other values (`{"$replay": "undefined"}`,
22629
+ * `{"$replay": "bigint", "value": "12"}`, and `date`, `regexp`, `map`,
22630
+ * `set` and `bytes`). Absent for another verdict, for a stale task, when
22631
+ * the cache no longer has the input (7 days), and in the markdown
22632
+ * output.
22633
+ */
22634
+ args?: (unknown[] | null)
22635
+ /**
22636
+ * The result on the original code: the value that a new test asserts.
22637
+ * The replay ran with a fixed clock and seed, so run the new test on the
22638
+ * current code to confirm it.
22639
+ */
22640
+ original?: (MutationWitnessSide | null)
22641
+ /**
22642
+ * The result on the mutant.
22643
+ */
22644
+ mutant?: (MutationWitnessSide | null)
22645
+ }
22646
+ /**
22647
+ * The result of one side of a witness.
22648
+ */
22649
+ export interface MutationWitnessSide {
22650
+ outcome: MutationReplayOutcome
22651
+ /**
22652
+ * The returned or thrown value in the replay encoding.
22653
+ */
22654
+ value: (null | boolean | number | string | unknown[] | {
22655
+
22656
+ })
22657
+ /**
22658
+ * A short text of the value for people.
22659
+ */
22660
+ text: string
21932
22661
  }
21933
22662
  /**
21934
22663
  * Single CodeClimate-compatible issue inside [`CodeClimateOutput`].