fallow 3.3.0 → 3.5.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.
@@ -24,9 +24,9 @@
24
24
 
25
25
 
26
26
  /**
27
- * Schemas for the JSON output of fallow commands. Object-shaped envelopes covered by the `FallowOutput` contract carry a top-level `kind` discriminator. Current kind values: `audit`, `explain`, `inspect_target`, `trace`, `review-envelope`, `review-reconcile`, `coverage-setup`, `coverage-analyze`, `list-boundaries`, `list-workspaces`, `health`, `dupes`, `dead-code-grouped`, `impact`, `impact-cross-repo`, `security`, `security-survivors`, `security-blind-spots`, `dead-code`, `combined`, `feature-flags`, `audit-brief`, `decision-surface`, `review-walkthrough-guide`, `review-walkthrough-validation`. 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.
27
+ * Schemas for the JSON output of fallow commands. Object-shaped envelopes covered by the `FallowOutput` contract carry a top-level `kind` discriminator. Current kind values: `audit`, `explain`, `inspect_target`, `trace`, `review-envelope`, `review-reconcile`, `coverage-setup`, `coverage-analyze`, `list-boundaries`, `list-workspaces`, `health`, `dupes`, `dead-code-grouped`, `impact`, `impact-cross-repo`, `security`, `security-survivors`, `security-blind-spots`, `dead-code`, `combined`, `feature-flags`, `audit-brief`, `decision-surface`, `review-walkthrough-guide`, `review-walkthrough-validation`, `suppression-inventory`. 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. `ErrorOutput` is the `--format json` failure document, emitted on stdout with a non-zero exit; it carries no `kind` and is discriminated by the `error: true` field.
28
28
  */
29
- export type FallowJsonOutput = (FallowOutput | CodeClimateOutput)
29
+ export type FallowJsonOutput = (FallowOutput | CodeClimateOutput | ErrorOutput)
30
30
  /**
31
31
  * Typed root of every fallow JSON envelope shape that serializes as a JSON
32
32
  * object and participates in the documented `FallowOutput` contract. The
@@ -86,7 +86,7 @@ kind: "dead-code"
86
86
  kind: "combined"
87
87
  }) | (FeatureFlagsOutput & {
88
88
  kind: "feature-flags"
89
- }) | (ReviewBriefOutput & {
89
+ }) | (ReviewBriefWireOutput & {
90
90
  kind: "audit-brief"
91
91
  }) | (DecisionSurfaceOutput & {
92
92
  kind: "decision-surface"
@@ -94,6 +94,8 @@ kind: "decision-surface"
94
94
  kind: "review-walkthrough-guide"
95
95
  }) | (WalkthroughValidation & {
96
96
  kind: "review-walkthrough-validation"
97
+ }) | (SuppressionInventoryOutput & {
98
+ kind: "suppression-inventory"
97
99
  }))
98
100
  /**
99
101
  * Schema version for this output format (independent of tool version). Bump
@@ -375,6 +377,12 @@ kind: "skipped-large-file"
375
377
  */
376
378
  size_bytes: number
377
379
  kind: "skipped-minified-file"
380
+ } | {
381
+ /**
382
+ * Filesystem or UTF-8 decoding error from `read_to_string`.
383
+ */
384
+ error: string
385
+ kind: "source-read-failure"
378
386
  })
379
387
  /**
380
388
  * Discriminant for [`CloneGroupAction::kind`]. Mirrors the action types
@@ -643,7 +651,7 @@ export_name: string
643
651
  type: "symbol"
644
652
  })
645
653
  export type InspectIdentity = (InspectFileIdentity | InspectSymbolIdentity)
646
- export type InspectSectionStatus = ("ok" | "error")
654
+ export type InspectSectionStatus = ("ok" | "unavailable" | "error")
647
655
  export type InspectEvidenceScope = ("symbol" | "file" | "project_filtered_to_file")
648
656
  /**
649
657
  * Best-effort classification of why a callee did not resolve to an edge.
@@ -827,6 +835,12 @@ export type FeatureFlagActionType = ("investigate-flag" | "suppress-line")
827
835
  * Serializes as the integer `REVIEW_BRIEF_SCHEMA_VERSION`.
828
836
  */
