fallow 3.4.2 → 3.5.1
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 +40 -81
- package/bin/fallow-lsp +4 -1
- package/bin/fallow-mcp +4 -1
- package/capabilities.json +14 -3
- package/package.json +10 -10
- package/scripts/lazy-verify.js +4 -1
- package/scripts/lazy-verify.test.js +6 -11
- package/scripts/run-binary.js +10 -2
- package/scripts/run-binary.test.js +71 -0
- package/scripts/verify-binary.js +9 -5
- package/scripts/verify-binary.test.js +16 -22
- package/skills/fallow/SKILL.md +6 -4
- package/skills/fallow/references/cli-reference.md +19 -15
- package/skills/fallow/references/mcp.md +1 -1
- package/skills/fallow/references/patterns.md +6 -6
- package/types/output-contract.d.ts +249 -141
|
@@ -7,9 +7,9 @@
|
|
|
7
7
|
* `npm/fallow/types/output-contract.d.ts` (published as `fallow/types`).
|
|
8
8
|
*
|
|
9
9
|
* To change a shape:
|
|
10
|
-
* 1.
|
|
11
|
-
*
|
|
12
|
-
*
|
|
10
|
+
* 1. Find the Rust owner through `derived_definition_names()` and its
|
|
11
|
+
* imports in `crates/cli/src/bin/schema_emit.rs`, then edit that type.
|
|
12
|
+
* Rust is the runtime source of truth for the JSON output.
|
|
13
13
|
* 2. Regenerate `docs/output-schema.json` with
|
|
14
14
|
* `cargo run -p fallow-cli --features schema-emit --bin fallow-schema-emit`.
|
|
15
15
|
* The schema-emit drift tests compare the committed schema against the
|
|
@@ -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`, `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.
|
|
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"
|
|
@@ -651,7 +651,7 @@ export_name: string
|
|
|
651
651
|
type: "symbol"
|
|
652
652
|
})
|
|
653
653
|
export type InspectIdentity = (InspectFileIdentity | InspectSymbolIdentity)
|
|
654
|
-
export type InspectSectionStatus = ("ok" | "error")
|
|
654
|
+
export type InspectSectionStatus = ("ok" | "unavailable" | "error")
|
|
655
655
|
export type InspectEvidenceScope = ("symbol" | "file" | "project_filtered_to_file")
|
|
656
656
|
/**
|
|
657
657
|
* Best-effort classification of why a callee did not resolve to an edge.
|
|
@@ -835,6 +835,12 @@ export type FeatureFlagActionType = ("investigate-flag" | "suppress-line")
|
|
|
835
835
|
* Serializes as the integer `REVIEW_BRIEF_SCHEMA_VERSION`.
|
|
836
836
|
*/
|
|
837
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")
|
|
838
844
|
/**
|
|
839
845
|
* Coarse risk classification for a changeset, a pure function of the change
|
|
840
846
|
* size (file count plus, once threaded, net lines).
|
|
@@ -864,12 +870,6 @@ export type ConfidenceFlag = ("dynamic-dispatch" | "re-export-indirection")
|
|
|
864
870
|
* The category of a single weakening signal.
|
|
865
871
|
*/
|
|
866
872
|
export type WeakeningKind = ("test-weakened" | "threshold-lowered" | "suppression-added" | "security-check-removed")
|
|
867
|
-
/**
|
|
868
|
-
* The exactly-three shippable decision categories (the SOLID-3). No cut category
|
|
869
|
-
* (abstraction / deletion / convention / irreversibility) is representable: this
|
|
870
|
-
* enum is the structural guarantee that confirmed-noise categories never ship.
|
|
871
|
-
*/
|
|
872
|
-
export type DecisionCategory = ("coupling-boundary" | "public-api-contract" | "dependency")
|
|
873
873
|
/**
|
|
874
874
|
* Independently-versioned wire-version newtype. Serializes as the integer
|
|
875
875
|
* [`DECISION_SURFACE_SCHEMA_VERSION`].
|
|
@@ -7206,6 +7206,11 @@ duplication: InspectEvidenceSection
|
|
|
7206
7206
|
complexity: InspectEvidenceSection
|
|
7207
7207
|
security: InspectEvidenceSection
|
|
7208
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)
|
|
7209
7214
|
/**
|
|
7210
7215
|
* OPT-IN symbol-level call chain. Present only when `--symbol-chain` was
|
|
7211
7216
|
* requested AND the target is a SYMBOL (best-effort, syntactic, OFF the
|
|
@@ -9347,10 +9352,22 @@ dead_export_count: number
|
|
|
9347
9352
|
dead_exports: string[]
|
|
9348
9353
|
}
|
|
9349
9354
|
/**
|
|
9350
|
-
* `_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.
|
|
9351
9361
|
*/
|
|
9352
9362
|
export interface FeatureFlagsMeta {
|
|
9353
|
-
|
|
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)
|
|
9354
9371
|
}
|
|
9355
9372
|
/**
|
|
9356
9373
|
* Feature flag explanatory metadata.
|
|
@@ -9378,21 +9395,48 @@ medium: string
|
|
|
9378
9395
|
low: string
|
|
9379
9396
|
}
|
|
9380
9397
|
/**
|
|
9381
|
-
*
|
|
9382
|
-
*
|
|
9383
|
-
*
|
|
9384
|
-
*
|
|
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.
|
|
9385
9403
|
*/
|
|
9386
|
-
export interface
|
|
9404
|
+
export interface ReviewBriefWireOutput {
|
|
9387
9405
|
schema_version: ReviewBriefSchemaVersion
|
|
9388
|
-
|
|
9389
|
-
* Fallow CLI version that produced this output.
|
|
9390
|
-
*/
|
|
9391
|
-
version: string
|
|
9406
|
+
version: ToolVersion
|
|
9392
9407
|
/**
|
|
9393
9408
|
* Command discriminator singleton: always `"audit-brief"`.
|
|
9394
9409
|
*/
|
|
9395
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
|
|
9396
9440
|
triage: DiffTriage
|
|
9397
9441
|
graph_facts: GraphFacts
|
|
9398
9442
|
partition: PartitionFacts
|
|
@@ -9400,20 +9444,130 @@ impact_closure: ImpactClosureFacts
|
|
|
9400
9444
|
focus: FocusMap
|
|
9401
9445
|
deltas: ReviewDeltas
|
|
9402
9446
|
/**
|
|
9403
|
-
*
|
|
9404
|
-
* removed/skipped, thresholds lowered, suppressions added, security steps
|
|
9405
|
-
* removed). Advisory, never gates, never auto-posted.
|
|
9447
|
+
* Reviewer-private weakening signals.
|
|
9406
9448
|
*/
|
|
9407
9449
|
weakening: WeakeningSignal[]
|
|
9408
9450
|
routing: RoutingFacts
|
|
9409
|
-
|
|
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
|
|
9410
9565
|
}
|
|
9411
9566
|
/**
|
|
9412
9567
|
* Stage 0 of the brief: triage facts derived purely from the diff size.
|
|
9413
9568
|
*
|
|
9414
|
-
* `hunks` and `net_lines` are
|
|
9415
|
-
*
|
|
9416
|
-
* 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.
|
|
9417
9571
|
*/
|
|
9418
9572
|
export interface DiffTriage {
|
|
9419
9573
|
/**
|
|
@@ -9421,11 +9575,11 @@ export interface DiffTriage {
|
|
|
9421
9575
|
*/
|
|
9422
9576
|
files: number
|
|
9423
9577
|
/**
|
|
9424
|
-
* Number of diff hunks
|
|
9578
|
+
* Number of diff hunks, or `None` when no diff evidence was supplied.
|
|
9425
9579
|
*/
|
|
9426
9580
|
hunks?: (number | null)
|
|
9427
9581
|
/**
|
|
9428
|
-
* Net added-minus-removed lines
|
|
9582
|
+
* Net added-minus-removed lines, or `None` without diff evidence.
|
|
9429
9583
|
*/
|
|
9430
9584
|
net_lines?: (number | null)
|
|
9431
9585
|
risk_class: RiskClass
|
|
@@ -9437,18 +9591,20 @@ review_effort: ReviewEffort
|
|
|
9437
9591
|
* `boundaries_touched` is derived from the run's boundary-violation zones;
|
|
9438
9592
|
* `reachable_from` is populated by the impact closure (the affected-not-shown
|
|
9439
9593
|
* set: modules the changed code is reachable from / affects, none in the diff).
|
|
9440
|
-
* `exports_added`
|
|
9441
|
-
*
|
|
9442
|
-
*
|
|
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.
|
|
9443
9597
|
*/
|
|
9444
9598
|
export interface GraphFacts {
|
|
9445
9599
|
/**
|
|
9446
|
-
* 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.
|
|
9447
9602
|
*/
|
|
9448
9603
|
exports_added: number
|
|
9449
9604
|
/**
|
|
9450
|
-
*
|
|
9451
|
-
*
|
|
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.
|
|
9452
9608
|
*/
|
|
9453
9609
|
api_width_delta: number
|
|
9454
9610
|
/**
|
|
@@ -9696,108 +9852,6 @@ expert: string[]
|
|
|
9696
9852
|
*/
|
|
9697
9853
|
bus_factor_one?: boolean
|
|
9698
9854
|
}
|
|
9699
|
-
/**
|
|
9700
|
-
* The ranked, capped decision surface plus the set of signal_ids the
|
|
9701
|
-
* deterministic layer emitted (the anti-hallucination allowlist).
|
|
9702
|
-
*/
|
|
9703
|
-
export interface DecisionSurface {
|
|
9704
|
-
/**
|
|
9705
|
-
* Ranked decisions, highest consequence first.
|
|
9706
|
-
*/
|
|
9707
|
-
decisions: Decision[]
|
|
9708
|
-
/**
|
|
9709
|
-
* Present when more than the cap were extracted.
|
|
9710
|
-
*/
|
|
9711
|
-
truncated?: (TruncationNote | null)
|
|
9712
|
-
/**
|
|
9713
|
-
* Every signal_id the deterministic layer emitted, INCLUDING those whose
|
|
9714
|
-
* decision was collapsed below the cap or suppressed. The anti-hallucination
|
|
9715
|
-
* allowlist: an agent decision whose id is absent is rejected.
|
|
9716
|
-
*/
|
|
9717
|
-
emitted_signal_ids: string[]
|
|
9718
|
-
}
|
|
9719
|
-
/**
|
|
9720
|
-
* One consequential structural decision, framed as a judgment question for a
|
|
9721
|
-
* human with taste, anchored to a fallow-emitted signal.
|
|
9722
|
-
*/
|
|
9723
|
-
export interface Decision {
|
|
9724
|
-
/**
|
|
9725
|
-
* Deterministic anchor to the fallow-emitted candidate this decision frames.
|
|
9726
|
-
* `accept_signal_id` rejects any id not in the emitted set.
|
|
9727
|
-
*/
|
|
9728
|
-
signal_id: string
|
|
9729
|
-
category: DecisionCategory
|
|
9730
|
-
/**
|
|
9731
|
-
* The decision framed as a judgment question for the human.
|
|
9732
|
-
*/
|
|
9733
|
-
question: string
|
|
9734
|
-
/**
|
|
9735
|
-
* Root-relative file the decision is anchored at.
|
|
9736
|
-
*/
|
|
9737
|
-
anchor_file: string
|
|
9738
|
-
/**
|
|
9739
|
-
* 1-based anchor line, when the underlying signal carries one (0 = file head).
|
|
9740
|
-
*/
|
|
9741
|
-
anchor_line: number
|
|
9742
|
-
/**
|
|
9743
|
-
* The raw fallow-emitted candidate key the `signal_id` hashes.
|
|
9744
|
-
*/
|
|
9745
|
-
signal_key: string
|
|
9746
|
-
/**
|
|
9747
|
-
* The `signal_id` this decision WOULD have had before any rename in this
|
|
9748
|
-
* change (the anchor file's pre-rename path). Present only when the anchor was
|
|
9749
|
-
* renamed. A review-memory layer carries a dismissal across a `git mv`: if
|
|
9750
|
-
* `previous_signal_id` was dismissed in an earlier PR, treat this decision as
|
|
9751
|
-
* dismissed too. Keeps `signal_id` itself exact + deterministic.
|
|
9752
|
-
*/
|
|
9753
|
-
previous_signal_id?: (string | null)
|
|
9754
|
-
/**
|
|
9755
|
-
* Blast radius: count of modules affected beyond the diff by this decision.
|
|
9756
|
-
*/
|
|
9757
|
-
blast: number
|
|
9758
|
-
/**
|
|
9759
|
-
* `blast * reversibility_weight`: the rank key (sorted descending).
|
|
9760
|
-
*/
|
|
9761
|
-
consequence: number
|
|
9762
|
-
/**
|
|
9763
|
-
* The routed expert(s) to ask, from ownership routing. Empty when no
|
|
9764
|
-
* ownership signal is available for the anchor file.
|
|
9765
|
-
*/
|
|
9766
|
-
expert: string[]
|
|
9767
|
-
/**
|
|
9768
|
-
* Whether the anchor file's only qualified owner is one person.
|
|
9769
|
-
*/
|
|
9770
|
-
bus_factor_one?: boolean
|
|
9771
|
-
/**
|
|
9772
|
-
* Honest per-decision count: in-repo modules OUTSIDE the diff that already
|
|
9773
|
-
* depend on this decision's anchor. This is the DISPLAY number (taste
|
|
9774
|
-
* ownership: the human reads reversibility from the count itself), distinct
|
|
9775
|
-
* from `blast` (the project-wide proxy used only for ranking). Never a door
|
|
9776
|
-
* label. Internal-only by construction, so it cannot see a published library's
|
|
9777
|
-
* external consumers; the public-API trade-off clause names that risk in prose.
|
|
9778
|
-
*/
|
|
9779
|
-
internal_consumer_count: number
|
|
9780
|
-
/**
|
|
9781
|
-
* The named structural sacrifice this change makes, stated as a fact, never a
|
|
9782
|
-
* recommendation (e.g. "Couples `app` to `infra`; 4 in-repo modules already
|
|
9783
|
-
* depend on this anchor."). A sibling fact to `question`; it never tells the
|
|
9784
|
-
* human what to choose.
|
|
9785
|
-
*/
|
|
9786
|
-
tradeoff: string
|
|
9787
|
-
}
|
|
9788
|
-
/**
|
|
9789
|
-
* A note for decisions collapsed below the cap.
|
|
9790
|
-
*/
|
|
9791
|
-
export interface TruncationNote {
|
|
9792
|
-
/**
|
|
9793
|
-
* How many decisions were collapsed below the cap.
|
|
9794
|
-
*/
|
|
9795
|
-
collapsed: number
|
|
9796
|
-
/**
|
|
9797
|
-
* Human-readable collapse reason.
|
|
9798
|
-
*/
|
|
9799
|
-
reason: string
|
|
9800
|
-
}
|
|
9801
9855
|
/**
|
|
9802
9856
|
* The separable `decision-surface` envelope: the single call that puts taste-
|
|
9803
9857
|
* decisions in front of a human, callable WITHOUT the full pipeline (the
|
|
@@ -9954,6 +10008,37 @@ agent_schema: AgentSchema
|
|
|
9954
10008
|
*/
|
|
9955
10009
|
injection_note: string
|
|
9956
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
|
+
}
|
|
9957
10042
|
/**
|
|
9958
10043
|
* The review direction artifact: the order to review in, the coherent units,
|
|
9959
10044
|
* and per-unit concern lens + out-of-diff + expert. A minimal projection of the
|
|
@@ -10301,6 +10386,29 @@ export interface CodeClimateLines {
|
|
|
10301
10386
|
*/
|
|
10302
10387
|
begin: number
|
|
10303
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
|
+
}
|
|
10304
10412
|
|
|
10305
10413
|
/**
|
|
10306
10414
|
* Inner complexity-violation payload, flattened into `HealthFinding`
|