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.
- package/README.md +12 -2
- package/bin/fallow-lsp +4 -1
- package/bin/fallow-mcp +4 -1
- package/capabilities.json +70 -3
- package/package.json +10 -10
- package/schema.json +1 -1
- package/scripts/lazy-verify.js +4 -1
- package/scripts/lazy-verify.test.js +6 -11
- package/scripts/run-binary.js +10 -2
- package/scripts/verify-binary.js +9 -5
- package/scripts/verify-binary.test.js +16 -22
- package/skills/fallow/SKILL.md +2 -0
- package/skills/fallow/references/cli-reference.md +18 -13
- package/skills/fallow/references/mcp.md +2 -1
- package/skills/fallow/references/patterns.md +6 -6
- package/types/output-contract.d.ts +372 -138
|
@@ -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
|
-
}) | (
|
|
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
|
|
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
|
-
|
|
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
|
-
*
|
|
9356
|
-
*
|
|
9357
|
-
*
|
|
9358
|
-
*
|
|
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
|
|
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
|
-
*
|
|
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
|
-
|
|
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
|
|
9389
|
-
*
|
|
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
|
|
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
|
|
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`
|
|
9415
|
-
*
|
|
9416
|
-
*
|
|
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.
|
|
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
|
-
*
|
|
9425
|
-
*
|
|
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`
|