829
837
  export type ReviewBriefSchemaVersion = number
838
+ /**
839
+ * The exactly-three shippable decision categories (the SOLID-3). No cut category
840
+ * (abstraction / deletion / convention / irreversibility) is representable: this
841
+ * enum is the structural guarantee that confirmed-noise categories never ship.
842
+ */
843
+ export type DecisionCategory = ("coupling-boundary" | "public-api-contract" | "dependency")
830
844
  /**
831
845
  * Coarse risk classification for a changeset, a pure function of the change
832
846
  * size (file count plus, once threaded, net lines).
@@ -856,12 +870,6 @@ export type ConfidenceFlag = ("dynamic-dispatch" | "re-export-indirection")
856
870
  * The category of a single weakening signal.
857
871
  */
858
872
  export type WeakeningKind = ("test-weakened" | "threshold-lowered" | "suppression-added" | "security-check-removed")
859
- /**
860
- * The exactly-three shippable decision categories (the SOLID-3). No cut category
861
- * (abstraction / deletion / convention / irreversibility) is representable: this
862
- * enum is the structural guarantee that confirmed-noise categories never ship.
863
- */
864
- export type DecisionCategory = ("coupling-boundary" | "public-api-contract" | "dependency")
865
873
  /**
866
874
  * Independently-versioned wire-version newtype. Serializes as the integer
867
875
  * [`DECISION_SURFACE_SCHEMA_VERSION`].
@@ -871,6 +879,19 @@ export type DecisionSurfaceSchemaVersion = number
871
879
  * The discriminated action kinds a decision can carry.
872
880
  */
873
881
  export type DecisionActionType = ("ask-expert" | "suppress")
882
+ /**
883
+ * The `fallow suppressions --format json` schema version. Independently
884
+ * versioned from the main contract, mirroring `SecuritySchemaVersion`.
885
+ */
886
+ export type SuppressionInventorySchemaVersion = "1"
887
+ /**
888
+ * Suppression marker scope.
889
+ */
890
+ export type SuppressionInventoryLevel = ("file" | "line")
891
+ /**
892
+ * How a suppression in the inventory was authored.
893
+ */
894
+ export type SuppressionInventoryOrigin = "comment"
874
895
  /**
875
896
  * Discriminator value for [`CodeClimateIssue::kind`].
876
897
  */
@@ -7185,6 +7206,11 @@ duplication: InspectEvidenceSection
7185
7206
  complexity: InspectEvidenceSection
7186
7207
  security: InspectEvidenceSection
7187
7208
  impact_closure: InspectEvidenceSection
7209
+ /**
7210
+ * OPT-IN target-level git churn. Omitted unless historical evidence was
7211
+ * explicitly requested by the caller.
7212
+ */
7213
+ churn?: (InspectEvidenceSection | null)
7188
7214
  /**
7189
7215
  * OPT-IN symbol-level call chain. Present only when `--symbol-chain` was
7190
7216
  * requested AND the target is a SYMBOL (best-effort, syntactic, OFF the
@@ -7939,6 +7965,11 @@ grouped_by: GroupByMode
7939
7965
  total_issues: number
7940
7966
  groups: CheckGroupedEntry[]
7941
7967
  _meta?: (Meta | null)
7968
+ /**
7969
+ * Diagnostics collected for the full analysis before issue grouping.
7970
+ * See [`CheckOutput::workspace_diagnostics`] for the contract.
7971
+ */
7972
+ workspace_diagnostics?: WorkspaceDiagnostic[]
7942
7973
  /**
7943
7974
  * Read-only follow-up commands computed from the full (ungrouped) findings.
7944
7975
  * See [`CheckOutput::next_steps`] for the contract.
@@ -9321,10 +9352,22 @@ dead_export_count: number
9321
9352
  dead_exports: string[]
9322
9353
  }
9323
9354
  /**
9324
- * `_meta.feature_flags` details emitted with `--explain`.
9355
+ * Optional `_meta` block for [`FeatureFlagsOutput`]. Both fields are optional
9356
+ * because the two contributors are independent: `feature_flags` details are
9357
+ * present only with `--explain`, and `telemetry` is injected post-pass by
9358
+ * [`attach_telemetry_meta`] whenever an analysis run id is available (which is
9359
+ * the default path). Mirrors `Meta` / `CombinedMeta`, which also model
9360
+ * `telemetry` as an optional, never-required property.
9325
9361
  */
