audit-tools 0.49.0 → 0.50.2
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 +3 -1
- package/dist/audit/cli/args.d.ts +27 -0
- package/dist/audit/cli/args.d.ts.map +1 -1
- package/dist/audit/cli/args.js +32 -2
- package/dist/audit/cli/args.js.map +1 -1
- package/dist/audit/cli/dispatch/hostHandoff.d.ts +1 -1
- package/dist/audit/cli/dispatch/hostHandoff.d.ts.map +1 -1
- package/dist/audit/cli/dispatch/hostHandoff.js +32 -55
- package/dist/audit/cli/dispatch/hostHandoff.js.map +1 -1
- package/dist/audit/cli/nextStepHelpers.d.ts.map +1 -1
- package/dist/audit/cli/nextStepHelpers.js +8 -8
- package/dist/audit/cli/nextStepHelpers.js.map +1 -1
- package/dist/audit/io/artifacts.d.ts +0 -28
- package/dist/audit/io/artifacts.d.ts.map +1 -1
- package/dist/audit/io/artifacts.js +1 -65
- package/dist/audit/io/artifacts.js.map +1 -1
- package/dist/audit/orchestrator/advance.d.ts.map +1 -1
- package/dist/audit/orchestrator/advance.js +12 -10
- package/dist/audit/orchestrator/advance.js.map +1 -1
- package/dist/audit/orchestrator/designReviewSnapshot.d.ts.map +1 -1
- package/dist/audit/orchestrator/designReviewSnapshot.js +2 -5
- package/dist/audit/orchestrator/designReviewSnapshot.js.map +1 -1
- package/dist/audit/reporting/mergeFindings.d.ts.map +1 -1
- package/dist/audit/reporting/mergeFindings.js +1 -2
- package/dist/audit/reporting/mergeFindings.js.map +1 -1
- package/dist/remediate/contractPipeline/cyclicSeamResolution.d.ts +25 -10
- package/dist/remediate/contractPipeline/cyclicSeamResolution.d.ts.map +1 -1
- package/dist/remediate/contractPipeline/cyclicSeamResolution.js +35 -88
- package/dist/remediate/contractPipeline/cyclicSeamResolution.js.map +1 -1
- package/dist/remediate/contractPipeline/idRegistry.d.ts +10 -20
- package/dist/remediate/contractPipeline/idRegistry.d.ts.map +1 -1
- package/dist/remediate/contractPipeline/idRegistry.js +10 -24
- package/dist/remediate/contractPipeline/idRegistry.js.map +1 -1
- package/dist/remediate/contractPipeline/obligationKinds.d.ts +27 -0
- package/dist/remediate/contractPipeline/obligationKinds.d.ts.map +1 -0
- package/dist/remediate/contractPipeline/obligationKinds.js +18 -0
- package/dist/remediate/contractPipeline/obligationKinds.js.map +1 -0
- package/dist/remediate/dedup/crossLensDedup.d.ts +2 -3
- package/dist/remediate/dedup/crossLensDedup.d.ts.map +1 -1
- package/dist/remediate/dedup/crossLensDedup.js +2 -4
- package/dist/remediate/dedup/crossLensDedup.js.map +1 -1
- package/dist/remediate/index.d.ts +38 -8
- package/dist/remediate/index.d.ts.map +1 -1
- package/dist/remediate/index.js +75 -27
- package/dist/remediate/index.js.map +1 -1
- package/dist/remediate/steps/contractPipeline.d.ts +6 -62
- package/dist/remediate/steps/contractPipeline.d.ts.map +1 -1
- package/dist/remediate/steps/contractPipeline.js +11 -80
- package/dist/remediate/steps/contractPipeline.js.map +1 -1
- package/dist/remediate/steps/dispatch/hostHandoff.d.ts.map +1 -1
- package/dist/remediate/steps/dispatch/hostHandoff.js +57 -48
- package/dist/remediate/steps/dispatch/hostHandoff.js.map +1 -1
- package/dist/remediate/steps/nextStep.d.ts +83 -2
- package/dist/remediate/steps/nextStep.d.ts.map +1 -1
- package/dist/remediate/steps/nextStep.js +79 -11
- package/dist/remediate/steps/nextStep.js.map +1 -1
- package/dist/remediate/steps/types.d.ts +1 -1
- package/dist/remediate/steps/types.d.ts.map +1 -1
- package/dist/remediate/steps/types.js.map +1 -1
- package/dist/remediate/utils/fileIntegrity.d.ts.map +1 -1
- package/dist/remediate/utils/fileIntegrity.js +123 -30
- package/dist/remediate/utils/fileIntegrity.js.map +1 -1
- package/dist/remediate/validation/artifacts.d.ts.map +1 -1
- package/dist/remediate/validation/artifacts.js +3 -9
- package/dist/remediate/validation/artifacts.js.map +1 -1
- package/dist/remediate/validation/contractPipeline.d.ts +1 -1
- package/dist/remediate/validation/contractPipeline.d.ts.map +1 -1
- package/dist/remediate/validation/contractPipeline.js +8 -46
- package/dist/remediate/validation/contractPipeline.js.map +1 -1
- package/dist/remediate/validation/contractPipelineGates.d.ts +12 -20
- package/dist/remediate/validation/contractPipelineGates.d.ts.map +1 -1
- package/dist/remediate/validation/contractPipelineGates.js +107 -135
- package/dist/remediate/validation/contractPipelineGates.js.map +1 -1
- package/dist/shared/engine/obligationEngine.d.ts +32 -0
- package/dist/shared/engine/obligationEngine.d.ts.map +1 -1
- package/dist/shared/engine/obligationEngine.js +29 -0
- package/dist/shared/engine/obligationEngine.js.map +1 -1
- package/dist/shared/findings/dedupe.d.ts +4 -11
- package/dist/shared/findings/dedupe.d.ts.map +1 -1
- package/dist/shared/findings/dedupe.js +196 -163
- package/dist/shared/findings/dedupe.js.map +1 -1
- package/dist/shared/graph/directedCycles.d.ts +61 -0
- package/dist/shared/graph/directedCycles.d.ts.map +1 -0
- package/dist/shared/graph/directedCycles.js +190 -0
- package/dist/shared/graph/directedCycles.js.map +1 -0
- package/dist/shared/index.d.ts +6 -3
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +4 -2
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/io/repoRoot.d.ts +45 -0
- package/dist/shared/io/repoRoot.d.ts.map +1 -1
- package/dist/shared/io/repoRoot.js +91 -1
- package/dist/shared/io/repoRoot.js.map +1 -1
- package/dist/shared/submission/submissionScan.d.ts +86 -0
- package/dist/shared/submission/submissionScan.d.ts.map +1 -0
- package/dist/shared/submission/submissionScan.js +93 -0
- package/dist/shared/submission/submissionScan.js.map +1 -0
- package/dist/shared/types/obligationLedger.d.ts +7 -3
- package/dist/shared/types/obligationLedger.d.ts.map +1 -1
- package/dist/shared/types/obligationLedger.js +9 -37
- package/dist/shared/types/obligationLedger.js.map +1 -1
- package/package.json +3 -2
- package/skills/audit-code/audit-code.prompt.md +5 -2
- package/wrapper/audit-code-wrapper-install-hosts.mjs +8 -3
- package/wrapper/audit-code-wrapper-lib.mjs +10 -3
- package/wrapper/installer-verb-help.mjs +3 -1
- package/wrapper/remediate-code-wrapper-install-hosts.mjs +8 -3
- package/wrapper/repo-root.mjs +80 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"designReviewSnapshot.d.ts","sourceRoot":"","sources":["../../../src/audit/orchestrator/designReviewSnapshot.ts"],"names":[],"mappings":"AAuBA,OAAO,EAOL,KAAK,mBAAmB,EACzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,
|
|
1
|
+
{"version":3,"file":"designReviewSnapshot.d.ts","sourceRoot":"","sources":["../../../src/audit/orchestrator/designReviewSnapshot.ts"],"names":[],"mappings":"AAuBA,OAAO,EAOL,KAAK,mBAAmB,EACzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAIL,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACvB,MAAM,6BAA6B,CAAC;AAErC,mFAAmF;AACnF,eAAO,MAAM,oBAAoB,qCAAsC,CAAC;AACxE,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC;AAErE,QAAA,MAAM,uBAAuB,EAAG,4CAAqD,CAAC;AAEtF,MAAM,WAAW,oBAAoB;IACnC,cAAc,EAAE,OAAO,uBAAuB,CAAC;IAC/C,IAAI,EAAE,gBAAgB,CAAC;IACvB,uEAAuE;IACvE,WAAW,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,cAAc,EAAE,OAAO,EAAE,CAAC;IAC1B,mEAAmE;IACnE,eAAe,EAAE,MAAM,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;CACrD;AAED,qFAAqF;AACrF,MAAM,MAAM,0BAA0B,GAAG,OAAO,CAC9C,MAAM,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAC/C,CAAC;AAQF,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,gBAAgB,GACrB,MAAM,CAER;AAED,wBAAsB,wBAAwB,CAC5C,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAWtC;AAED;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC7C,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,0BAA0B,CAAC,CAOrC;AAED;;;GAGG;AACH,wBAAsB,2BAA2B,CAC/C,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,gBAAgB,EACtB,aAAa,EAAE,OAAO,EAAE,EACxB,MAAM,EAAE,kBAAkB,EAC1B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,MAAM,WAAW,mBAAmB;IAClC,sEAAsE;IACtE,aAAa,EAAE,mBAAmB,EAAE,CAAC;IACrC,iEAAiE;IACjE,YAAY,EAAE,OAAO,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,oBAAoB,EAC9B,MAAM,EAAE,kBAAkB,GACzB,mBAAmB,CASrB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,oBAAoB,EAC9B,MAAM,EAAE,kBAAkB,GACzB,OAAO,CAST;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,oBAAoB,EAC9B,KAAK,EAAE,mBAAmB,GACzB,MAAM,CAOR;AAED;;;;;;;GAOG;AACH,wBAAsB,0BAA0B,CAC9C,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,kBAAkB,EAC1B,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAK7B"}
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
import { mkdir } from "node:fs/promises";
|
|
23
23
|
import { join } from "node:path";
|
|
24
24
|
import { diffProjections, readOptionalJsonFile, discardOnSchemaVersionMismatch, renderDiffReReviewSection, stableStringifyProjection, writeJsonFile, } from "audit-tools/shared";
|
|
25
|
-
import { DESIGN_REVIEW_INPUTS, projectDesignReviewInput, } from "./designReviewProjection.js";
|
|
25
|
+
import { DESIGN_REVIEW_INPUTS, projectDesignReviewInput, projectDesignReviewInputs, } from "./designReviewProjection.js";
|
|
26
26
|
/** The two verdict-bearing design-review passes (each snapshots independently). */
|
|
27
27
|
export const DESIGN_REVIEW_PASSES = ["contract", "conceptual"];
|
|
28
28
|
const SNAPSHOT_SCHEMA_VERSION = "audit-code/design-review-snapshot/v1alpha1";
|
|
@@ -57,10 +57,7 @@ export async function loadDesignReviewSnapshots(artifactsDir) {
|
|
|
57
57
|
* projection of every structural input plus the pass's own findings (verdict).
|
|
58
58
|
*/
|
|
59
59
|
export async function captureDesignReviewSnapshot(artifactsDir, pass, priorFindings, bundle, reviewedAt) {
|
|
60
|
-
const reviewed_inputs =
|
|
61
|
-
for (const input of DESIGN_REVIEW_INPUTS) {
|
|
62
|
-
reviewed_inputs[input] = projectDesignReviewInput(input, bundle);
|
|
63
|
-
}
|
|
60
|
+
const reviewed_inputs = projectDesignReviewInputs(bundle);
|
|
64
61
|
const snapshot = {
|
|
65
62
|
schema_version: SNAPSHOT_SCHEMA_VERSION,
|
|
66
63
|
pass,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"designReviewSnapshot.js","sourceRoot":"","sources":["../../../src/audit/orchestrator/designReviewSnapshot.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,8BAA8B,EAC9B,yBAAyB,EACzB,yBAAyB,EACzB,aAAa,GAEd,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,oBAAoB,EACpB,wBAAwB,
|
|
1
|
+
{"version":3,"file":"designReviewSnapshot.js","sourceRoot":"","sources":["../../../src/audit/orchestrator/designReviewSnapshot.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeFindings.d.ts","sourceRoot":"","sources":["../../../src/audit/reporting/mergeFindings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AACjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AA0C7E,wBAAgB,aAAa,CAC3B,OAAO,EAAE,WAAW,EAAE,EACtB,aAAa,CAAC,EAAE,uBAAuB,EACvC,uBAAuB,CAAC,EAAE,uBAAuB,EAAE,EACnD,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,sBAAsB,CAAC,EAAE,sBAAsB,EAC/C,eAAe,CAAC,EAAE,eAAe,EACjC,iBAAiB,CAAC,EAAE,yBAAyB,GAC5C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"mergeFindings.d.ts","sourceRoot":"","sources":["../../../src/audit/reporting/mergeFindings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AACjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC/E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AA0C7E,wBAAgB,aAAa,CAC3B,OAAO,EAAE,WAAW,EAAE,EACtB,aAAa,CAAC,EAAE,uBAAuB,EACvC,uBAAuB,CAAC,EAAE,uBAAuB,EAAE,EACnD,gBAAgB,CAAC,EAAE,gBAAgB,EACnC,sBAAsB,CAAC,EAAE,sBAAsB,EAC/C,eAAe,CAAC,EAAE,eAAe,EACjC,iBAAiB,CAAC,EAAE,yBAAyB,GAC5C,OAAO,EAAE,CA6EX"}
|
|
@@ -76,14 +76,13 @@ export function mergeFindings(results, runtimeReport, externalAnalyzerResults, d
|
|
|
76
76
|
// Audit's DRAW of the shared cross-lens core: read-only report policy — mutate
|
|
77
77
|
// survivors in place, grounding-precedence merge, sort files, and a SOFT category
|
|
78
78
|
// gate (merge cross-category at a higher title threshold). No exact-identity
|
|
79
|
-
// short-circuit
|
|
79
|
+
// short-circuit; the mergeMap is unused (a human reads the report).
|
|
80
80
|
return crossLensDedupe(dedupedSameLens, {
|
|
81
81
|
categoryGate: "soft",
|
|
82
82
|
exactIdentityShortCircuit: false,
|
|
83
83
|
survivorMutation: "mutate",
|
|
84
84
|
mergeGrounding: true,
|
|
85
85
|
sortAffectedFiles: true,
|
|
86
|
-
breakOnAbsorbedSurvivor: false,
|
|
87
86
|
// Packet-scoped ids collide across units by construction here; global ids
|
|
88
87
|
// are minted downstream at assignStableFindingIds.
|
|
89
88
|
idDiscipline: "local",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mergeFindings.js","sourceRoot":"","sources":["../../../src/audit/reporting/mergeFindings.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"mergeFindings.js","sourceRoot":"","sources":["../../../src/audit/reporting/mergeFindings.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,10 +8,9 @@
|
|
|
8
8
|
* owned by another module. For the purposes of this detector, a module M
|
|
9
9
|
* is said to need module N when M lists N in its `needs` array.
|
|
10
10
|
*
|
|
11
|
-
* Detection
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* reported as one detected cycle.
|
|
11
|
+
* Detection is the shared directed-cycle core's exact strongly-connected-
|
|
12
|
+
* component membership (`audit-tools/shared` → `findCyclicComponents`). Each
|
|
13
|
+
* cyclic component is reported as one detected cycle.
|
|
15
14
|
*/
|
|
16
15
|
/** A module node in the seam-obligation graph. */
|
|
17
16
|
export interface SeamObligationNode {
|
|
@@ -20,9 +19,12 @@ export interface SeamObligationNode {
|
|
|
20
19
|
/** IDs of modules this module declares an interface obligation toward. */
|
|
21
20
|
needs: string[];
|
|
22
21
|
}
|
|
23
|
-
/**
|
|
22
|
+
/**
|
|
23
|
+
* One detected cycle (N ≥ 1 nodes — a module that needs ITSELF is a 1-member
|
|
24
|
+
* cycle; every other cycle has 2 or more members).
|
|
25
|
+
*/
|
|
24
26
|
export interface DetectedCycle {
|
|
25
|
-
/**
|
|
27
|
+
/** Module IDs that form the cycle, in input order (not in cycle order). */
|
|
26
28
|
members: string[];
|
|
27
29
|
}
|
|
28
30
|
/** A proposed mediator module that breaks a cycle. */
|
|
@@ -58,10 +60,17 @@ export interface AuthoredCycleBreak {
|
|
|
58
60
|
/**
|
|
59
61
|
* Detect cyclic seam obligations in a module graph.
|
|
60
62
|
*
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
*
|
|
64
|
-
*
|
|
63
|
+
* Membership is EXACT: each reported cycle is one strongly connected component
|
|
64
|
+
* of the (module → modules it needs) graph. Two properties follow, and both
|
|
65
|
+
* differ from the Kahn drain this replaced:
|
|
66
|
+
*
|
|
67
|
+
* - a module DOWNSTREAM of a cycle (it needs a member, no member needs it) is
|
|
68
|
+
* not a member and is not reported — the drain reported every node it could
|
|
69
|
+
* not drain, tails included;
|
|
70
|
+
* - two cycles CHAINED by an edge between them are two cycles, not one — the
|
|
71
|
+
* drain's weakly-connected grouping fused them.
|
|
72
|
+
*
|
|
73
|
+
* A module that needs ITSELF is reported as a 1-member cycle.
|
|
65
74
|
*
|
|
66
75
|
* Returns an empty array when no cycle is found.
|
|
67
76
|
*/
|
|
@@ -80,6 +89,12 @@ export declare function detectCyclicSeamObligations(nodes: SeamObligationNode[])
|
|
|
80
89
|
*
|
|
81
90
|
* If the resulting graph still contains a cycle, the proposed break is
|
|
82
91
|
* rejected.
|
|
92
|
+
*
|
|
93
|
+
* The mediator appears EXACTLY ONCE in the patched graph. When it is already a
|
|
94
|
+
* node of `allNodes` — which is the live feed from
|
|
95
|
+
* {@link validateAuthoredCycleBreak}, where the mediator is a real obligation —
|
|
96
|
+
* its own entry carries the proposed needs instead of a second entry with the
|
|
97
|
+
* same id being appended.
|
|
83
98
|
*/
|
|
84
99
|
export declare function validateCycleBreak(originalCycle: DetectedCycle, allNodes: SeamObligationNode[], proposedMediator: ProposedMediator): CycleBreakValidation;
|
|
85
100
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cyclicSeamResolution.d.ts","sourceRoot":"","sources":["../../../src/remediate/contractPipeline/cyclicSeamResolution.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cyclicSeamResolution.d.ts","sourceRoot":"","sources":["../../../src/remediate/contractPipeline/cyclicSeamResolution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,kDAAkD;AAClD,MAAM,WAAW,kBAAkB;IACjC,gCAAgC;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,0EAA0E;IAC1E,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,2EAA2E;IAC3E,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,sDAAsD;AACtD,MAAM,WAAW,gBAAgB;IAC/B,sCAAsC;IACtC,EAAE,EAAE,MAAM,CAAC;IACX,qEAAqE;IACrE,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,wCAAwC;AACxC,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,OAAO,CAAC;IAClB,4CAA4C;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,kBAAkB;IACjC,mDAAmD;IACnD,QAAQ,EAAE,UAAU,GAAG,kBAAkB,CAAC;IAC1C,kEAAkE;IAClE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAID;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,kBAAkB,EAAE,GAC1B,aAAa,EAAE,CAMjB;AAID;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,aAAa,EAC5B,QAAQ,EAAE,kBAAkB,EAAE,EAC9B,gBAAgB,EAAE,gBAAgB,GACjC,oBAAoB,CA6CtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAgB,0BAA0B,CACxC,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,kBAAkB,EAAE,EAClC,QAAQ,EAAE,kBAAkB,GAC3B,oBAAoB,CAiHtB"}
|
|
@@ -8,99 +8,32 @@
|
|
|
8
8
|
* owned by another module. For the purposes of this detector, a module M
|
|
9
9
|
* is said to need module N when M lists N in its `needs` array.
|
|
10
10
|
*
|
|
11
|
-
* Detection
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* reported as one detected cycle.
|
|
11
|
+
* Detection is the shared directed-cycle core's exact strongly-connected-
|
|
12
|
+
* component membership (`audit-tools/shared` → `findCyclicComponents`). Each
|
|
13
|
+
* cyclic component is reported as one detected cycle.
|
|
15
14
|
*/
|
|
15
|
+
import { findCyclicComponents } from "audit-tools/shared";
|
|
16
16
|
// ── Cycle detection ───────────────────────────────────────────────────────────
|
|
17
17
|
/**
|
|
18
18
|
* Detect cyclic seam obligations in a module graph.
|
|
19
19
|
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
20
|
+
* Membership is EXACT: each reported cycle is one strongly connected component
|
|
21
|
+
* of the (module → modules it needs) graph. Two properties follow, and both
|
|
22
|
+
* differ from the Kahn drain this replaced:
|
|
23
|
+
*
|
|
24
|
+
* - a module DOWNSTREAM of a cycle (it needs a member, no member needs it) is
|
|
25
|
+
* not a member and is not reported — the drain reported every node it could
|
|
26
|
+
* not drain, tails included;
|
|
27
|
+
* - two cycles CHAINED by an edge between them are two cycles, not one — the
|
|
28
|
+
* drain's weakly-connected grouping fused them.
|
|
29
|
+
*
|
|
30
|
+
* A module that needs ITSELF is reported as a 1-member cycle.
|
|
24
31
|
*
|
|
25
32
|
* Returns an empty array when no cycle is found.
|
|
26
33
|
*/
|
|
27
34
|
export function detectCyclicSeamObligations(nodes) {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
const ids = new Set(nodes.map((n) => n.id));
|
|
31
|
-
// adjacency: dep → [dependents]
|
|
32
|
-
const adjacency = new Map();
|
|
33
|
-
const inDegree = new Map();
|
|
34
|
-
for (const id of ids) {
|
|
35
|
-
adjacency.set(id, []);
|
|
36
|
-
inDegree.set(id, 0);
|
|
37
|
-
}
|
|
38
|
-
for (const node of nodes) {
|
|
39
|
-
for (const dep of node.needs) {
|
|
40
|
-
if (!ids.has(dep))
|
|
41
|
-
continue; // ignore external refs
|
|
42
|
-
// edge: dep → node (dep must come before node)
|
|
43
|
-
adjacency.get(dep).push(node.id);
|
|
44
|
-
inDegree.set(node.id, (inDegree.get(node.id) ?? 0) + 1);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
// Kahn's drain
|
|
48
|
-
const queue = [];
|
|
49
|
-
for (const [id, deg] of inDegree.entries()) {
|
|
50
|
-
if (deg === 0)
|
|
51
|
-
queue.push(id);
|
|
52
|
-
}
|
|
53
|
-
let visited = 0;
|
|
54
|
-
while (queue.length > 0) {
|
|
55
|
-
const node = queue.shift();
|
|
56
|
-
visited++;
|
|
57
|
-
for (const next of adjacency.get(node) ?? []) {
|
|
58
|
-
const newDeg = (inDegree.get(next) ?? 0) - 1;
|
|
59
|
-
inDegree.set(next, newDeg);
|
|
60
|
-
if (newDeg === 0)
|
|
61
|
-
queue.push(next);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
if (visited === ids.size)
|
|
65
|
-
return []; // no cycles
|
|
66
|
-
// Collect cycle members (nodes with in-degree > 0 after drain).
|
|
67
|
-
const cycleNodes = [...ids].filter((id) => (inDegree.get(id) ?? 0) > 0);
|
|
68
|
-
// Group by weakly connected component using union-find on the original
|
|
69
|
-
// needs edges (restricted to cycle nodes).
|
|
70
|
-
const cycleSet = new Set(cycleNodes);
|
|
71
|
-
const parent = new Map(cycleNodes.map((id) => [id, id]));
|
|
72
|
-
function find(x) {
|
|
73
|
-
while (parent.get(x) !== x) {
|
|
74
|
-
const p = parent.get(x);
|
|
75
|
-
parent.set(x, parent.get(p) ?? p);
|
|
76
|
-
x = parent.get(x);
|
|
77
|
-
}
|
|
78
|
-
return x;
|
|
79
|
-
}
|
|
80
|
-
function union(a, b) {
|
|
81
|
-
const ra = find(a);
|
|
82
|
-
const rb = find(b);
|
|
83
|
-
if (ra !== rb)
|
|
84
|
-
parent.set(ra, rb);
|
|
85
|
-
}
|
|
86
|
-
for (const node of nodes) {
|
|
87
|
-
if (!cycleSet.has(node.id))
|
|
88
|
-
continue;
|
|
89
|
-
for (const dep of node.needs) {
|
|
90
|
-
if (cycleSet.has(dep)) {
|
|
91
|
-
union(node.id, dep);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
// Group by root.
|
|
96
|
-
const components = new Map();
|
|
97
|
-
for (const id of cycleNodes) {
|
|
98
|
-
const root = find(id);
|
|
99
|
-
if (!components.has(root))
|
|
100
|
-
components.set(root, []);
|
|
101
|
-
components.get(root).push(id);
|
|
102
|
-
}
|
|
103
|
-
return [...components.values()].map((members) => ({ members }));
|
|
35
|
+
const components = findCyclicComponents(nodes.map((node) => ({ id: node.id, depends_on: node.needs })), { includeSelfLoops: true });
|
|
36
|
+
return components.map((members) => ({ members }));
|
|
104
37
|
}
|
|
105
38
|
// ── Cycle-break re-check ──────────────────────────────────────────────────────
|
|
106
39
|
/**
|
|
@@ -117,6 +50,12 @@ export function detectCyclicSeamObligations(nodes) {
|
|
|
117
50
|
*
|
|
118
51
|
* If the resulting graph still contains a cycle, the proposed break is
|
|
119
52
|
* rejected.
|
|
53
|
+
*
|
|
54
|
+
* The mediator appears EXACTLY ONCE in the patched graph. When it is already a
|
|
55
|
+
* node of `allNodes` — which is the live feed from
|
|
56
|
+
* {@link validateAuthoredCycleBreak}, where the mediator is a real obligation —
|
|
57
|
+
* its own entry carries the proposed needs instead of a second entry with the
|
|
58
|
+
* same id being appended.
|
|
120
59
|
*/
|
|
121
60
|
export function validateCycleBreak(originalCycle, allNodes, proposedMediator) {
|
|
122
61
|
const cycleSet = new Set(originalCycle.members);
|
|
@@ -124,10 +63,16 @@ export function validateCycleBreak(originalCycle, allNodes, proposedMediator) {
|
|
|
124
63
|
// - For each cycle member: replace needs-edges to other cycle members with
|
|
125
64
|
// a needs-edge to the mediator.
|
|
126
65
|
// - For non-cycle members: unchanged.
|
|
127
|
-
// - Add the mediator.
|
|
66
|
+
// - Add the mediator, unless the graph already carries a node with its id.
|
|
128
67
|
const patched = [];
|
|
68
|
+
const mediatorAlreadyPresent = allNodes.some((node) => node.id === proposedMediator.id);
|
|
129
69
|
for (const node of allNodes) {
|
|
130
|
-
if (
|
|
70
|
+
if (node.id === proposedMediator.id) {
|
|
71
|
+
// The mediator's own entry — carry the proposed needs here rather than
|
|
72
|
+
// appending a second node with the same id below.
|
|
73
|
+
patched.push({ id: node.id, needs: [...proposedMediator.needs] });
|
|
74
|
+
}
|
|
75
|
+
else if (cycleSet.has(node.id)) {
|
|
131
76
|
const newNeeds = node.needs.map((dep) => cycleSet.has(dep) ? proposedMediator.id : dep);
|
|
132
77
|
// Deduplicate mediator references.
|
|
133
78
|
patched.push({ id: node.id, needs: [...new Set(newNeeds)] });
|
|
@@ -136,8 +81,10 @@ export function validateCycleBreak(originalCycle, allNodes, proposedMediator) {
|
|
|
136
81
|
patched.push(node);
|
|
137
82
|
}
|
|
138
83
|
}
|
|
139
|
-
// Add the mediator itself.
|
|
140
|
-
|
|
84
|
+
// Add the mediator itself, unless the live graph already carries it.
|
|
85
|
+
if (!mediatorAlreadyPresent) {
|
|
86
|
+
patched.push({ id: proposedMediator.id, needs: proposedMediator.needs });
|
|
87
|
+
}
|
|
141
88
|
const remaining = detectCyclicSeamObligations(patched);
|
|
142
89
|
if (remaining.length > 0) {
|
|
143
90
|
const affectedIds = remaining.flatMap((c) => c.members).join(", ");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cyclicSeamResolution.js","sourceRoot":"","sources":["../../../src/remediate/contractPipeline/cyclicSeamResolution.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cyclicSeamResolution.js","sourceRoot":"","sources":["../../../src/remediate/contractPipeline/cyclicSeamResolution.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,17 +2,16 @@
|
|
|
2
2
|
* Single tool-owned authority for the contract-pipeline's id relationships
|
|
3
3
|
* (S4 of the contract-authoring determinism design).
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* finding_id" merge trap: the `CP-BLOCK-` block-id
|
|
5
|
+
* Its block-id relationship caused the recurring "Unknown
|
|
6
|
+
* finding_id" merge trap: the one-way bare-node-id to `CP-BLOCK-` block-id mint.
|
|
7
7
|
* Before this module the prefix was constructed by inline string templates at
|
|
8
8
|
* several sites (the DAG->plan promotion built it for both node block ids AND
|
|
9
|
-
* dependency edges; the dispatch alias map built it again)
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* round-trips dispatch -> worker result -> merge deterministically, so the
|
|
13
|
-
* tolerant alias remap is defence-in-depth rather than load-bearing.
|
|
9
|
+
* dependency edges; the dispatch alias map built it again). With the node id and
|
|
10
|
+
* prefix minted in exactly ONE place each, dispatch and merge consume the same
|
|
11
|
+
* persisted identity without a reverse-mapping API.
|
|
14
12
|
*
|
|
15
|
-
* The
|
|
13
|
+
* The block-id API is intentionally one-way: callers consume the persisted id
|
|
14
|
+
* minted by `toBlockId` rather than reverse-mapping it.
|
|
16
15
|
* It is a pure module — no IO, no model identity — so it is testable in
|
|
17
16
|
* isolation and feeds the hash/staleness DAG cleanly.
|
|
18
17
|
*/
|
|
@@ -27,9 +26,9 @@ export declare const CP_BLOCK_PREFIX = "CP-BLOCK-";
|
|
|
27
26
|
*
|
|
28
27
|
* This closes a merge-trap: when `node.id` was missing, the finding id used this
|
|
29
28
|
* fallback (`CP-001`) but the block id was built from the raw `node.id`
|
|
30
|
-
* (`CP-BLOCK-undefined`), so
|
|
31
|
-
*
|
|
32
|
-
*
|
|
29
|
+
* (`CP-BLOCK-undefined`), so the worker result landed in `unresolved`. Routing
|
|
30
|
+
* every node-id site through `ensureNodeId` keeps the finding and block mints
|
|
31
|
+
* aligned.
|
|
33
32
|
*/
|
|
34
33
|
export declare function ensureNodeId(rawId: string | undefined, index: number): string;
|
|
35
34
|
/**
|
|
@@ -37,15 +36,6 @@ export declare function ensureNodeId(rawId: string | undefined, index: number):
|
|
|
37
36
|
* `CP-BLOCK-` prefix is applied — every producer of a block id goes through here.
|
|
38
37
|
*/
|
|
39
38
|
export declare function toBlockId(nodeId: string): string;
|
|
40
|
-
/** True when `value` is a `CP-BLOCK-` block id minted by `toBlockId`. */
|
|
41
|
-
export declare function isBlockId(value: string): boolean;
|
|
42
|
-
/**
|
|
43
|
-
* Recover the bare node id from a block id — the inverse of `toBlockId`. Returns
|
|
44
|
-
* `null` when `value` is not a `CP-BLOCK-` block id (so callers can fall back to
|
|
45
|
-
* the tolerant alias remap for non-block aliases such as obligation ids, rather
|
|
46
|
-
* than silently producing a wrong node id).
|
|
47
|
-
*/
|
|
48
|
-
export declare function fromBlockId(value: string): string | null;
|
|
49
39
|
/** The one prefix every derived obligation id carries. */
|
|
50
40
|
export declare const OBLIGATION_PREFIX = "OBL-";
|
|
51
41
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idRegistry.d.ts","sourceRoot":"","sources":["../../../src/remediate/contractPipeline/idRegistry.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"idRegistry.d.ts","sourceRoot":"","sources":["../../../src/remediate/contractPipeline/idRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,gFAAgF;AAChF,eAAO,MAAM,eAAe,cAAc,CAAC;AAE3C;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,KAAK,EAAE,MAAM,GACZ,MAAM,CAER;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,0DAA0D;AAC1D,eAAO,MAAM,iBAAiB,SAAS,CAAC;AAExC;;;;;;;;;GASG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEvE"}
|
|
@@ -2,17 +2,16 @@
|
|
|
2
2
|
* Single tool-owned authority for the contract-pipeline's id relationships
|
|
3
3
|
* (S4 of the contract-authoring determinism design).
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
* finding_id" merge trap: the `CP-BLOCK-` block-id
|
|
5
|
+
* Its block-id relationship caused the recurring "Unknown
|
|
6
|
+
* finding_id" merge trap: the one-way bare-node-id to `CP-BLOCK-` block-id mint.
|
|
7
7
|
* Before this module the prefix was constructed by inline string templates at
|
|
8
8
|
* several sites (the DAG->plan promotion built it for both node block ids AND
|
|
9
|
-
* dependency edges; the dispatch alias map built it again)
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* round-trips dispatch -> worker result -> merge deterministically, so the
|
|
13
|
-
* tolerant alias remap is defence-in-depth rather than load-bearing.
|
|
9
|
+
* dependency edges; the dispatch alias map built it again). With the node id and
|
|
10
|
+
* prefix minted in exactly ONE place each, dispatch and merge consume the same
|
|
11
|
+
* persisted identity without a reverse-mapping API.
|
|
14
12
|
*
|
|
15
|
-
* The
|
|
13
|
+
* The block-id API is intentionally one-way: callers consume the persisted id
|
|
14
|
+
* minted by `toBlockId` rather than reverse-mapping it.
|
|
16
15
|
* It is a pure module — no IO, no model identity — so it is testable in
|
|
17
16
|
* isolation and feeds the hash/staleness DAG cleanly.
|
|
18
17
|
*/
|
|
@@ -27,9 +26,9 @@ export const CP_BLOCK_PREFIX = "CP-BLOCK-";
|
|
|
27
26
|
*
|
|
28
27
|
* This closes a merge-trap: when `node.id` was missing, the finding id used this
|
|
29
28
|
* fallback (`CP-001`) but the block id was built from the raw `node.id`
|
|
30
|
-
* (`CP-BLOCK-undefined`), so
|
|
31
|
-
*
|
|
32
|
-
*
|
|
29
|
+
* (`CP-BLOCK-undefined`), so the worker result landed in `unresolved`. Routing
|
|
30
|
+
* every node-id site through `ensureNodeId` keeps the finding and block mints
|
|
31
|
+
* aligned.
|
|
33
32
|
*/
|
|
34
33
|
export function ensureNodeId(rawId, index) {
|
|
35
34
|
return rawId ?? `CP-${String(index + 1).padStart(3, "0")}`;
|
|
@@ -41,19 +40,6 @@ export function ensureNodeId(rawId, index) {
|
|
|
41
40
|
export function toBlockId(nodeId) {
|
|
42
41
|
return `${CP_BLOCK_PREFIX}${nodeId}`;
|
|
43
42
|
}
|
|
44
|
-
/** True when `value` is a `CP-BLOCK-` block id minted by `toBlockId`. */
|
|
45
|
-
export function isBlockId(value) {
|
|
46
|
-
return value.startsWith(CP_BLOCK_PREFIX);
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* Recover the bare node id from a block id — the inverse of `toBlockId`. Returns
|
|
50
|
-
* `null` when `value` is not a `CP-BLOCK-` block id (so callers can fall back to
|
|
51
|
-
* the tolerant alias remap for non-block aliases such as obligation ids, rather
|
|
52
|
-
* than silently producing a wrong node id).
|
|
53
|
-
*/
|
|
54
|
-
export function fromBlockId(value) {
|
|
55
|
-
return isBlockId(value) ? value.slice(CP_BLOCK_PREFIX.length) : null;
|
|
56
|
-
}
|
|
57
43
|
/** The one prefix every derived obligation id carries. */
|
|
58
44
|
export const OBLIGATION_PREFIX = "OBL-";
|
|
59
45
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"idRegistry.js","sourceRoot":"","sources":["../../../src/remediate/contractPipeline/idRegistry.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"idRegistry.js","sourceRoot":"","sources":["../../../src/remediate/contractPipeline/idRegistry.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,gFAAgF;AAChF,MAAM,CAAC,MAAM,eAAe,GAAG,WAAW,CAAC;AAE3C;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAyB,EACzB,KAAa;IAEb,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,OAAO,GAAG,eAAe,GAAG,MAAM,EAAE,CAAC;AACvC,CAAC;AAED,0DAA0D;AAC1D,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAExC;;;;;;;;;GASG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAClF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,UAAkB,EAAE,MAAc;IAC7D,OAAO,GAAG,iBAAiB,GAAG,UAAU,CAAC,UAAU,CAAC,IAAI,QAAQ,IAAI,MAAM,EAAE,CAAC;AAC/E,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One vocabulary for contract-pipeline obligation kinds. Definition order
|
|
3
|
+
* preserves the observable TESTABLE_OBLIGATION_KINDS iteration order; the
|
|
4
|
+
* explicit priority rank preserves the load-bearing lens/severity order.
|
|
5
|
+
*/
|
|
6
|
+
declare const OBLIGATION_KIND_DEFINITIONS: readonly [{
|
|
7
|
+
readonly kind: "invariant";
|
|
8
|
+
readonly testable: true;
|
|
9
|
+
readonly priority: 3;
|
|
10
|
+
}, {
|
|
11
|
+
readonly kind: "behavioral";
|
|
12
|
+
readonly testable: true;
|
|
13
|
+
readonly priority: 2;
|
|
14
|
+
}, {
|
|
15
|
+
readonly kind: "structural";
|
|
16
|
+
readonly testable: false;
|
|
17
|
+
readonly priority: 1;
|
|
18
|
+
}, {
|
|
19
|
+
readonly kind: "test";
|
|
20
|
+
readonly testable: false;
|
|
21
|
+
readonly priority: 0;
|
|
22
|
+
}];
|
|
23
|
+
export type ObligationKind = (typeof OBLIGATION_KIND_DEFINITIONS)[number]["kind"];
|
|
24
|
+
export declare const OBLIGATION_KIND_PRIORITY: readonly ObligationKind[];
|
|
25
|
+
export declare const TESTABLE_OBLIGATION_KINDS: Set<string>;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=obligationKinds.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"obligationKinds.d.ts","sourceRoot":"","sources":["../../../src/remediate/contractPipeline/obligationKinds.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,QAAA,MAAM,2BAA2B;;;;;;;;;;;;;;;;EAKvB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,2BAA2B,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;AAElF,eAAO,MAAM,wBAAwB,EAAE,SAAS,cAAc,EAIpC,CAAC;AAE3B,eAAO,MAAM,yBAAyB,aAErC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One vocabulary for contract-pipeline obligation kinds. Definition order
|
|
3
|
+
* preserves the observable TESTABLE_OBLIGATION_KINDS iteration order; the
|
|
4
|
+
* explicit priority rank preserves the load-bearing lens/severity order.
|
|
5
|
+
*/
|
|
6
|
+
const OBLIGATION_KIND_DEFINITIONS = [
|
|
7
|
+
{ kind: "invariant", testable: true, priority: 3 },
|
|
8
|
+
{ kind: "behavioral", testable: true, priority: 2 },
|
|
9
|
+
{ kind: "structural", testable: false, priority: 1 },
|
|
10
|
+
{ kind: "test", testable: false, priority: 0 },
|
|
11
|
+
];
|
|
12
|
+
export const OBLIGATION_KIND_PRIORITY = [
|
|
13
|
+
...OBLIGATION_KIND_DEFINITIONS,
|
|
14
|
+
]
|
|
15
|
+
.sort((left, right) => left.priority - right.priority)
|
|
16
|
+
.map(({ kind }) => kind);
|
|
17
|
+
export const TESTABLE_OBLIGATION_KINDS = new Set(OBLIGATION_KIND_DEFINITIONS.filter(({ testable }) => testable).map(({ kind }) => kind));
|
|
18
|
+
//# sourceMappingURL=obligationKinds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"obligationKinds.js","sourceRoot":"","sources":["../../../src/remediate/contractPipeline/obligationKinds.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,2BAA2B,GAAG;IAClC,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE;IAClD,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,EAAE;IACnD,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE;IACpD,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE;CACtC,CAAC;AAIX,MAAM,CAAC,MAAM,wBAAwB,GAA8B;IACjE,GAAG,2BAA2B;CAC/B;KACE,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;KACrD,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;AAE3B,MAAM,CAAC,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAC9C,2BAA2B,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CACvF,CAAC"}
|
|
@@ -8,9 +8,8 @@ export type CrossLensDedupResult = CrossLensDedupeResult;
|
|
|
8
8
|
* auto-apply block-machine policy — a HARD category gate (never collapse two
|
|
9
9
|
* different-category fixes, OBL-C003-DEDUP), the exact-identity short-circuit
|
|
10
10
|
* (drift-plan R2), CLONE survivors so the caller's Finding objects are never
|
|
11
|
-
* mutated (INV-remediate-state-05), no grounding merge / no file sort,
|
|
12
|
-
*
|
|
13
|
-
* `fixupBlocksAfterDedup`.
|
|
11
|
+
* mutated (INV-remediate-state-05), no grounding merge / no file sort, and a
|
|
12
|
+
* structured merge log. The returned `mergeMap` feeds `fixupBlocksAfterDedup`.
|
|
14
13
|
*/
|
|
15
14
|
export declare function deduplicateCrossLensFindings(findings: Finding[]): CrossLensDedupResult;
|
|
16
15
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crossLensDedup.d.ts","sourceRoot":"","sources":["../../../src/remediate/dedup/crossLensDedup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAInE,OAAO,EAAE,WAAW,EAAE,CAAC;AAEvB,MAAM,MAAM,oBAAoB,GAAG,qBAAqB,CAAC;AAEzD
|
|
1
|
+
{"version":3,"file":"crossLensDedup.d.ts","sourceRoot":"","sources":["../../../src/remediate/dedup/crossLensDedup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmB,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,KAAK,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAInE,OAAO,EAAE,WAAW,EAAE,CAAC;AAEvB,MAAM,MAAM,oBAAoB,GAAG,qBAAqB,CAAC;AAEzD;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,OAAO,EAAE,GAClB,oBAAoB,CAwBtB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,gBAAgB,EAAE,EAC1B,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,GAC5B,gBAAgB,EAAE,CAepB"}
|
|
@@ -7,9 +7,8 @@ export { wordJaccard };
|
|
|
7
7
|
* auto-apply block-machine policy — a HARD category gate (never collapse two
|
|
8
8
|
* different-category fixes, OBL-C003-DEDUP), the exact-identity short-circuit
|
|
9
9
|
* (drift-plan R2), CLONE survivors so the caller's Finding objects are never
|
|
10
|
-
* mutated (INV-remediate-state-05), no grounding merge / no file sort,
|
|
11
|
-
*
|
|
12
|
-
* `fixupBlocksAfterDedup`.
|
|
10
|
+
* mutated (INV-remediate-state-05), no grounding merge / no file sort, and a
|
|
11
|
+
* structured merge log. The returned `mergeMap` feeds `fixupBlocksAfterDedup`.
|
|
13
12
|
*/
|
|
14
13
|
export function deduplicateCrossLensFindings(findings) {
|
|
15
14
|
return crossLensDedupe(findings, {
|
|
@@ -18,7 +17,6 @@ export function deduplicateCrossLensFindings(findings) {
|
|
|
18
17
|
survivorMutation: "clone",
|
|
19
18
|
mergeGrounding: false,
|
|
20
19
|
sortAffectedFiles: false,
|
|
21
|
-
breakOnAbsorbedSurvivor: true,
|
|
22
20
|
// Input ids come from audit-findings.json (globally unique), so id-keyed
|
|
23
21
|
// provenance is well-defined: duplicates refuse, dispositionById is emitted.
|
|
24
22
|
idDiscipline: "global",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crossLensDedup.js","sourceRoot":"","sources":["../../../src/remediate/dedup/crossLensDedup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAIlE,4EAA4E;AAC5E,6BAA6B;AAC7B,OAAO,EAAE,WAAW,EAAE,CAAC;AAIvB
|
|
1
|
+
{"version":3,"file":"crossLensDedup.js","sourceRoot":"","sources":["../../../src/remediate/dedup/crossLensDedup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAIlE,4EAA4E;AAC5E,6BAA6B;AAC7B,OAAO,EAAE,WAAW,EAAE,CAAC;AAIvB;;;;;;;GAOG;AACH,MAAM,UAAU,4BAA4B,CAC1C,QAAmB;IAEnB,OAAO,eAAe,CAAC,QAAQ,EAAE;QAC/B,YAAY,EAAE,MAAM;QACpB,yBAAyB,EAAE,IAAI;QAC/B,gBAAgB,EAAE,OAAO;QACzB,cAAc,EAAE,KAAK;QACrB,iBAAiB,EAAE,KAAK;QACxB,yEAAyE;QACzE,6EAA6E;QAC7E,YAAY,EAAE,QAAQ;QACtB,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE;YAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CAAC;gBACb,KAAK,EAAE,MAAM;gBACb,KAAK,EAAE,wBAAwB;gBAC/B,WAAW,EAAE,QAAQ,CAAC,EAAE;gBACxB,aAAa,EAAE,QAAQ,CAAC,IAAI;gBAC5B,WAAW,EAAE,QAAQ,CAAC,EAAE;gBACxB,aAAa,EAAE,QAAQ,CAAC,IAAI;gBAC5B,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aAC7B,CAAC,GAAG,IAAI,CACV,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAA0B,EAC1B,QAA6B;IAE7B,IAAI,QAAQ,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QACb,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YACxC,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE,SAAS;YAClC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACpB,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,EAAE,GAAG,KAAK,EAAE,KAAK,EAAE,CAAC;IAC7B,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC/C,CAAC"}
|