Stage 3 Wave 1: lifecycle-слой встроен в pipeline
This commit is contained in:
+109
-5
@@ -8,6 +8,8 @@ exports.buildProblemUnit = buildProblemUnit;
|
||||
exports.collapseDuplicates = collapseDuplicates;
|
||||
exports.assembleProblemUnits = assembleProblemUnits;
|
||||
const stage2ProblemUnits_1 = require("../types/stage2ProblemUnits");
|
||||
const config_1 = require("../config");
|
||||
const lifecycleRuntime_1 = require("./lifecycleRuntime");
|
||||
function toObject(value) {
|
||||
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
||||
return null;
|
||||
@@ -382,6 +384,17 @@ function collapseSignature(unit) {
|
||||
const backlink = unit.entity_backlinks[0] ? `${unit.entity_backlinks[0].entity}|${unit.entity_backlinks[0].id}` : "none";
|
||||
return [unit.problem_unit_type, unit.business_defect_class, unit.failed_expected_edge ?? "none", backlink].join("|");
|
||||
}
|
||||
function preferredLifecycleSource(left, right) {
|
||||
const leftRank = left.lifecycle_ranking_score ?? 0;
|
||||
const rightRank = right.lifecycle_ranking_score ?? 0;
|
||||
if (rightRank > leftRank) {
|
||||
return right;
|
||||
}
|
||||
if (leftRank > rightRank) {
|
||||
return left;
|
||||
}
|
||||
return right.confidence.score > left.confidence.score ? right : left;
|
||||
}
|
||||
function collapseDuplicates(units) {
|
||||
const bySignature = new Map();
|
||||
let duplicateCollapses = 0;
|
||||
@@ -393,6 +406,7 @@ function collapseDuplicates(units) {
|
||||
continue;
|
||||
}
|
||||
duplicateCollapses += 1;
|
||||
const preferredLifecycle = preferredLifecycleSource(existing, unit);
|
||||
bySignature.set(signature, {
|
||||
...existing,
|
||||
evidence_pack: uniqueStrings([...existing.evidence_pack, ...unit.evidence_pack]),
|
||||
@@ -408,7 +422,72 @@ function collapseDuplicates(units) {
|
||||
affected_contracts: uniqueStrings([...existing.affected_contracts, ...unit.affected_contracts]),
|
||||
snapshot_limitations: uniqueStrings([...existing.snapshot_limitations, ...unit.snapshot_limitations]),
|
||||
severity: unit.severity.score > existing.severity.score ? unit.severity : existing.severity,
|
||||
confidence: unit.confidence.score > existing.confidence.score ? unit.confidence : existing.confidence
|
||||
confidence: unit.confidence.score > existing.confidence.score ? unit.confidence : existing.confidence,
|
||||
...(preferredLifecycle.lifecycle_domain
|
||||
? {
|
||||
lifecycle_domain: preferredLifecycle.lifecycle_domain
|
||||
}
|
||||
: {}),
|
||||
...(preferredLifecycle.lifecycle_object_id
|
||||
? {
|
||||
lifecycle_object_id: preferredLifecycle.lifecycle_object_id
|
||||
}
|
||||
: {}),
|
||||
...(preferredLifecycle.current_lifecycle_state
|
||||
? {
|
||||
current_lifecycle_state: preferredLifecycle.current_lifecycle_state
|
||||
}
|
||||
: {}),
|
||||
...(preferredLifecycle.expected_lifecycle_state
|
||||
? {
|
||||
expected_lifecycle_state: preferredLifecycle.expected_lifecycle_state
|
||||
}
|
||||
: {}),
|
||||
...(preferredLifecycle.missing_transition
|
||||
? {
|
||||
missing_transition: preferredLifecycle.missing_transition
|
||||
}
|
||||
: {}),
|
||||
...(preferredLifecycle.invalid_transition
|
||||
? {
|
||||
invalid_transition: preferredLifecycle.invalid_transition
|
||||
}
|
||||
: {}),
|
||||
...(preferredLifecycle.lifecycle_defect_type
|
||||
? {
|
||||
lifecycle_defect_type: preferredLifecycle.lifecycle_defect_type
|
||||
}
|
||||
: {}),
|
||||
...(preferredLifecycle.stale_duration
|
||||
? {
|
||||
stale_duration: preferredLifecycle.stale_duration
|
||||
}
|
||||
: {}),
|
||||
...(preferredLifecycle.lifecycle_confidence
|
||||
? {
|
||||
lifecycle_confidence: preferredLifecycle.lifecycle_confidence
|
||||
}
|
||||
: {}),
|
||||
...(preferredLifecycle.business_lifecycle_interpretation
|
||||
? {
|
||||
business_lifecycle_interpretation: preferredLifecycle.business_lifecycle_interpretation
|
||||
}
|
||||
: {}),
|
||||
...(preferredLifecycle.lifecycle_resolution
|
||||
? {
|
||||
lifecycle_resolution: preferredLifecycle.lifecycle_resolution
|
||||
}
|
||||
: {}),
|
||||
...(preferredLifecycle.lifecycle_ranking_score !== undefined
|
||||
? {
|
||||
lifecycle_ranking_score: preferredLifecycle.lifecycle_ranking_score
|
||||
}
|
||||
: {}),
|
||||
...(preferredLifecycle.lifecycle_ranking_basis
|
||||
? {
|
||||
lifecycle_ranking_basis: preferredLifecycle.lifecycle_ranking_basis
|
||||
}
|
||||
: {})
|
||||
});
|
||||
}
|
||||
return {
|
||||
@@ -429,10 +508,20 @@ function buildSummary(units, duplicateCollapses) {
|
||||
medium: 0,
|
||||
high: 0
|
||||
};
|
||||
const lifecycleDomainDistribution = {};
|
||||
const lifecycleDefectDistribution = {};
|
||||
let lifecycleEnrichedUnits = 0;
|
||||
for (const unit of units) {
|
||||
typeDistribution[unit.problem_unit_type] = (typeDistribution[unit.problem_unit_type] ?? 0) + 1;
|
||||
severityDistribution[unit.severity.grade] += 1;
|
||||
confidenceDistribution[unit.confidence.grade] += 1;
|
||||
if (unit.lifecycle_domain) {
|
||||
lifecycleEnrichedUnits += 1;
|
||||
lifecycleDomainDistribution[unit.lifecycle_domain] = (lifecycleDomainDistribution[unit.lifecycle_domain] ?? 0) + 1;
|
||||
}
|
||||
if (unit.lifecycle_defect_type) {
|
||||
lifecycleDefectDistribution[unit.lifecycle_defect_type] = (lifecycleDefectDistribution[unit.lifecycle_defect_type] ?? 0) + 1;
|
||||
}
|
||||
}
|
||||
return {
|
||||
schema_version: stage2ProblemUnits_1.PROBLEM_UNIT_SUMMARY_SCHEMA_VERSION,
|
||||
@@ -442,7 +531,10 @@ function buildSummary(units, duplicateCollapses) {
|
||||
type_distribution: typeDistribution,
|
||||
severity_distribution: severityDistribution,
|
||||
confidence_distribution: confidenceDistribution,
|
||||
primary_unit_type: units[0]?.problem_unit_type ?? null
|
||||
primary_unit_type: units[0]?.problem_unit_type ?? null,
|
||||
lifecycle_enriched_units: lifecycleEnrichedUnits,
|
||||
lifecycle_domain_distribution: lifecycleDomainDistribution,
|
||||
lifecycle_defect_distribution: lifecycleDefectDistribution
|
||||
};
|
||||
}
|
||||
function assembleProblemUnits(input) {
|
||||
@@ -457,11 +549,23 @@ function assembleProblemUnits(input) {
|
||||
risk_factors: uniqueStrings(input.risk_factors ?? [])
|
||||
});
|
||||
const clusters = clusterCandidateEvidence(candidates);
|
||||
const units = clusters.map((cluster, index) => buildProblemUnit(cluster, index));
|
||||
const units = clusters.map((cluster, index) => {
|
||||
const baseUnit = buildProblemUnit(cluster, index);
|
||||
if (!config_1.FEATURE_ASSISTANT_LIFECYCLE_RUNTIME_V1) {
|
||||
return baseUnit;
|
||||
}
|
||||
return (0, lifecycleRuntime_1.enrichProblemUnitLifecycle)({
|
||||
unit: baseUnit,
|
||||
candidates: cluster.candidates
|
||||
});
|
||||
});
|
||||
const collapsed = collapseDuplicates(units);
|
||||
const rankedUnits = config_1.FEATURE_ASSISTANT_LIFECYCLE_RUNTIME_V1
|
||||
? (0, lifecycleRuntime_1.rankLifecycleProblemUnits)(collapsed.problem_units)
|
||||
: collapsed.problem_units;
|
||||
return {
|
||||
candidate_evidence: candidates,
|
||||
problem_units: collapsed.problem_units,
|
||||
problem_unit_summary: buildSummary(collapsed.problem_units, collapsed.duplicate_collapses)
|
||||
problem_units: rankedUnits,
|
||||
problem_unit_summary: buildSummary(rankedUnits, collapsed.duplicate_collapses)
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user