9326
9362
  export interface FeatureFlagsMeta {
9327
- feature_flags: FeatureFlagsMetaDetails
9363
+ /**
9364
+ * Feature-flag detection explanations, emitted only with `--explain`.
9365
+ */
9366
+ feature_flags?: (FeatureFlagsMetaDetails | null)
9367
+ /**
9368
+ * Local telemetry correlation metadata for agent follow-up runs.
9369
+ */
9370
+ telemetry?: (TelemetryMeta | null)
9328
9371
  }
9329
9372
  /**
9330
9373
  * Feature flag explanatory metadata.
@@ -9352,21 +9395,48 @@ medium: string
9352
9395
  low: string
9353
9396
  }
9354
9397
  /**
9355
- * The full `fallow audit --brief --format json` envelope. Carries the
9356
- * informational verdict, the triage and graph-facts orientation stages, plus
9357
- * the reused "subtract" section (the same dead-code / duplication / complexity
9358
- * payload `fallow audit --format json` emits).
9398
+ * Complete `fallow audit --brief --format json` wire envelope.
9399
+ *
9400
+ * This is distinct from [`ReviewBriefOutput`], which is the reusable review
9401
+ * digest embedded in walkthrough output. The wire envelope also carries audit
9402
+ * metadata, optional telemetry, and the subtract-style analysis subreports.
9359
9403
  */
