@telora/daemon 0.22.85 → 0.22.87
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/build-info.json +4 -3
- package/dist/ci/ci-escalation.d.ts +17 -1
- package/dist/ci/ci-escalation.d.ts.map +1 -1
- package/dist/ci/ci-escalation.js +51 -3
- package/dist/ci/ci-escalation.js.map +1 -1
- package/dist/ci/ci-red-attribution.d.ts +85 -0
- package/dist/ci/ci-red-attribution.d.ts.map +1 -0
- package/dist/ci/ci-red-attribution.js +108 -0
- package/dist/ci/ci-red-attribution.js.map +1 -0
- package/dist/ci/ci-sensor-loop.d.ts +84 -80
- package/dist/ci/ci-sensor-loop.d.ts.map +1 -1
- package/dist/ci/ci-sensor-loop.js +132 -129
- package/dist/ci/ci-sensor-loop.js.map +1 -1
- package/dist/completion/coverage-stabilized.d.ts.map +1 -1
- package/dist/completion/coverage-stabilized.js +1 -1
- package/dist/completion/coverage-stabilized.js.map +1 -1
- package/dist/completion/escalations.d.ts +40 -5
- package/dist/completion/escalations.d.ts.map +1 -1
- package/dist/completion/escalations.js +19 -11
- package/dist/completion/escalations.js.map +1 -1
- package/dist/completion/event-escalations.d.ts +12 -1
- package/dist/completion/event-escalations.d.ts.map +1 -1
- package/dist/completion/event-escalations.js +73 -37
- package/dist/completion/event-escalations.js.map +1 -1
- package/dist/completion/event.d.ts +4 -1
- package/dist/completion/event.d.ts.map +1 -1
- package/dist/completion/event.js +1 -1
- package/dist/completion/event.js.map +1 -1
- package/dist/completion/human-only-act.d.ts +1 -1
- package/dist/completion/human-only-act.js +1 -1
- package/dist/completion/machine-remediable-demotion.d.ts +28 -1
- package/dist/completion/machine-remediable-demotion.d.ts.map +1 -1
- package/dist/completion/machine-remediable-demotion.js +9 -6
- package/dist/completion/machine-remediable-demotion.js.map +1 -1
- package/dist/completion/read-only-pristine.d.ts.map +1 -1
- package/dist/completion/read-only-pristine.js +4 -0
- package/dist/completion/read-only-pristine.js.map +1 -1
- package/dist/completion/review-exit-deps.js +1 -1
- package/dist/completion/review-exit-deps.js.map +1 -1
- package/dist/completion/review-exit-escalations.d.ts +10 -0
- package/dist/completion/review-exit-escalations.d.ts.map +1 -1
- package/dist/completion/review-exit-escalations.js +38 -3
- package/dist/completion/review-exit-escalations.js.map +1 -1
- package/dist/completion/review-exit-phase.d.ts.map +1 -1
- package/dist/completion/review-exit-phase.js +8 -7
- package/dist/completion/review-exit-phase.js.map +1 -1
- package/dist/completion/review-exit-shortfall.d.ts +5 -1
- package/dist/completion/review-exit-shortfall.d.ts.map +1 -1
- package/dist/completion/review-exit-shortfall.js +8 -3
- package/dist/completion/review-exit-shortfall.js.map +1 -1
- package/dist/completion/status-advance-phase.d.ts +2 -0
- package/dist/completion/status-advance-phase.d.ts.map +1 -1
- package/dist/completion/status-advance-phase.js +2 -1
- package/dist/completion/status-advance-phase.js.map +1 -1
- package/dist/completion/terminated-work-reconcile.js +2 -2
- package/dist/completion/terminated-work-reconcile.js.map +1 -1
- package/dist/delivery/delivery-advance-block.d.ts +3 -3
- package/dist/delivery/delivery-advance-block.d.ts.map +1 -1
- package/dist/delivery/delivery-advance-block.js +13 -8
- package/dist/delivery/delivery-advance-block.js.map +1 -1
- package/dist/delivery/delivery-lifecycle.d.ts +10 -0
- package/dist/delivery/delivery-lifecycle.d.ts.map +1 -1
- package/dist/delivery/delivery-lifecycle.js +12 -6
- package/dist/delivery/delivery-lifecycle.js.map +1 -1
- package/dist/delivery/delivery-merge-ops.d.ts.map +1 -1
- package/dist/delivery/delivery-merge-ops.js +39 -21
- package/dist/delivery/delivery-merge-ops.js.map +1 -1
- package/dist/delivery/external-hold.d.ts +8 -2
- package/dist/delivery/external-hold.d.ts.map +1 -1
- package/dist/delivery/external-hold.js +12 -5
- package/dist/delivery/external-hold.js.map +1 -1
- package/dist/delivery/operator-hold.d.ts +6 -1
- package/dist/delivery/operator-hold.d.ts.map +1 -1
- package/dist/delivery/operator-hold.js +31 -10
- package/dist/delivery/operator-hold.js.map +1 -1
- package/dist/delivery/paused-revival.d.ts +6 -0
- package/dist/delivery/paused-revival.d.ts.map +1 -1
- package/dist/delivery/paused-revival.js +3 -1
- package/dist/delivery/paused-revival.js.map +1 -1
- package/dist/directive/directive-dispatch.d.ts.map +1 -1
- package/dist/directive/directive-dispatch.js +6 -3
- package/dist/directive/directive-dispatch.js.map +1 -1
- package/dist/directive/directive-queue.d.ts.map +1 -1
- package/dist/directive/directive-queue.js +4 -1
- package/dist/directive/directive-queue.js.map +1 -1
- package/dist/drift/staleness-sensor.d.ts +14 -0
- package/dist/drift/staleness-sensor.d.ts.map +1 -1
- package/dist/drift/staleness-sensor.js +30 -1
- package/dist/drift/staleness-sensor.js.map +1 -1
- package/dist/focus/focus-executor.d.ts.map +1 -1
- package/dist/focus/focus-executor.js +6 -8
- package/dist/focus/focus-executor.js.map +1 -1
- package/dist/focus/focus-loop-registry.d.ts.map +1 -1
- package/dist/focus/focus-loop-registry.js +23 -13
- package/dist/focus/focus-loop-registry.js.map +1 -1
- package/dist/focus/focus-respawn-guard.d.ts.map +1 -1
- package/dist/focus/focus-respawn-guard.js +21 -4
- package/dist/focus/focus-respawn-guard.js.map +1 -1
- package/dist/focus/listener-auto-advance.d.ts.map +1 -1
- package/dist/focus/listener-auto-advance.js +10 -6
- package/dist/focus/listener-auto-advance.js.map +1 -1
- package/dist/focus/verify-open-issues.d.ts.map +1 -1
- package/dist/focus/verify-open-issues.js +21 -1
- package/dist/focus/verify-open-issues.js.map +1 -1
- package/dist/focus-stage-lifecycle/wedge-watchdog.d.ts.map +1 -1
- package/dist/focus-stage-lifecycle/wedge-watchdog.js +35 -14
- package/dist/focus-stage-lifecycle/wedge-watchdog.js.map +1 -1
- package/dist/loops/index.d.ts.map +1 -1
- package/dist/loops/index.js +2 -1
- package/dist/loops/index.js.map +1 -1
- package/dist/merge/focus-merge.d.ts +1 -1
- package/dist/merge/focus-merge.d.ts.map +1 -1
- package/dist/merge/focus-merge.js +5 -1
- package/dist/merge/focus-merge.js.map +1 -1
- package/dist/merge/merge-back-loop.d.ts +2 -1
- package/dist/merge/merge-back-loop.d.ts.map +1 -1
- package/dist/merge/merge-back-loop.js +15 -12
- package/dist/merge/merge-back-loop.js.map +1 -1
- package/dist/merge/merge-conflict-escalation.d.ts.map +1 -1
- package/dist/merge/merge-conflict-escalation.js +4 -0
- package/dist/merge/merge-conflict-escalation.js.map +1 -1
- package/dist/nexus/return.d.ts +14 -15
- package/dist/nexus/return.d.ts.map +1 -1
- package/dist/nexus/return.js +41 -31
- package/dist/nexus/return.js.map +1 -1
- package/dist/prompt-sections/execution-sections.d.ts +13 -5
- package/dist/prompt-sections/execution-sections.d.ts.map +1 -1
- package/dist/prompt-sections/execution-sections.js +78 -18
- package/dist/prompt-sections/execution-sections.js.map +1 -1
- package/dist/prompt-sections/routing-decider-sections.d.ts +60 -0
- package/dist/prompt-sections/routing-decider-sections.d.ts.map +1 -0
- package/dist/prompt-sections/routing-decider-sections.js +197 -0
- package/dist/prompt-sections/routing-decider-sections.js.map +1 -0
- package/dist/queries/agent-resolvable-aging.d.ts +4 -3
- package/dist/queries/agent-resolvable-aging.d.ts.map +1 -1
- package/dist/queries/agent-resolvable-aging.js +5 -4
- package/dist/queries/agent-resolvable-aging.js.map +1 -1
- package/dist/queries/agent-resolvable-promotion.d.ts +172 -124
- package/dist/queries/agent-resolvable-promotion.d.ts.map +1 -1
- package/dist/queries/agent-resolvable-promotion.js +332 -307
- package/dist/queries/agent-resolvable-promotion.js.map +1 -1
- package/dist/queries/agent-resolvable-retirement.d.ts +105 -0
- package/dist/queries/agent-resolvable-retirement.d.ts.map +1 -0
- package/dist/queries/agent-resolvable-retirement.js +227 -0
- package/dist/queries/agent-resolvable-retirement.js.map +1 -0
- package/dist/queries/cause-key.d.ts +109 -0
- package/dist/queries/cause-key.d.ts.map +1 -1
- package/dist/queries/cause-key.js +93 -1
- package/dist/queries/cause-key.js.map +1 -1
- package/dist/queries/deliveries.d.ts +14 -0
- package/dist/queries/deliveries.d.ts.map +1 -1
- package/dist/queries/deliveries.js +20 -2
- package/dist/queries/deliveries.js.map +1 -1
- package/dist/queries/delivery-gate-state.d.ts +130 -5
- package/dist/queries/delivery-gate-state.d.ts.map +1 -1
- package/dist/queries/delivery-gate-state.js +111 -2
- package/dist/queries/delivery-gate-state.js.map +1 -1
- package/dist/queries/escalation-consumption.d.ts +95 -15
- package/dist/queries/escalation-consumption.d.ts.map +1 -1
- package/dist/queries/escalation-consumption.js +162 -24
- package/dist/queries/escalation-consumption.js.map +1 -1
- package/dist/queries/escalation-dispositions.d.ts +19 -7
- package/dist/queries/escalation-dispositions.d.ts.map +1 -1
- package/dist/queries/escalation-dispositions.js +7 -0
- package/dist/queries/escalation-dispositions.js.map +1 -1
- package/dist/queries/escalation-suppression.d.ts +63 -19
- package/dist/queries/escalation-suppression.d.ts.map +1 -1
- package/dist/queries/escalation-suppression.js +64 -35
- package/dist/queries/escalation-suppression.js.map +1 -1
- package/dist/queries/escalations.d.ts +127 -70
- package/dist/queries/escalations.d.ts.map +1 -1
- package/dist/queries/escalations.js +170 -188
- package/dist/queries/escalations.js.map +1 -1
- package/dist/queries/filing-observation.d.ts +82 -0
- package/dist/queries/filing-observation.d.ts.map +1 -0
- package/dist/queries/filing-observation.js +157 -0
- package/dist/queries/filing-observation.js.map +1 -0
- package/dist/queries/holds.d.ts +69 -2
- package/dist/queries/holds.d.ts.map +1 -1
- package/dist/queries/holds.js +106 -11
- package/dist/queries/holds.js.map +1 -1
- package/dist/queries/incident-correlation.d.ts +291 -0
- package/dist/queries/incident-correlation.d.ts.map +1 -0
- package/dist/queries/incident-correlation.js +408 -0
- package/dist/queries/incident-correlation.js.map +1 -0
- package/dist/queries/routing-measurement.d.ts +48 -1
- package/dist/queries/routing-measurement.d.ts.map +1 -1
- package/dist/queries/routing-measurement.js +64 -2
- package/dist/queries/routing-measurement.js.map +1 -1
- package/dist/queries/routing-quality.d.ts +8 -0
- package/dist/queries/routing-quality.d.ts.map +1 -1
- package/dist/queries/routing-quality.js +12 -3
- package/dist/queries/routing-quality.js.map +1 -1
- package/dist/queries/shared.js +1 -1
- package/dist/shell/crash-recovery.d.ts.map +1 -1
- package/dist/shell/crash-recovery.js +6 -6
- package/dist/shell/crash-recovery.js.map +1 -1
- package/dist/shell/install-probe-tick.d.ts.map +1 -1
- package/dist/shell/install-probe-tick.js +3 -1
- package/dist/shell/install-probe-tick.js.map +1 -1
- package/dist/spawn/respawn-cycle-escalation.d.ts +10 -2
- package/dist/spawn/respawn-cycle-escalation.d.ts.map +1 -1
- package/dist/spawn/respawn-cycle-escalation.js +16 -2
- package/dist/spawn/respawn-cycle-escalation.js.map +1 -1
- package/dist/spawn/routing-decider-spawn.d.ts +93 -0
- package/dist/spawn/routing-decider-spawn.d.ts.map +1 -0
- package/dist/spawn/routing-decider-spawn.js +185 -0
- package/dist/spawn/routing-decider-spawn.js.map +1 -0
- package/dist/spawn/routing-decider.d.ts +42 -0
- package/dist/spawn/routing-decider.d.ts.map +1 -0
- package/dist/spawn/routing-decider.js +95 -0
- package/dist/spawn/routing-decider.js.map +1 -0
- package/dist/spawn/shared.d.ts +8 -0
- package/dist/spawn/shared.d.ts.map +1 -1
- package/dist/spawn/shared.js +1 -1
- package/dist/spawn/shared.js.map +1 -1
- package/dist/spawn/spawn-decision.d.ts +23 -16
- package/dist/spawn/spawn-decision.d.ts.map +1 -1
- package/dist/spawn/spawn-decision.js +27 -11
- package/dist/spawn/spawn-decision.js.map +1 -1
- package/dist/spawn/worktree-session.d.ts +19 -7
- package/dist/spawn/worktree-session.d.ts.map +1 -1
- package/dist/spawn/worktree-session.js +36 -8
- package/dist/spawn/worktree-session.js.map +1 -1
- package/dist/testing/fixtures/index.js +1 -1
- package/dist/types/index.js +1 -1
- package/dist/verify/failure-signature.d.ts +91 -0
- package/dist/verify/failure-signature.d.ts.map +1 -0
- package/dist/verify/failure-signature.js +233 -0
- package/dist/verify/failure-signature.js.map +1 -0
- package/dist/verify/shortfall-repeat.d.ts +12 -9
- package/dist/verify/shortfall-repeat.d.ts.map +1 -1
- package/dist/verify/shortfall-repeat.js +38 -14
- package/dist/verify/shortfall-repeat.js.map +1 -1
- package/dist/verify/stall-detectors.d.ts +19 -43
- package/dist/verify/stall-detectors.d.ts.map +1 -1
- package/dist/verify/stall-detectors.js +26 -101
- package/dist/verify/stall-detectors.js.map +1 -1
- package/dist/verify/unreviewed-settle-detector.d.ts +8 -0
- package/dist/verify/unreviewed-settle-detector.d.ts.map +1 -1
- package/dist/verify/unreviewed-settle-detector.js +15 -1
- package/dist/verify/unreviewed-settle-detector.js.map +1 -1
- package/dist/verify/verification-deps-default.d.ts.map +1 -1
- package/dist/verify/verification-deps-default.js +14 -2
- package/dist/verify/verification-deps-default.js.map +1 -1
- package/dist/verify/verification-evidence-unavailable-feedback.d.ts.map +1 -1
- package/dist/verify/verification-evidence-unavailable-feedback.js +8 -2
- package/dist/verify/verification-evidence-unavailable-feedback.js.map +1 -1
- package/dist/verify/verification-feedback.d.ts +62 -14
- package/dist/verify/verification-feedback.d.ts.map +1 -1
- package/dist/verify/verification-feedback.js +101 -28
- package/dist/verify/verification-feedback.js.map +1 -1
- package/dist/verify/verify-gate-stall.d.ts +116 -0
- package/dist/verify/verify-gate-stall.d.ts.map +1 -0
- package/dist/verify/verify-gate-stall.js +169 -0
- package/dist/verify/verify-gate-stall.js.map +1 -0
- package/dist/verify/verify-restatement.d.ts.map +1 -1
- package/dist/verify/verify-restatement.js +2 -1
- package/dist/verify/verify-restatement.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
// PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
|
|
2
|
+
// Pinned by: packages/daemon/src/queries/incident-correlation.test.ts
|
|
3
|
+
// PINNED-BY-END
|
|
4
|
+
import { appendSymptom, computeCauseKey, incidentKey, isIncidentSymptom, INBOUND_NOTIFICATION_KINDS, INCIDENT_SYMPTOM_ACT_MAX, INCIDENT_SYMPTOM_CAP, } from './cause-key.js';
|
|
5
|
+
import { DISPOSITION_AGENT_RESOLVABLE } from './escalation-dispositions.js';
|
|
6
|
+
import { conditionHead, readHumanAct, readObservation } from './filing-observation.js';
|
|
7
|
+
/** Open statuses an incident can be attached to (pending / in_review). */
|
|
8
|
+
const INCIDENT_OPEN_STATUSES = ['pending', 'in_review'];
|
|
9
|
+
/**
|
|
10
|
+
* Kinds whose OWN open row is read BY KIND as a HOLD, released by a kind-keyed
|
|
11
|
+
* close-half: team_failure (the respawn guard), review_coverage_incomplete (the
|
|
12
|
+
* respawn guard, any disposition), review_handoff_exhausted (the state cascade's
|
|
13
|
+
* breaker hold). Absorbing one into another row would silently drop the hold, and
|
|
14
|
+
* absorbing another condition into one would be closed by the hold's own
|
|
15
|
+
* close-half -- so they never correlate in either direction (their rows still
|
|
16
|
+
* carry the shared incident_key).
|
|
17
|
+
*/
|
|
18
|
+
export const INCIDENT_HOLD_KINDS = new Set([
|
|
19
|
+
'team_failure',
|
|
20
|
+
'review_coverage_incomplete',
|
|
21
|
+
'review_handoff_exhausted',
|
|
22
|
+
]);
|
|
23
|
+
function metaOf(row) {
|
|
24
|
+
return row.metadata ?? null;
|
|
25
|
+
}
|
|
26
|
+
function nonBlankString(value) {
|
|
27
|
+
return typeof value === 'string' && value.trim() !== '' ? value : null;
|
|
28
|
+
}
|
|
29
|
+
/** Pure: the incident key a metadata bag carries, or null. */
|
|
30
|
+
export function readIncidentKey(metadata) {
|
|
31
|
+
if (!metadata || typeof metadata !== 'object')
|
|
32
|
+
return null;
|
|
33
|
+
return nonBlankString(metadata.incident_key);
|
|
34
|
+
}
|
|
35
|
+
/** Pure: the well-formed symptoms a metadata bag carries (malformed entries dropped). */
|
|
36
|
+
export function readSymptoms(metadata) {
|
|
37
|
+
if (!metadata || typeof metadata !== 'object')
|
|
38
|
+
return [];
|
|
39
|
+
const raw = metadata.symptoms;
|
|
40
|
+
return Array.isArray(raw) ? raw.filter(isIncidentSymptom) : [];
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Pure: the branch a filing is about, read from what the site already carries --
|
|
44
|
+
* anchor.branch (merge + stuck-branch filings), then metadata.branch_name
|
|
45
|
+
* (stuck_focus_branch), then metadata.branch (ci_run_red).
|
|
46
|
+
*/
|
|
47
|
+
export function filingBranch(input) {
|
|
48
|
+
const meta = input.metadata ?? null;
|
|
49
|
+
return nonBlankString(input.anchor?.branch) ?? nonBlankString(meta?.branch_name) ?? nonBlankString(meta?.branch);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Pure: the incident key a filing is stamped with. An inbound notification kind
|
|
53
|
+
* never joins an incident. An incident_key already in the filing's metadata wins
|
|
54
|
+
* (a filing that carries its source's key forward); otherwise the key is
|
|
55
|
+
* derived from the RESOLVED provenance (delivery -> focus -> branch|product).
|
|
56
|
+
*/
|
|
57
|
+
export function resolveFilingIncidentKey(input, provenance) {
|
|
58
|
+
const kind = input.escalationKind ?? null;
|
|
59
|
+
if (kind && INBOUND_NOTIFICATION_KINDS.has(kind))
|
|
60
|
+
return null;
|
|
61
|
+
const carried = readIncidentKey(input.metadata);
|
|
62
|
+
if (carried)
|
|
63
|
+
return carried;
|
|
64
|
+
return incidentKey({
|
|
65
|
+
deliveryId: provenance.deliveryId,
|
|
66
|
+
focusId: provenance.focusId,
|
|
67
|
+
branch: filingBranch(input),
|
|
68
|
+
productId: provenance.productId,
|
|
69
|
+
}, kind);
|
|
70
|
+
}
|
|
71
|
+
/** Pure: a proposed act bounded for a symptom (INCIDENT_SYMPTOM_ACT_MAX), or null when none was proposed. */
|
|
72
|
+
function symptomProposedAct(act) {
|
|
73
|
+
if (!act)
|
|
74
|
+
return null;
|
|
75
|
+
if (act.act.length <= INCIDENT_SYMPTOM_ACT_MAX)
|
|
76
|
+
return act;
|
|
77
|
+
return { kind: act.kind, act: `${act.act.slice(0, INCIDENT_SYMPTOM_ACT_MAX - 3)}...` };
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Pure: one filing's observation as an incident symptom. A filing with no
|
|
81
|
+
* metadata.cause_key (a direct createEscalation site) gets a deterministic
|
|
82
|
+
* kind-scoped stand-in, so a re-observation maps to the same symptom. The routed
|
|
83
|
+
* observation's proposed disposition AND proposed human act ride on the symptom, so
|
|
84
|
+
* neither is lost when the filing attaches to another row: every absorbed
|
|
85
|
+
* detector's proposal reaches the routing decider, not only the opener's. A
|
|
86
|
+
* metadata.human_act is carried too, but the daemon chokepoint never writes one, so
|
|
87
|
+
* no daemon filing's symptom has it.
|
|
88
|
+
*/
|
|
89
|
+
export function filingSymptom(input, key, observedAt) {
|
|
90
|
+
const causeKey = nonBlankString(input.metadata?.cause_key) ??
|
|
91
|
+
computeCauseKey(input.escalationKind ?? 'unkeyed', { incident: key });
|
|
92
|
+
const act = readHumanAct(input.metadata?.human_act);
|
|
93
|
+
const observation = readObservation(input.metadata);
|
|
94
|
+
const proposed = observation?.proposed_disposition;
|
|
95
|
+
const proposedAct = symptomProposedAct(observation?.proposed_human_act);
|
|
96
|
+
return {
|
|
97
|
+
cause_key: causeKey,
|
|
98
|
+
escalation_kind: input.escalationKind ?? null,
|
|
99
|
+
head: conditionHead(input.description),
|
|
100
|
+
observed_at: observedAt,
|
|
101
|
+
...(act ? { human_act: act } : {}),
|
|
102
|
+
...(proposed ? { proposed_disposition: proposed } : {}),
|
|
103
|
+
...(proposedAct ? { proposed_human_act: proposedAct } : {}),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Pure: stamp a filing's metadata with its incident key and append its own
|
|
108
|
+
* symptom to whatever symptoms it already carries (none for a fresh row, so the
|
|
109
|
+
* opener is the first entry; a carried list otherwise).
|
|
110
|
+
* A null key leaves the metadata untouched.
|
|
111
|
+
*/
|
|
112
|
+
export function stampIncidentMetadata(input, key, observedAt) {
|
|
113
|
+
if (!key)
|
|
114
|
+
return input.metadata;
|
|
115
|
+
return {
|
|
116
|
+
...(input.metadata ?? {}),
|
|
117
|
+
incident_key: key,
|
|
118
|
+
symptoms: appendSymptom(readSymptoms(input.metadata), filingSymptom(input, key, observedAt)),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
function isOpenRow(row) {
|
|
122
|
+
return !row.status || INCIDENT_OPEN_STATUSES.includes(row.status);
|
|
123
|
+
}
|
|
124
|
+
function rowKind(row) {
|
|
125
|
+
return nonBlankString(row.escalationKind) ?? nonBlankString(metaOf(row)?.kind);
|
|
126
|
+
}
|
|
127
|
+
/** Pure: a row sits in the machine lane (agent_resolvable); everything else is human-facing. */
|
|
128
|
+
export function isMachineLaneRow(row) {
|
|
129
|
+
return row.disposition === DISPOSITION_AGENT_RESOLVABLE;
|
|
130
|
+
}
|
|
131
|
+
/** Pure: the cause keys recorded as symptoms on an OPEN row (idempotency survives correlation). */
|
|
132
|
+
export function openRowSymptomCauseKeys(row) {
|
|
133
|
+
return isOpenRow(row) ? readSymptoms(metaOf(row)).map((s) => s.cause_key) : [];
|
|
134
|
+
}
|
|
135
|
+
/** Pure: whether a filing may correlate at all (contract rule 4). */
|
|
136
|
+
export function filingMayCorrelate(input) {
|
|
137
|
+
if (input.escalationKind && INCIDENT_HOLD_KINDS.has(input.escalationKind))
|
|
138
|
+
return false;
|
|
139
|
+
return nonBlankString(input.targetProductId) === null;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Pure: the OPEN row of incident `key` in the filing's lane (contract rule 1), or
|
|
143
|
+
* null. Lane = the SENT disposition (null and undefined are one lane). Hold-kind
|
|
144
|
+
* rows are never a target. Among several, the oldest wins (createdAt ascending;
|
|
145
|
+
* rows without one keep list order, which escalation_list returns newest-first, so
|
|
146
|
+
* a later entry is older).
|
|
147
|
+
*/
|
|
148
|
+
export function findLaneIncidentRow(rows, key, disposition) {
|
|
149
|
+
let best = null;
|
|
150
|
+
for (const [index, row] of rows.entries()) {
|
|
151
|
+
if (!isOpenRow(row) || readIncidentKey(metaOf(row)) !== key)
|
|
152
|
+
continue;
|
|
153
|
+
if ((row.disposition ?? null) !== (disposition ?? null))
|
|
154
|
+
continue;
|
|
155
|
+
const kind = rowKind(row);
|
|
156
|
+
if (kind !== null && INCIDENT_HOLD_KINDS.has(kind))
|
|
157
|
+
continue;
|
|
158
|
+
const candidate = { row, index };
|
|
159
|
+
if (best === null || isOlderCandidate(candidate, best))
|
|
160
|
+
best = candidate;
|
|
161
|
+
}
|
|
162
|
+
return best?.row ?? null;
|
|
163
|
+
}
|
|
164
|
+
function isOlderCandidate(a, b) {
|
|
165
|
+
const createdA = a.row.createdAt ?? null;
|
|
166
|
+
const createdB = b.row.createdAt ?? null;
|
|
167
|
+
if (createdA && createdB && createdA !== createdB)
|
|
168
|
+
return createdA < createdB;
|
|
169
|
+
return a.index > b.index;
|
|
170
|
+
}
|
|
171
|
+
/** Pure: whether a row already carries `causeKey` -- its own, its original, or a symptom's. */
|
|
172
|
+
export function rowCarriesCause(row, causeKey) {
|
|
173
|
+
const meta = metaOf(row);
|
|
174
|
+
if (meta?.cause_key === causeKey || meta?.original_cause_key === causeKey)
|
|
175
|
+
return true;
|
|
176
|
+
return readSymptoms(meta).some((s) => s.cause_key === causeKey);
|
|
177
|
+
}
|
|
178
|
+
/** The default correlation I/O over a callApi (escalation_list + escalation_update). */
|
|
179
|
+
export function incidentIoOver(call) {
|
|
180
|
+
return {
|
|
181
|
+
listOpenRows: async ({ focusId }) => {
|
|
182
|
+
const res = await call('escalation_list', {
|
|
183
|
+
fields: { statuses: INCIDENT_OPEN_STATUSES, ...(focusId ? { focusId } : {}) },
|
|
184
|
+
limit: 500,
|
|
185
|
+
});
|
|
186
|
+
return res?.escalations ?? [];
|
|
187
|
+
},
|
|
188
|
+
updateMetadata: async (escalationId, metadata) => {
|
|
189
|
+
await call('escalation_update', { escalationId, fields: { metadata } });
|
|
190
|
+
},
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Correlate one filing onto its incident (the contract in the module header):
|
|
195
|
+
* attach to the open lane row, report a re-observed cause, or tell the chokepoint
|
|
196
|
+
* to file the row. Never throws -- a failed read or write degrades to open_row /
|
|
197
|
+
* attach_failed, and the chokepoint files the row.
|
|
198
|
+
*/
|
|
199
|
+
export async function correlateFiling(input, io) {
|
|
200
|
+
const openRow = { outcome: 'open_row', incidentRowId: null, note: null, warn: false };
|
|
201
|
+
if (!filingMayCorrelate(input.filing))
|
|
202
|
+
return openRow;
|
|
203
|
+
let rows;
|
|
204
|
+
try {
|
|
205
|
+
rows = await io.listOpenRows(input.focusId ? { focusId: input.focusId } : {});
|
|
206
|
+
}
|
|
207
|
+
catch (err) {
|
|
208
|
+
return { ...openRow, note: `Incident read for ${input.key} failed; filing its own row: ${err.message}`, warn: true };
|
|
209
|
+
}
|
|
210
|
+
const row = findLaneIncidentRow(rows, input.key, input.disposition);
|
|
211
|
+
if (!row)
|
|
212
|
+
return openRow;
|
|
213
|
+
const symptom = filingSymptom(input.filing, input.key, input.observedAt);
|
|
214
|
+
const where = `incident ${input.key} (escalation ${row.id})`;
|
|
215
|
+
if (rowCarriesCause(row, symptom.cause_key)) {
|
|
216
|
+
return { outcome: 'already_carried', incidentRowId: row.id, note: `"${symptom.cause_key}" is already carried by ${where}; nothing filed`, warn: false };
|
|
217
|
+
}
|
|
218
|
+
try {
|
|
219
|
+
await io.updateMetadata(row.id, { symptoms: appendSymptom(readSymptoms(metaOf(row)), symptom) });
|
|
220
|
+
return { outcome: 'attached', incidentRowId: row.id, note: `Correlated "${symptom.cause_key}" onto ${where}`, warn: false };
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
return { outcome: 'attach_failed', incidentRowId: row.id, note: `Attach to ${where} failed; filing its own row: ${err.message}`, warn: true };
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Pure: whether a row answers for `kind` in a DEDUP read: its own column kind,
|
|
228
|
+
* the legacy metadata.kind, a hand-off row's metadata.originalKind or
|
|
229
|
+
* original_cause_key, or any symptom correlated onto it (by kind or by a cause key
|
|
230
|
+
* minted for the kind, `<kind>::...`). Hold reads must NOT use this -- a handed-off
|
|
231
|
+
* or absorbed condition has no close-half that would clear a hold keyed on it.
|
|
232
|
+
*/
|
|
233
|
+
export function rowAnswersForKind(row, kind) {
|
|
234
|
+
if (row.escalationKind === kind)
|
|
235
|
+
return true;
|
|
236
|
+
const meta = metaOf(row);
|
|
237
|
+
if (meta?.kind === kind || meta?.originalKind === kind)
|
|
238
|
+
return true;
|
|
239
|
+
if (typeof meta?.original_cause_key === 'string' && meta.original_cause_key.startsWith(`${kind}::`))
|
|
240
|
+
return true;
|
|
241
|
+
return readSymptoms(meta).some((s) => symptomAnswersForKind(s, kind));
|
|
242
|
+
}
|
|
243
|
+
/** Pure: a symptom is an observation of `kind` -- by its kind, or by a cause key minted for the kind (`<kind>::...`). */
|
|
244
|
+
export function symptomAnswersForKind(symptom, kind) {
|
|
245
|
+
return symptom.escalation_kind === kind || symptom.cause_key.startsWith(`${kind}::`);
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Pure: whether a row is about `deliveryId` in a DEDUP read: the delivery_id
|
|
249
|
+
* column, the metadata fallbacks, or an incident key naming the delivery (a
|
|
250
|
+
* historic promotion refile is anchored to the focus, so only its carried key names it).
|
|
251
|
+
*/
|
|
252
|
+
export function rowNamesDelivery(row, deliveryId) {
|
|
253
|
+
if (row.deliveryId === deliveryId)
|
|
254
|
+
return true;
|
|
255
|
+
const meta = metaOf(row);
|
|
256
|
+
if (meta?.deliveryId === deliveryId || meta?.delivery_id === deliveryId)
|
|
257
|
+
return true;
|
|
258
|
+
return readIncidentKey(meta) === incidentKey({ deliveryId });
|
|
259
|
+
}
|
|
260
|
+
// ── Open-row kind predicates (the queries/escalations.ts dedup + close-half reads) ──
|
|
261
|
+
/**
|
|
262
|
+
* Pure: an OPEN row of `kind` on `focusId` -- the typed focus_id + escalation_kind
|
|
263
|
+
* columns, or (back-compat, a row filed before the column promotion)
|
|
264
|
+
* metadata.focusId + metadata.kind. With `matchCorrelated` (DEDUP reads only), also
|
|
265
|
+
* a row on the focus answering for the kind as a hand-off row or a correlated
|
|
266
|
+
* symptom (rowAnswersForKind).
|
|
267
|
+
*/
|
|
268
|
+
export function isOpenFocusKindRow(row, focusId, kind, matchCorrelated = false) {
|
|
269
|
+
if (!isOpenRow(row))
|
|
270
|
+
return false;
|
|
271
|
+
const meta = metaOf(row);
|
|
272
|
+
if (matchCorrelated)
|
|
273
|
+
return (row.focusId === focusId || meta?.focusId === focusId) && rowAnswersForKind(row, kind);
|
|
274
|
+
if (row.focusId === focusId && row.escalationKind === kind)
|
|
275
|
+
return true;
|
|
276
|
+
return meta?.focusId === focusId && meta?.kind === kind;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Pure: an OPEN worktree-dirty-class row for `focusId` whose kind is in `kinds`.
|
|
280
|
+
* Shared by hasOpenWorktreeDirtyEscalation (dedup, matchCorrelated) and
|
|
281
|
+
* resolveOpenWorktreeDirtyEscalations (auto-close, never correlated: it must not
|
|
282
|
+
* close a row whose own condition is a different one) so both agree on what counts.
|
|
283
|
+
*
|
|
284
|
+
* The status re-check is defense-in-depth. The live escalation_list handler
|
|
285
|
+
* already honors the `statuses` filter server-side, but the invariant "a RESOLVED
|
|
286
|
+
* worktree-dirty row must never suppress (or be re-resolved as) a legitimate new
|
|
287
|
+
* escalation" must hold however the rows were fetched (custom `kinds`, a future
|
|
288
|
+
* caller that forgets the statuses filter, etc.).
|
|
289
|
+
*/
|
|
290
|
+
export function isOpenWorktreeDirtyMatch(row, focusId, kinds, matchCorrelated = false) {
|
|
291
|
+
return [...kinds].some((kind) => isOpenFocusKindRow(row, focusId, kind, matchCorrelated));
|
|
292
|
+
}
|
|
293
|
+
/** Pure: the well-formed cleared-symptom records a metadata bag carries. */
|
|
294
|
+
export function readClearedSymptoms(metadata) {
|
|
295
|
+
if (!metadata || typeof metadata !== 'object')
|
|
296
|
+
return [];
|
|
297
|
+
const raw = metadata.cleared_symptoms;
|
|
298
|
+
if (!Array.isArray(raw))
|
|
299
|
+
return [];
|
|
300
|
+
return raw.filter((v) => {
|
|
301
|
+
if (!v || typeof v !== 'object')
|
|
302
|
+
return false;
|
|
303
|
+
const c = v;
|
|
304
|
+
return nonBlankString(c.cause_key) !== null && (c.escalation_kind === null || typeof c.escalation_kind === 'string') &&
|
|
305
|
+
typeof c.cleared_at === 'string' && typeof c.resolution_class === 'string';
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
/**
|
|
309
|
+
* Pure: the cause keys that are a row's OWN -- its metadata.cause_key, a hand-off
|
|
310
|
+
* row's original_cause_key, and the kind-scoped stand-in its opening symptom got
|
|
311
|
+
* when filed without a cause key (filingSymptom). Never retired by retirement.
|
|
312
|
+
*/
|
|
313
|
+
export function rowOwnCauseKeys(row) {
|
|
314
|
+
const meta = metaOf(row);
|
|
315
|
+
const own = new Set();
|
|
316
|
+
for (const k of [meta?.cause_key, meta?.original_cause_key].map(nonBlankString))
|
|
317
|
+
if (k)
|
|
318
|
+
own.add(k);
|
|
319
|
+
const key = readIncidentKey(meta);
|
|
320
|
+
if (key) {
|
|
321
|
+
own.add(computeCauseKey(nonBlankString(row.escalationKind) ?? 'unkeyed', { incident: key }));
|
|
322
|
+
own.add(computeCauseKey(rowKind(row) ?? 'unkeyed', { incident: key }));
|
|
323
|
+
}
|
|
324
|
+
return own;
|
|
325
|
+
}
|
|
326
|
+
function rowInClearingScope(row, scope) {
|
|
327
|
+
if (!scope.focusId && !scope.productId)
|
|
328
|
+
return false;
|
|
329
|
+
const meta = metaOf(row);
|
|
330
|
+
if (scope.focusId && row.focusId !== scope.focusId && meta?.focusId !== scope.focusId)
|
|
331
|
+
return false;
|
|
332
|
+
if (!scope.productId)
|
|
333
|
+
return true;
|
|
334
|
+
return row.productId === scope.productId || meta?.productId === scope.productId || meta?.product_id === scope.productId;
|
|
335
|
+
}
|
|
336
|
+
function symptomMatchesClearing(symptom, clearing) {
|
|
337
|
+
if (clearing.causeKeys?.includes(symptom.cause_key))
|
|
338
|
+
return true;
|
|
339
|
+
return (clearing.kinds ?? []).some((kind) => symptomAnswersForKind(symptom, kind));
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Pure: the metadata patch that retires a clearing's matching absorbed symptoms from
|
|
343
|
+
* one row -- the remaining metadata.symptoms plus metadata.cleared_symptoms with each
|
|
344
|
+
* retired one appended (de-duped by cause key, newest kept, bounded to
|
|
345
|
+
* INCIDENT_SYMPTOM_CAP) -- or null when the row is closed, out of scope, or carries
|
|
346
|
+
* nothing to retire. The row's own opening symptom is never retired.
|
|
347
|
+
*/
|
|
348
|
+
export function symptomRetirementPatch(row, clearing, clearedAt) {
|
|
349
|
+
if (!isOpenRow(row) || !rowInClearingScope(row, clearing.scope))
|
|
350
|
+
return null;
|
|
351
|
+
const meta = metaOf(row);
|
|
352
|
+
const own = rowOwnCauseKeys(row);
|
|
353
|
+
const symptoms = readSymptoms(meta);
|
|
354
|
+
const retired = symptoms.filter((s) => !own.has(s.cause_key) && symptomMatchesClearing(s, clearing));
|
|
355
|
+
if (retired.length === 0)
|
|
356
|
+
return null;
|
|
357
|
+
const retiredKeys = new Set(retired.map((s) => s.cause_key));
|
|
358
|
+
const cleared = [
|
|
359
|
+
...readClearedSymptoms(meta).filter((c) => !retiredKeys.has(c.cause_key)),
|
|
360
|
+
...retired.map((s) => ({ cause_key: s.cause_key, escalation_kind: s.escalation_kind, cleared_at: clearedAt, resolution_class: clearing.resolutionClass })),
|
|
361
|
+
];
|
|
362
|
+
return {
|
|
363
|
+
symptoms: symptoms.filter((s) => !retiredKeys.has(s.cause_key)),
|
|
364
|
+
cleared_symptoms: cleared.slice(Math.max(0, cleared.length - INCIDENT_SYMPTOM_CAP)),
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Retire a clearing's matching absorbed symptoms from the OPEN rows in its scope
|
|
369
|
+
* (contract rule 6). `rows` reuses rows the close-half already read for the scope
|
|
370
|
+
* (no second read); omitted, the open rows are read, narrowed by scope.focusId.
|
|
371
|
+
* `skipIds` are the close-half's own rows (being resolved, not rewritten). A clearing
|
|
372
|
+
* of hold kinds only reads nothing -- a hold kind is never absorbed (rule 4).
|
|
373
|
+
* Best-effort and never throws: a failed read or write becomes a warning and the
|
|
374
|
+
* pass continues. The write reads-then-writes like an attach (not atomic).
|
|
375
|
+
*/
|
|
376
|
+
export async function retireClearedSymptoms(clearing, io, opts = {}) {
|
|
377
|
+
const outcome = { retired: 0, warnings: [] };
|
|
378
|
+
const absorbable = (clearing.kinds ?? []).some((k) => !INCIDENT_HOLD_KINDS.has(k)) || (clearing.causeKeys ?? []).length > 0;
|
|
379
|
+
if (!absorbable || (!clearing.scope.focusId && !clearing.scope.productId))
|
|
380
|
+
return outcome;
|
|
381
|
+
let rows;
|
|
382
|
+
try {
|
|
383
|
+
rows = opts.rows ?? (await io.listOpenRows(clearing.scope.focusId ? { focusId: clearing.scope.focusId } : {}));
|
|
384
|
+
}
|
|
385
|
+
catch (err) {
|
|
386
|
+
outcome.warnings.push(`Symptom retirement read failed; absorbed symptoms left in place: ${err.message}`);
|
|
387
|
+
return outcome;
|
|
388
|
+
}
|
|
389
|
+
const skip = new Set(opts.skipIds ?? []);
|
|
390
|
+
const clearedAt = opts.clearedAt ?? new Date().toISOString();
|
|
391
|
+
for (const row of rows) {
|
|
392
|
+
if (skip.has(row.id))
|
|
393
|
+
continue;
|
|
394
|
+
const patch = symptomRetirementPatch(row, clearing, clearedAt);
|
|
395
|
+
if (!patch)
|
|
396
|
+
continue;
|
|
397
|
+
const count = readSymptoms(metaOf(row)).length - patch.symptoms.length;
|
|
398
|
+
try {
|
|
399
|
+
await io.updateMetadata(row.id, { ...patch });
|
|
400
|
+
outcome.retired += count;
|
|
401
|
+
}
|
|
402
|
+
catch (err) {
|
|
403
|
+
outcome.warnings.push(`Retiring ${count} cleared symptom(s) from escalation ${row.id} failed: ${err.message}`);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
return outcome;
|
|
407
|
+
}
|
|
408
|
+
//# sourceMappingURL=incident-correlation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"incident-correlation.js","sourceRoot":"","sources":["../../src/queries/incident-correlation.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,52 @@
|
|
|
2
2
|
export interface ResolvedEscalationRow {
|
|
3
3
|
disposition: string | null;
|
|
4
4
|
resolutionClass: string | null;
|
|
5
|
+
/** The row's own escalation id, when read (lets a source row judged directly win over its carrier). */
|
|
6
|
+
id?: string;
|
|
7
|
+
/**
|
|
8
|
+
* Set when this row IS a hand-off out of the machine lane -- a routing decider's
|
|
9
|
+
* human-facing filing (metadata.originalEscalationId) or a historic promotion
|
|
10
|
+
* refile: the id of the machine-lane filing it was handed off from. The row is then judged against that
|
|
11
|
+
* filing's declared disposition, not its own needs_operator (see resolvePromotionLineage).
|
|
12
|
+
*/
|
|
13
|
+
promotedFrom?: string;
|
|
14
|
+
/**
|
|
15
|
+
* Ids of OTHER machine-lane filings whose promotion was correlated onto this row
|
|
16
|
+
* as a symptom instead of filing its own refile (incident correlation is
|
|
17
|
+
* focus-scoped, so a second promotion on a focus attached to the first open
|
|
18
|
+
* needs_operator row there). Historic only: a routing decider's MCP filing never
|
|
19
|
+
* passes the incident reducer. Each is judged with this row's resolver.
|
|
20
|
+
*/
|
|
21
|
+
absorbedPromotions?: readonly string[];
|
|
5
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* Pure: expand a resolved sample into JUDGMENT UNITS, one per filing whose
|
|
25
|
+
* resolver the row witnesses. This is what lets the mis-route rate see the
|
|
26
|
+
* machine lane's dominant hand-back path, PROMOTION:
|
|
27
|
+
*
|
|
28
|
+
* an agent_resolvable filing no agent clears is handed to a routing decider,
|
|
29
|
+
* which files a needs_operator row carrying its lineage, and the source is closed
|
|
30
|
+
* auto_swept (no actor -- never judged); when an operator resolves that
|
|
31
|
+
* row, judging it as needs_operator + operator_action reads "correctly
|
|
32
|
+
* routed", so a lane whose work all ages out and is handed to a human would
|
|
33
|
+
* measure a mis-route rate of ~0.
|
|
34
|
+
*
|
|
35
|
+
* Instead a promoted refile (promotedFrom) is judged against its SOURCE's declared
|
|
36
|
+
* disposition (agent_resolvable) with the refile's own resolution class: closed
|
|
37
|
+
* operator_action it is a machine-lane hand-back (mis-route), closed agent_session
|
|
38
|
+
* the machine lane still cleared it (correct), closed auto_swept / declined it
|
|
39
|
+
* carries no actor (unjudged) -- the same resolverActorOf mapping as any row. A row
|
|
40
|
+
* that absorbed other promotions contributes one agent_resolvable unit per absorbed
|
|
41
|
+
* source, in addition to its own unit.
|
|
42
|
+
*
|
|
43
|
+
* One judgment per source filing: a source already witnessed by a carrier is not
|
|
44
|
+
* counted twice, and when the SOURCE row itself is in the sample with an actor
|
|
45
|
+
* class (an agent closed it while its promotion symptom sat on a human row), that
|
|
46
|
+
* direct close is the witness and the carrier's unit for it is dropped. The source
|
|
47
|
+
* row's own auto_swept promotion close carries no actor, so it never double-counts.
|
|
48
|
+
* Units carry no lineage fields, so the function is idempotent.
|
|
49
|
+
*/
|
|
50
|
+
export declare function resolvePromotionLineage(rows: readonly ResolvedEscalationRow[]): ResolvedEscalationRow[];
|
|
6
51
|
export interface MisRouteResult {
|
|
7
52
|
/** Rows where both a declared owner and an actual resolver were observable. */
|
|
8
53
|
judged: number;
|
|
@@ -17,7 +62,9 @@ export interface MisRouteResult {
|
|
|
17
62
|
* Only rows whose ACTUAL resolver is observable (resolution_class in
|
|
18
63
|
* agent_session / operator_action / external_change) AND whose disposition maps
|
|
19
64
|
* to a declared owner are judged. A row with no resolver signal (e.g. auto_swept,
|
|
20
|
-
* declined_invalid) or no disposition is not counted either way.
|
|
65
|
+
* declined_invalid) or no disposition is not counted either way. Promotion
|
|
66
|
+
* lineage is applied first (resolvePromotionLineage): a promoted refile is judged
|
|
67
|
+
* against the machine-lane filing it was promoted from.
|
|
21
68
|
*/
|
|
22
69
|
export declare function computeMisRouteRate(rows: readonly ResolvedEscalationRow[]): MisRouteResult;
|
|
23
70
|
export interface ActWorthyResult {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routing-measurement.d.ts","sourceRoot":"","sources":["../../src/queries/routing-measurement.ts"],"names":[],"mappings":"AAkFA,iDAAiD;AACjD,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"routing-measurement.d.ts","sourceRoot":"","sources":["../../src/queries/routing-measurement.ts"],"names":[],"mappings":"AAkFA,iDAAiD;AACjD,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,uGAAuG;IACvG,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;;;OAMG;IACH,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACxC;AAUD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,SAAS,qBAAqB,EAAE,GAAG,qBAAqB,EAAE,CAqBvG;AAED,MAAM,WAAW,cAAc;IAC7B,+EAA+E;IAC/E,MAAM,EAAE,MAAM,CAAC;IACf,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,qBAAqB,EAAE,GAAG,cAAc,CAW1F;AAED,MAAM,WAAW,eAAe;IAC9B,6EAA6E;IAC7E,UAAU,EAAE,MAAM,CAAC;IACnB,0EAA0E;IAC1E,SAAS,EAAE,MAAM,CAAC;IAClB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,qBAAqB,EAAE,GAAG,eAAe,CAS7F"}
|
|
@@ -42,18 +42,80 @@ function declaredOwnerOf(disposition) {
|
|
|
42
42
|
}
|
|
43
43
|
/** Resolution classes meaning the filing was NOT worth acting on. */
|
|
44
44
|
const NON_ACTWORTHY_CLASSES = ['declined_invalid', 'duplicate'];
|
|
45
|
+
/**
|
|
46
|
+
* The disposition every promotion source was filed with. By construction: the
|
|
47
|
+
* promotion reads only open agent_resolvable rows (toAgentResolvableItems /
|
|
48
|
+
* toOrgAgentResolvableItems), so a refile's lineage always points back into the
|
|
49
|
+
* machine lane.
|
|
50
|
+
*/
|
|
51
|
+
const PROMOTION_SOURCE_DISPOSITION = 'agent_resolvable';
|
|
52
|
+
/**
|
|
53
|
+
* Pure: expand a resolved sample into JUDGMENT UNITS, one per filing whose
|
|
54
|
+
* resolver the row witnesses. This is what lets the mis-route rate see the
|
|
55
|
+
* machine lane's dominant hand-back path, PROMOTION:
|
|
56
|
+
*
|
|
57
|
+
* an agent_resolvable filing no agent clears is handed to a routing decider,
|
|
58
|
+
* which files a needs_operator row carrying its lineage, and the source is closed
|
|
59
|
+
* auto_swept (no actor -- never judged); when an operator resolves that
|
|
60
|
+
* row, judging it as needs_operator + operator_action reads "correctly
|
|
61
|
+
* routed", so a lane whose work all ages out and is handed to a human would
|
|
62
|
+
* measure a mis-route rate of ~0.
|
|
63
|
+
*
|
|
64
|
+
* Instead a promoted refile (promotedFrom) is judged against its SOURCE's declared
|
|
65
|
+
* disposition (agent_resolvable) with the refile's own resolution class: closed
|
|
66
|
+
* operator_action it is a machine-lane hand-back (mis-route), closed agent_session
|
|
67
|
+
* the machine lane still cleared it (correct), closed auto_swept / declined it
|
|
68
|
+
* carries no actor (unjudged) -- the same resolverActorOf mapping as any row. A row
|
|
69
|
+
* that absorbed other promotions contributes one agent_resolvable unit per absorbed
|
|
70
|
+
* source, in addition to its own unit.
|
|
71
|
+
*
|
|
72
|
+
* One judgment per source filing: a source already witnessed by a carrier is not
|
|
73
|
+
* counted twice, and when the SOURCE row itself is in the sample with an actor
|
|
74
|
+
* class (an agent closed it while its promotion symptom sat on a human row), that
|
|
75
|
+
* direct close is the witness and the carrier's unit for it is dropped. The source
|
|
76
|
+
* row's own auto_swept promotion close carries no actor, so it never double-counts.
|
|
77
|
+
* Units carry no lineage fields, so the function is idempotent.
|
|
78
|
+
*/
|
|
79
|
+
export function resolvePromotionLineage(rows) {
|
|
80
|
+
const directlyJudged = new Set();
|
|
81
|
+
for (const row of rows) {
|
|
82
|
+
if (row.id !== undefined && resolverActorOf(row.resolutionClass) !== null)
|
|
83
|
+
directlyJudged.add(row.id);
|
|
84
|
+
}
|
|
85
|
+
const witnessed = new Set();
|
|
86
|
+
const units = [];
|
|
87
|
+
const sourceUnit = (sourceId, resolutionClass) => {
|
|
88
|
+
if (directlyJudged.has(sourceId) || witnessed.has(sourceId))
|
|
89
|
+
return;
|
|
90
|
+
witnessed.add(sourceId);
|
|
91
|
+
units.push({ disposition: PROMOTION_SOURCE_DISPOSITION, resolutionClass });
|
|
92
|
+
};
|
|
93
|
+
for (const row of rows) {
|
|
94
|
+
if (row.promotedFrom !== undefined) {
|
|
95
|
+
sourceUnit(row.promotedFrom, row.resolutionClass);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
units.push({ disposition: row.disposition, resolutionClass: row.resolutionClass });
|
|
99
|
+
}
|
|
100
|
+
for (const sourceId of row.absorbedPromotions ?? [])
|
|
101
|
+
sourceUnit(sourceId, row.resolutionClass);
|
|
102
|
+
}
|
|
103
|
+
return units;
|
|
104
|
+
}
|
|
45
105
|
/**
|
|
46
106
|
* The share of judgeable filings that were routed to the wrong owner.
|
|
47
107
|
*
|
|
48
108
|
* Only rows whose ACTUAL resolver is observable (resolution_class in
|
|
49
109
|
* agent_session / operator_action / external_change) AND whose disposition maps
|
|
50
110
|
* to a declared owner are judged. A row with no resolver signal (e.g. auto_swept,
|
|
51
|
-
* declined_invalid) or no disposition is not counted either way.
|
|
111
|
+
* declined_invalid) or no disposition is not counted either way. Promotion
|
|
112
|
+
* lineage is applied first (resolvePromotionLineage): a promoted refile is judged
|
|
113
|
+
* against the machine-lane filing it was promoted from.
|
|
52
114
|
*/
|
|
53
115
|
export function computeMisRouteRate(rows) {
|
|
54
116
|
let judged = 0;
|
|
55
117
|
let misRouted = 0;
|
|
56
|
-
for (const row of rows) {
|
|
118
|
+
for (const row of resolvePromotionLineage(rows)) {
|
|
57
119
|
const actor = resolverActorOf(row.resolutionClass);
|
|
58
120
|
const declared = declaredOwnerOf(row.disposition);
|
|
59
121
|
if (actor === null || declared === null)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routing-measurement.js","sourceRoot":"","sources":["../../src/queries/routing-measurement.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,qEAAqE;AACrE,gBAAgB;AAoChB;;;;;GAKG;AACH,SAAS,eAAe,CAAC,eAA0C;IACjE,QAAQ,eAAe,EAAE,CAAC;QACxB,KAAK,eAAe;YAClB,OAAO,SAAS,CAAC;QACnB,KAAK,iBAAiB;YACpB,OAAO,OAAO,CAAC;QACjB,KAAK,iBAAiB;YACpB,OAAO,UAAU,CAAC;QACpB;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,eAAe,CAAC,WAAsC;IAC7D,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,kBAAkB;YACrB,OAAO,SAAS,CAAC;QACnB,KAAK,gBAAgB;YACnB,OAAO,OAAO,CAAC;QACjB,yEAAyE;QACzE,4EAA4E;QAC5E,KAAK,cAAc,CAAC;QACpB,KAAK,qBAAqB;YACxB,OAAO,OAAO,CAAC;QACjB,KAAK,eAAe;YAClB,OAAO,UAAU,CAAC;QACpB;YACE,OAAO,IAAI,CAAC;IAChB,CAAC;AACH,CAAC;AAED,qEAAqE;AACrE,MAAM,qBAAqB,GAAsB,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"routing-measurement.js","sourceRoot":"","sources":["../../src/queries/routing-measurement.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,14 @@ export interface MachineLaneMisRoute {
|
|
|
26
26
|
* agent_resolvable-filed rows that a non-machine actor actually resolved.
|
|
27
27
|
* Reuses computeMisRouteRate over the agent_resolvable-filed subset, so the one
|
|
28
28
|
* canonical mis-route definition serves both the general measure and this gate.
|
|
29
|
+
*
|
|
30
|
+
* The subset is taken AFTER promotion lineage (resolvePromotionLineage): a
|
|
31
|
+
* needs_operator row handed out of the machine lane (a routing decider's filing, or
|
|
32
|
+
* a historic promotion refile) belongs to that lane, so
|
|
33
|
+
* an operator closing it counts as the lane handing its work back -- the dominant
|
|
34
|
+
* real hand-back path, which a filter on the refile's own disposition would miss.
|
|
35
|
+
* Lineage units carry no lineage fields, so computeMisRouteRate re-applying it is
|
|
36
|
+
* the identity.
|
|
29
37
|
*/
|
|
30
38
|
export declare function machineLaneMisRoute(rows: readonly RoutingSampleRow[]): MachineLaneMisRoute;
|
|
31
39
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routing-quality.d.ts","sourceRoot":"","sources":["../../src/queries/routing-quality.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"routing-quality.d.ts","sourceRoot":"","sources":["../../src/queries/routing-quality.ts"],"names":[],"mappings":"AA0BA,OAAO,EAAiE,KAAK,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAEnI;;;;;GAKG;AACH,eAAO,MAAM,qCAAqC,MAAM,CAAC;AAEzD;;;;GAIG;AACH,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAE7C,4EAA4E;AAC5E,MAAM,WAAW,mBAAmB;IAClC,wEAAwE;IACxE,MAAM,EAAE,MAAM,CAAC;IACf,uFAAuF;IACvF,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,gBAAgB,EAAE,GAAG,mBAAmB,CAK1F;AAED;;;;GAIG;AACH,wBAAgB,6BAA6B,CAC3C,CAAC,EAAE,mBAAmB,EACtB,IAAI,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC3C,OAAO,CAGT;AAED,gFAAgF;AAChF,MAAM,WAAW,kBAAkB;IACjC,kBAAkB,EAAE,MAAM,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;CACvD;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,GAAE,OAAO,CAAC,kBAAkB,CAAM,GACrC,OAAO,CAAC,mBAAmB,CAAC,CAI9B"}
|