9360
- export interface ReviewBriefOutput {
9404
+ export interface ReviewBriefWireOutput {
9361
9405
  schema_version: ReviewBriefSchemaVersion
9362
- /**
9363
- * Fallow CLI version that produced this output.
9364
- */
9365
- version: string
9406
+ version: ToolVersion
9366
9407
  /**
9367
9408
  * Command discriminator singleton: always `"audit-brief"`.
9368
9409
  */
9369
9410
  command: string
9411
+ verdict: AuditVerdict
9412
+ /**
9413
+ * Number of changed files in the audit scope.
9414
+ */
9415
+ changed_files_count: number
9416
+ /**
9417
+ * Base ref used to determine the changeset.
9418
+ */
9419
+ base_ref: string
9420
+ /**
9421
+ * Human-readable description of the resolved base, when available.
9422
+ */
9423
+ base_description?: (string | null)
9424
+ /**
9425
+ * Head commit SHA, when available.
9426
+ */
9427
+ head_sha?: (string | null)
9428
+ elapsed_ms: ElapsedMs
9429
+ /**
9430
+ * Whether base-snapshot analysis was skipped for this run.
9431
+ */
9432
+ base_snapshot_skipped?: (boolean | null)
9433
+ summary: AuditSummary
9434
+ attribution: AuditAttribution
9435
+ /**
9436
+ * Optional metric definitions and local telemetry correlation metadata.
9437
+ */
9438
+ _meta?: (Meta | null)
9439
+ decisions: DecisionSurface
9370
9440
  triage: DiffTriage
9371
9441
  graph_facts: GraphFacts
9372
9442
  partition: PartitionFacts
@@ -9374,20 +9444,130 @@ impact_closure: ImpactClosureFacts
9374
9444
  focus: FocusMap
9375
9445
  deltas: ReviewDeltas
9376
9446
  /**
9377
- * 6.F, headline: reviewer-private weakening signals (tests
9378
- * removed/skipped, thresholds lowered, suppressions added, security steps
9379
- * removed). Advisory, never gates, never auto-posted.
9447
+ * Reviewer-private weakening signals.
9380
9448
  */
9381
9449
  weakening: WeakeningSignal[]
9382
9450
  routing: RoutingFacts
9383
- decisions: DecisionSurface
9451
+ /**
9452
+ * Dead-code findings scoped to the audit changeset.
9453
+ */
9454
+ dead_code?: (CheckOutput | null)
9455
+ /**
9456
+ * Duplication findings scoped to the audit changeset.
9457
+ */
9458
+ duplication?: (DupesReportPayload | null)
9459
+ /**
9460
+ * Complexity findings scoped to the audit changeset.
9461
+ */
9462
+ complexity?: (HealthReport | null)
9463
+ }
9464
+ /**
9465
+ * The ranked, capped decision surface plus the set of signal_ids the
9466
+ * deterministic layer emitted (the anti-hallucination allowlist).
9467
+ */
9468
+ export interface DecisionSurface {
9469
+ /**
9470
+ * Ranked decisions, highest consequence first.
9471
+ */
9472
+ decisions: Decision[]
9473
+ /**
9474
+ * Present when more than the cap were extracted.
9475
+ */
9476
+ truncated?: (TruncationNote | null)
9477
+ /**
9478
+ * Every signal_id the deterministic layer emitted, INCLUDING those whose
9479
+ * decision was collapsed below the cap or suppressed. The anti-hallucination
9480
+ * allowlist: an agent decision whose id is absent is rejected.
9481
+ */
9482
+ emitted_signal_ids: string[]
9483
+ }
9484
+ /**
9485
+ * One consequential structural decision, framed as a judgment question for a
9486
+ * human with taste, anchored to a fallow-emitted signal.
9487
+ */
9488
+ export interface Decision {
9489
+ /**
9490
+ * Deterministic anchor to the fallow-emitted candidate this decision frames.
9491
+ * `accept_signal_id` rejects any id not in the emitted set.
9492
+ */
9493
+ signal_id: string
9494
+ category: DecisionCategory
9495
+ /**
9496
+ * The decision framed as a judgment question for the human.
9497
+ */
9498
+ question: string
9499
+ /**
9500
+ * Root-relative file the decision is anchored at.
9501
+ */
9502
+ anchor_file: string
9503
+ /**
9504
+ * 1-based anchor line, when the underlying signal carries one (0 = file head).
9505
+ */
9506
+ anchor_line: number
9507
+ /**
9508
+ * The raw fallow-emitted candidate key the `signal_id` hashes.
9509
+ */
9510
+ signal_key: string
9511
+ /**
9512
+ * The `signal_id` this decision WOULD have had before any rename in this
9513
+ * change (the anchor file's pre-rename path). Present only when the anchor was
9514
+ * renamed. A review-memory layer carries a dismissal across a `git mv`: if
9515
+ * `previous_signal_id` was dismissed in an earlier PR, treat this decision as
9516
+ * dismissed too. Keeps `signal_id` itself exact + deterministic.
9517
+ */
9518
+ previous_signal_id?: (string | null)
9519
+ /**
9520
+ * Blast radius: count of modules affected beyond the diff by this decision.
9521
+ */
9522
+ blast: number
9523
+ /**
9524
+ * `blast * reversibility_weight`: the rank key (sorted descending).
9525
+ */
9526
+ consequence: number
9527
+ /**
9528
+ * The routed expert(s) to ask, from ownership routing. Empty when no
9529
+ * ownership signal is available for the anchor file.
9530
+ */
9531
+ expert: string[]
9532
+ /**
9533
+ * Whether the anchor file's only qualified owner is one person.
9534
+ */
9535
+ bus_factor_one?: boolean
9536
+ /**
9537
+ * Honest per-decision count: in-repo modules OUTSIDE the diff that already
9538
+ * depend on this decision's anchor. This is the DISPLAY number (taste
9539
+ * ownership: the human reads reversibility from the count itself), distinct
9540
+ * from `blast` (the project-wide proxy used only for ranking). Never a door
9541
+ * label. Internal-only by construction, so it cannot see a published library's
9542
+ * external consumers; the public-API trade-off clause names that risk in prose.
9543
+ */
9544
+ internal_consumer_count: number
9545
+ /**
9546
+ * The named structural sacrifice this change makes, stated as a fact, never a
9547
+ * recommendation (e.g. "Couples `app` to `infra`; 4 in-repo modules already
9548
+ * depend on this anchor."). A sibling fact to `question`; it never tells the
9549
+ * human what to choose.
9550
+ */
9551
+ tradeoff: string
9552
+ }
9553
+ /**
9554
+ * A note for decisions collapsed below the cap.
9555
+ */
9556
+ export interface TruncationNote {
9557
+ /**
9558
+ * How many decisions were collapsed below the cap.
9559
+ */
9560
+ collapsed: number
9561
+ /**
9562
+ * Human-readable collapse reason.
9563
+ */
9564
+ reason: string
9384
9565
  }
9385
9566
  /**
9386
9567
  * Stage 0 of the brief: triage facts derived purely from the diff size.
9387
9568
  *
9388
- * `hunks` and `net_lines` are `None` in v1: the file-level audit does not yet
9389
- * thread a `DiffIndex` (from `report/ci/diff_filter.rs`). They populate later,
9390
- * on `--diff-file` / `--diff-stdin`, without a schema bump.
9569
+ * `hunks` and `net_lines` are populated when the caller supplies parsed diff
9570
+ * evidence. They remain absent when no diff is available.
9391
9571
  */
9392
9572
  export interface DiffTriage {
9393
9573
  /**
@@ -9395,11 +9575,11 @@ export interface DiffTriage {
9395
9575
  */
9396
9576
  files: number
9397
9577
  /**
9398
- * Number of diff hunks. `None` in v1 (no diff index threaded yet).
9578
+ * Number of diff hunks, or `None` when no diff evidence was supplied.
9399
9579
  */
9400
9580
  hunks?: (number | null)
9401
9581
  /**
9402
- * Net added-minus-removed lines. `None` in v1 (no diff index threaded yet).
9582
+ * Net added-minus-removed lines, or `None` without diff evidence.
9403
9583
  */
9404
9584
  net_lines?: (number | null)
9405
9585
  risk_class: RiskClass
@@ -9411,18 +9591,20 @@ review_effort: ReviewEffort
9411
9591
  * `boundaries_touched` is derived from the run's boundary-violation zones;
9412
9592
  * `reachable_from` is populated by the impact closure (the affected-not-shown
9413
9593
  * set: modules the changed code is reachable from / affects, none in the diff).
9414
- * `exports_added` / `api_width_delta` stay honestly stubbed (`0`) until the
9415
- * export-surface delta lands. The fields are present and correctly typed so
9416
- * values fill in later without a schema bump.
9594
+ * `exports_added` and `api_width_delta` both report the exports-aware public API
9595
+ * widening count. Removed exports are not represented in this widening-only
9596
+ * signal.
9417
9597
  */
9418
9598
  export interface GraphFacts {
9419
9599
  /**
9420
- * Number of exports added by the changeset. Stubbed to `0` in v1.
9600
+ * Number of public API exports added by the changeset. Zero means the
9601
+ * changeset adds no public API exports.
9421
9602
  */
9422
9603
  exports_added: number
9423
9604
  /**
9424
- * Change in public API width (added minus removed exports). Stubbed to `0`
9425
- * in v1.
9605
+ * Widening-only public API delta, currently equal to `exports_added`.
9606
+ * Removed exports are not represented, so zero means no public API exports
9607
+ * were added.
9426
9608
  */
9427
9609
  api_width_delta: number
9428
9610
  /**
@@ -9670,108 +9852,6 @@ expert: string[]
9670
9852
  */
9671
9853
  bus_factor_one?: boolean
9672
9854
  }
9673
- /**
9674
- * The ranked, capped decision surface plus the set of signal_ids the
9675
- * deterministic layer emitted (the anti-hallucination allowlist).
9676
- */
9677
- export interface DecisionSurface {
9678
- /**
9679
- * Ranked decisions, highest consequence first.
9680
- */
9681
- decisions: Decision[]
9682
- /**
9683
- * Present when more than the cap were extracted.
9684
- */
9685
- truncated?: (TruncationNote | null)
9686
- /**
9687
- * Every signal_id the deterministic layer emitted, INCLUDING those whose
9688
- * decision was collapsed below the cap or suppressed. The anti-hallucination
9689
- * allowlist: an agent decision whose id is absent is rejected.
9690
- */
9691
- emitted_signal_ids: string[]
9692
- }
9693
- /**
9694
- * One consequential structural decision, framed as a judgment question for a
9695
- * human with taste, anchored to a fallow-emitted signal.
9696
- */
9697
- export interface Decision {
9698
- /**
9699
- * Deterministic anchor to the fallow-emitted candidate this decision frames.
9700
- * `accept_signal_id` rejects any id not in the emitted set.
9701
- */
9702
- signal_id: string
9703
- category: DecisionCategory
9704
- /**
9705
- * The decision framed as a judgment question for the human.
9706
- */
9707
- question: string
9708
- /**
9709
- * Root-relative file the decision is anchored at.
9710
- */
9711
- anchor_file: string
9712
- /**
9713
- * 1-based anchor line, when the underlying signal carries one (0 = file head).
9714
- */
9715
- anchor_line: number
9716
- /**
9717
- * The raw fallow-emitted candidate key the `signal_id` hashes.
9718
- */
9719
- signal_key: string
9720
- /**
9721
- * The `signal_id` this decision WOULD have had before any rename in this
9722
- * change (the anchor file's pre-rename path). Present only when the anchor was
9723
- * renamed. A review-memory layer carries a dismissal across a `git mv`: if
9724
- * `previous_signal_id` was dismissed in an earlier PR, treat this decision as
9725
- * dismissed too. Keeps `signal_id` itself exact + deterministic.
9726
- */
9727
- previous_signal_id?: (string | null)
9728
- /**
9729
- * Blast radius: count of modules affected beyond the diff by this decision.
9730
- */
9731
- blast: number
9732
- /**
9733
- * `blast * reversibility_weight`: the rank key (sorted descending).
9734
- */
9735
- consequence: number
9736
- /**
9737
- * The routed expert(s) to ask, from ownership routing. Empty when no
9738
- * ownership signal is available for the anchor file.
9739
- */
9740
- expert: string[]
9741
- /**
9742
- * Whether the anchor file's only qualified owner is one person.
9743
- */
9744
- bus_factor_one?: boolean
9745
- /**
9746
- * Honest per-decision count: in-repo modules OUTSIDE the diff that already
9747
- * depend on this decision's anchor. This is the DISPLAY number (taste
9748
- * ownership: the human reads reversibility from the count itself), distinct
9749
- * from `blast` (the project-wide proxy used only for ranking). Never a door
9750
- * label. Internal-only by construction, so it cannot see a published library's
9751
- * external consumers; the public-API trade-off clause names that risk in prose.
9752
- */
9753
- internal_consumer_count: number
9754
- /**
9755
- * The named structural sacrifice this change makes, stated as a fact, never a
9756
- * recommendation (e.g. "Couples `app` to `infra`; 4 in-repo modules already
9757
- * depend on this anchor."). A sibling fact to `question`; it never tells the
9758
- * human what to choose.
9759
- */
9760
- tradeoff: string
9761
- }
9762
- /**
9763
- * A note for decisions collapsed below the cap.
9764
- */
9765
- export interface TruncationNote {
9766
- /**
9767
- * How many decisions were collapsed below the cap.
9768
- */
9769
- collapsed: number
9770
- /**
9771
- * Human-readable collapse reason.
9772
- */
9773
- reason: string
9774
- }
9775
9855
  /**
9776
9856
  * The separable `decision-surface` envelope: the single call that puts taste-
9777
9857
  * decisions in front of a human, callable WITHOUT the full pipeline (the
@@ -9928,6 +10008,37 @@ agent_schema: AgentSchema
9928
10008
  */
9929
10009
  injection_note: string
9930
10010
  }
10011
+ /**
10012
+ * The full `fallow audit --brief --format json` envelope. Carries the
10013
+ * informational verdict, the triage and graph-facts orientation stages, plus
10014
+ * the reused "subtract" section (the same dead-code / duplication / complexity
10015
+ * payload `fallow audit --format json` emits).
10016
+ */
10017
+ export interface ReviewBriefOutput {
10018
+ schema_version: ReviewBriefSchemaVersion
10019
+ /**
10020
+ * Fallow CLI version that produced this output.
10021
+ */
10022
+ version: string
10023
+ /**
10024
+ * Command discriminator singleton: always `"audit-brief"`.
10025
+ */
10026
+ command: string
10027
+ triage: DiffTriage
10028
+ graph_facts: GraphFacts
10029
+ partition: PartitionFacts
10030
+ impact_closure: ImpactClosureFacts
10031
+ focus: FocusMap
10032
+ deltas: ReviewDeltas
10033
+ /**
10034
+ * 6.F, headline: reviewer-private weakening signals (tests
10035
+ * removed/skipped, thresholds lowered, suppressions added, security steps
10036
+ * removed). Advisory, never gates, never auto-posted.
10037
+ */
10038
+ weakening: WeakeningSignal[]
10039
+ routing: RoutingFacts
10040
+ decisions: DecisionSurface
10041
+ }
9931
10042
  /**
9932
10043
  * The review direction artifact: the order to review in, the coherent units,
9933
10044
  * and per-unit concern lens + out-of-diff + expert. A minimal projection of the
@@ -10135,6 +10246,106 @@ change_anchor: string
10135
10246
  */
10136
10247
  reason: string
10137
10248
  }
10249
+ /**
10250
+ * The `fallow suppressions --format json` envelope. `FallowOutput`
10251
+ * discriminates it by the `kind: "suppression-inventory"` tag.
10252
+ *
10253
+ * A read-only projection over the suppression markers present in analyzed
10254
+ * files this run: nothing here is a finding, and the command that emits it
10255
+ * always exits 0.
10256
+ */
10257
+ export interface SuppressionInventoryOutput {
10258
+ schema_version: SuppressionInventorySchemaVersion
10259
+ summary: SuppressionInventorySummary
10260
+ /**
10261
+ * Per-file suppression listings, sorted by path then line.
10262
+ */
10263
+ files: SuppressionInventoryFile[]
10264
+ }
10265
+ /**
10266
+ * Project-level totals for the suppression inventory.
10267
+ */
10268
+ export interface SuppressionInventorySummary {
10269
+ /**
10270
+ * Total suppression markers in scope.
10271
+ */
10272
+ total: number
10273
+ /**
10274
+ * Number of files carrying at least one marker.
10275
+ */
10276
+ files: number
10277
+ /**
10278
+ * Markers without a human-authored `--` reason.
10279
+ */
10280
+ without_reason: number
10281
+ /**
10282
+ * Markers that also appear as stale-suppression findings this run. This
10283
+ * is a JOIN against the existing stale-suppression detector's output
10284
+ * (matched by file and kind), not a new detection.
10285
+ */
10286
+ stale: number
10287
+ /**
10288
+ * Marker counts per suppressed kind, sorted by count (descending) then
10289
+ * kind. `kind` is `null` for blanket markers, mirroring the per-entry
10290
+ * contract.
10291
+ */
10292
+ by_kind: SuppressionKindCount[]
10293
+ }
10294
+ /**
10295
+ * One `by_kind` row in the suppression inventory summary.
10296
+ */
10297
+ export interface SuppressionKindCount {
10298
+ /**
10299
+ * The suppressed issue kind in kebab-case, or `null` for blanket markers
10300
+ * (rendered as "blanket" in human output; machine consumers branch on
10301
+ * `null`).
10302
+ */
10303
+ kind?: (string | null)
10304
+ /**
10305
+ * Number of markers targeting this kind.
10306
+ */
10307
+ count: number
10308
+ }
10309
+ /**
10310
+ * One file's suppression listing.
10311
+ */
10312
+ export interface SuppressionInventoryFile {
10313
+ /**
10314
+ * Project-root-relative path, forward-slash separated.
10315
+ */
10316
+ path: string
10317
+ /**
10318
+ * Markers in this file, sorted by line.
10319
+ */
10320
+ suppressions: SuppressionInventoryEntry[]
10321
+ }
10322
+ /**
10323
+ * One suppression marker in the inventory.
10324
+ */
10325
+ export interface SuppressionInventoryEntry {
10326
+ /**
10327
+ * 1-based line of the suppression comment itself; 0 only if unknown.
10328
+ */
10329
+ line: number
10330
+ /**
10331
+ * The suppressed issue kind in kebab-case (e.g. `"unused-export"`), or
10332
+ * `null` for a blanket marker that suppresses every kind on its target.
10333
+ * Human output renders the blanket case as the literal word "blanket";
10334
+ * the JSON contract deliberately keeps `null` so machine consumers
10335
+ * branch on `null` instead of a magic string.
10336
+ */
10337
+ kind?: (string | null)
10338
+ level: SuppressionInventoryLevel
10339
+ origin: SuppressionInventoryOrigin
10340
+ /**
10341
+ * Human-authored reason after `--`; `null` when absent.
10342
+ */
10343
+ reason?: (string | null)
10344
+ /**
10345
+ * Whether a human-authored reason is present.
10346
+ */
10347
+ reason_present: boolean
10348
+ }
10138
10349
  /**
10139
10350
  * Single CodeClimate-compatible issue inside [`CodeClimateOutput`].
10140
10351
  */
@@ -10175,6 +10386,29 @@ export interface CodeClimateLines {
10175
10386
  */
10176
10387
  begin: number
10177
10388
  }
10389
+ /**
10390
+ * Structured JSON error emitted on stdout when `--format json` is active and a
10391
+ * command fails. It carries no `kind` discriminator: it is distinguished from
10392
+ * the kind-tagged success envelopes by the required `error: true` field, and is
10393
+ * a document-root branch alongside `FallowOutput` and `CodeClimateOutput` in
10394
+ * `docs/output-schema.json`. Agents that pass `--format json` and observe a
10395
+ * non-zero exit code parse this shape from stdout.
10396
+ */
10397
+ export interface ErrorOutput {
10398
+ /**
10399
+ * Always `true`. The discriminator that separates an error document from a
10400
+ * success envelope (which instead carries a `kind`).
10401
+ */
10402
+ error: boolean
10403
+ /**
10404
+ * Human-readable error message.
10405
+ */
10406
+ message: string
10407
+ /**
10408
+ * The process exit code the CLI returns alongside this document.
10409
+ */
10410
+ exit_code: number
10411
+ }
10178
10412
 
10179
10413
  /**
10180
10414
  * Inner complexity-violation payload, flattened into `HealthFinding`