@telora/daemon 0.20.60 → 0.20.89
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/ai-inspection-context.d.ts.map +1 -1
- package/dist/ai-inspection-context.js +4 -2
- package/dist/ai-inspection-context.js.map +1 -1
- package/dist/audit-phase.d.ts +12 -18
- package/dist/audit-phase.d.ts.map +1 -1
- package/dist/audit-phase.js +17 -60
- package/dist/audit-phase.js.map +1 -1
- package/dist/audit-prompt.d.ts +44 -0
- package/dist/audit-prompt.d.ts.map +1 -0
- package/dist/audit-prompt.js +198 -0
- package/dist/audit-prompt.js.map +1 -0
- package/dist/ci-sensor-loop.d.ts +38 -1
- package/dist/ci-sensor-loop.d.ts.map +1 -1
- package/dist/ci-sensor-loop.js +49 -5
- package/dist/ci-sensor-loop.js.map +1 -1
- package/dist/completion/completion-decision.d.ts +3 -29
- package/dist/completion/completion-decision.d.ts.map +1 -1
- package/dist/completion/completion-decision.js +3 -15
- package/dist/completion/completion-decision.js.map +1 -1
- package/dist/completion/event-phases.d.ts +0 -8
- package/dist/completion/event-phases.d.ts.map +1 -1
- package/dist/completion/event-phases.js +4 -52
- package/dist/completion/event-phases.js.map +1 -1
- package/dist/completion/event.d.ts +1 -11
- package/dist/completion/event.d.ts.map +1 -1
- package/dist/completion/event.js +1 -3
- package/dist/completion/event.js.map +1 -1
- package/dist/delivery-artifacts.d.ts.map +1 -1
- package/dist/delivery-artifacts.js +9 -8
- package/dist/delivery-artifacts.js.map +1 -1
- package/dist/delivery-reconciler.d.ts +3 -0
- package/dist/delivery-reconciler.d.ts.map +1 -1
- package/dist/delivery-reconciler.js +16 -0
- package/dist/delivery-reconciler.js.map +1 -1
- package/dist/focus-engine.d.ts.map +1 -1
- package/dist/focus-engine.js +12 -1
- package/dist/focus-engine.js.map +1 -1
- package/dist/focus-executor.d.ts.map +1 -1
- package/dist/focus-executor.js +4 -1
- package/dist/focus-executor.js.map +1 -1
- package/dist/focus-merge.d.ts.map +1 -1
- package/dist/focus-merge.js +37 -3
- package/dist/focus-merge.js.map +1 -1
- package/dist/focus-stage-lifecycle/wedge-watchdog.d.ts.map +1 -1
- package/dist/focus-stage-lifecycle/wedge-watchdog.js +9 -1
- package/dist/focus-stage-lifecycle/wedge-watchdog.js.map +1 -1
- package/dist/listener-auto-advance.d.ts.map +1 -1
- package/dist/listener-auto-advance.js +58 -10
- package/dist/listener-auto-advance.js.map +1 -1
- package/dist/merge-back-loop.d.ts +8 -2
- package/dist/merge-back-loop.d.ts.map +1 -1
- package/dist/merge-back-loop.js +17 -11
- package/dist/merge-back-loop.js.map +1 -1
- package/dist/merge-failure-classify.d.ts +39 -0
- package/dist/merge-failure-classify.d.ts.map +1 -0
- package/dist/merge-failure-classify.js +58 -0
- package/dist/merge-failure-classify.js.map +1 -0
- package/dist/prompt-sections/execution-sections.d.ts +20 -14
- package/dist/prompt-sections/execution-sections.d.ts.map +1 -1
- package/dist/prompt-sections/execution-sections.js +97 -141
- package/dist/prompt-sections/execution-sections.js.map +1 -1
- package/dist/prompt-sections/scoping-sections.d.ts +30 -0
- package/dist/prompt-sections/scoping-sections.d.ts.map +1 -0
- package/dist/prompt-sections/scoping-sections.js +187 -0
- package/dist/prompt-sections/scoping-sections.js.map +1 -0
- package/dist/prompt-sections/shared.d.ts +7 -0
- package/dist/prompt-sections/shared.d.ts.map +1 -1
- package/dist/prompt-sections/shared.js.map +1 -1
- package/dist/queries/agent-resolvable-promotion.d.ts +87 -0
- package/dist/queries/agent-resolvable-promotion.d.ts.map +1 -0
- package/dist/queries/agent-resolvable-promotion.js +152 -0
- package/dist/queries/agent-resolvable-promotion.js.map +1 -0
- package/dist/queries/cause-key.d.ts +64 -0
- package/dist/queries/cause-key.d.ts.map +1 -0
- package/dist/queries/cause-key.js +79 -0
- package/dist/queries/cause-key.js.map +1 -0
- package/dist/queries/deliveries.d.ts +20 -153
- package/dist/queries/deliveries.d.ts.map +1 -1
- package/dist/queries/deliveries.js +26 -0
- package/dist/queries/deliveries.js.map +1 -1
- package/dist/queries/delivery-gate-state.d.ts +192 -0
- package/dist/queries/delivery-gate-state.d.ts.map +1 -0
- package/dist/queries/delivery-gate-state.js +23 -0
- package/dist/queries/delivery-gate-state.js.map +1 -0
- package/dist/queries/escalation-suppression.d.ts +89 -0
- package/dist/queries/escalation-suppression.d.ts.map +1 -0
- package/dist/queries/escalation-suppression.js +98 -0
- package/dist/queries/escalation-suppression.js.map +1 -0
- package/dist/queries/holds.d.ts +52 -59
- package/dist/queries/holds.d.ts.map +1 -1
- package/dist/queries/holds.js +60 -68
- package/dist/queries/holds.js.map +1 -1
- package/dist/queries/issues.d.ts +40 -2
- package/dist/queries/issues.d.ts.map +1 -1
- package/dist/queries/issues.js +55 -2
- package/dist/queries/issues.js.map +1 -1
- package/dist/queries/verification.d.ts +11 -0
- package/dist/queries/verification.d.ts.map +1 -1
- package/dist/queries/verification.js.map +1 -1
- package/dist/reality-pole.d.ts +5 -3
- package/dist/reality-pole.d.ts.map +1 -1
- package/dist/reality-pole.js +13 -4
- package/dist/reality-pole.js.map +1 -1
- package/dist/resolvers/git-diff-against-base.d.ts.map +1 -1
- package/dist/resolvers/git-diff-against-base.js +12 -5
- package/dist/resolvers/git-diff-against-base.js.map +1 -1
- package/dist/resolvers/index.d.ts +1 -1
- package/dist/resolvers/index.d.ts.map +1 -1
- package/dist/resolvers/index.js +1 -1
- package/dist/resolvers/index.js.map +1 -1
- package/dist/resolvers/shared/git-diff.d.ts +152 -10
- package/dist/resolvers/shared/git-diff.d.ts.map +1 -1
- package/dist/resolvers/shared/git-diff.js +292 -14
- package/dist/resolvers/shared/git-diff.js.map +1 -1
- package/dist/spawn/prompt-assembly.d.ts +3 -0
- package/dist/spawn/prompt-assembly.d.ts.map +1 -1
- package/dist/spawn/prompt-assembly.js +2 -1
- package/dist/spawn/prompt-assembly.js.map +1 -1
- package/dist/spawn/worktree-session.d.ts +2 -0
- package/dist/spawn/worktree-session.d.ts.map +1 -1
- package/dist/spawn/worktree-session.js +20 -1
- package/dist/spawn/worktree-session.js.map +1 -1
- package/dist/staleness-sensor.d.ts +24 -1
- package/dist/staleness-sensor.d.ts.map +1 -1
- package/dist/staleness-sensor.js +31 -4
- package/dist/staleness-sensor.js.map +1 -1
- package/dist/stall-detectors.d.ts +13 -9
- package/dist/stall-detectors.d.ts.map +1 -1
- package/dist/stall-detectors.js +14 -13
- package/dist/stall-detectors.js.map +1 -1
- package/dist/team-prompt-base.d.ts +1 -1
- package/dist/team-prompt-base.d.ts.map +1 -1
- package/dist/team-prompt-base.js +4 -2
- package/dist/team-prompt-base.js.map +1 -1
- package/dist/templates/claude-md.d.ts +1 -1
- package/dist/templates/claude-md.d.ts.map +1 -1
- package/dist/templates/claude-md.js +20 -0
- package/dist/templates/claude-md.js.map +1 -1
- package/dist/verification-default-on.d.ts.map +1 -1
- package/dist/verification-default-on.js +5 -0
- package/dist/verification-default-on.js.map +1 -1
- package/dist/verification-deps.d.ts +151 -0
- package/dist/verification-deps.d.ts.map +1 -0
- package/dist/verification-deps.js +19 -0
- package/dist/verification-deps.js.map +1 -0
- package/dist/verification-engine.d.ts +18 -112
- package/dist/verification-engine.d.ts.map +1 -1
- package/dist/verification-engine.js +90 -103
- package/dist/verification-engine.js.map +1 -1
- package/dist/verification-evidence.d.ts +106 -0
- package/dist/verification-evidence.d.ts.map +1 -0
- package/dist/verification-evidence.js +158 -0
- package/dist/verification-evidence.js.map +1 -0
- package/dist/verification-feedback.d.ts +31 -26
- package/dist/verification-feedback.d.ts.map +1 -1
- package/dist/verification-feedback.js +77 -76
- package/dist/verification-feedback.js.map +1 -1
- package/dist/verify-restatement.d.ts +12 -9
- package/dist/verify-restatement.d.ts.map +1 -1
- package/dist/verify-restatement.js +11 -9
- package/dist/verify-restatement.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent_resolvable promotion safety net (delivery "agent_resolvable never
|
|
3
|
+
* reaches the human inbox", TEL-3).
|
|
4
|
+
*
|
|
5
|
+
* agent_resolvable filings are machine-owned: hidden from the operator inbox
|
|
6
|
+
* (TEL-1) and ridden into the focus's next coding spawn to be resolved (TEL-2).
|
|
7
|
+
* That is only safe if a filing the machine CANNOT actually clear eventually
|
|
8
|
+
* surfaces to a human -- otherwise it lingers forever, invisible. This module is
|
|
9
|
+
* that backstop: an agent_resolvable filing that has stayed open past a bound
|
|
10
|
+
* (it rode into many spawn cycles and none resolved it -- "bounded failures") is
|
|
11
|
+
* PROMOTED to a human by resolving the machine-routed row and refiling the same
|
|
12
|
+
* content as a needs_operator escalation, which the operator inbox DOES show.
|
|
13
|
+
*
|
|
14
|
+
* Why age, not a per-row attempt counter: escalation_update accepts only
|
|
15
|
+
* status/notes/answer (no disposition or metadata writes without a separate edge
|
|
16
|
+
* deploy), and there is no per-focus "sessions since T" query. Open-age is the
|
|
17
|
+
* deploy-safe, restart-safe, count-free proxy for "it survived N spawn cycles
|
|
18
|
+
* unresolved" -- every spawn that rode it in and exited without clearing it is a
|
|
19
|
+
* failed attempt, and those accumulate as elapsed open time.
|
|
20
|
+
*
|
|
21
|
+
* Promotion is idempotent: the needs_operator refile rides the shared cause-keyed
|
|
22
|
+
* gate keyed on the original escalation id, and the source row is resolved in the
|
|
23
|
+
* same step, so a filing is promoted at most once.
|
|
24
|
+
*/
|
|
25
|
+
import { type AgentResolvableItem } from './issues.js';
|
|
26
|
+
import { type FileEscalationIdempotentParams, type FileEscalationIdempotentResult } from './escalation-suppression.js';
|
|
27
|
+
/** Default hours an agent_resolvable filing may stay open before promotion. */
|
|
28
|
+
export declare const DEFAULT_AGENT_RESOLVABLE_PROMOTE_HOURS = 24;
|
|
29
|
+
/**
|
|
30
|
+
* Resolve the promotion threshold (hours -> ms) from the typed, Zod-validated
|
|
31
|
+
* env-config -- the single declaration site for every operational knob
|
|
32
|
+
* (packages/daemon-core/src/env-config.ts). An unset value yields the schema
|
|
33
|
+
* default (DEFAULT_AGENT_RESOLVABLE_PROMOTE_HOURS); an invalid one fails loudly
|
|
34
|
+
* at startup rather than silently degrading to a default here.
|
|
35
|
+
*
|
|
36
|
+
* Same shape as resolveStuckBranchThresholdMs in merge-back-loop.ts.
|
|
37
|
+
*/
|
|
38
|
+
export declare function resolveAgentResolvablePromoteMs(env?: NodeJS.ProcessEnv): number;
|
|
39
|
+
/**
|
|
40
|
+
* Pure: split the open agent_resolvable filings into the ones that should still
|
|
41
|
+
* RIDE into this spawn and the ones that are past the age bound and should be
|
|
42
|
+
* PROMOTED to a human. A filing with an unparseable/absent createdAt is treated
|
|
43
|
+
* as fresh (ride) -- promotion must never fire on a missing timestamp.
|
|
44
|
+
*/
|
|
45
|
+
export declare function partitionAgentResolvableByAge(items: readonly AgentResolvableItem[], nowMs: number, thresholdMs: number): {
|
|
46
|
+
ride: AgentResolvableItem[];
|
|
47
|
+
promote: AgentResolvableItem[];
|
|
48
|
+
};
|
|
49
|
+
/** The cause key that makes a promotion refile idempotent (one per original filing). */
|
|
50
|
+
export declare function agentResolvablePromotionCauseKey(originalEscalationId: string): string;
|
|
51
|
+
/** escalation_kind for a promoted (formerly agent_resolvable) filing. */
|
|
52
|
+
export declare const AGENT_RESOLVABLE_PROMOTED_KIND = "agent_resolvable_promoted";
|
|
53
|
+
/**
|
|
54
|
+
* Pure: build the needs_operator refile params for a filing the machine could
|
|
55
|
+
* not resolve autonomously. Carries the original description + kind so the
|
|
56
|
+
* operator sees what was tried and why it now needs them; anchored to the focus.
|
|
57
|
+
*/
|
|
58
|
+
export declare function buildAgentResolvablePromotionParams(item: AgentResolvableItem, ctx: {
|
|
59
|
+
organizationId: string;
|
|
60
|
+
focusId: string;
|
|
61
|
+
productId?: string;
|
|
62
|
+
}, ageHours: number): FileEscalationIdempotentParams;
|
|
63
|
+
/** Injected IO for the promotion reconcile (real defaults; tests inject stubs). */
|
|
64
|
+
export interface AgentResolvablePromotionDeps {
|
|
65
|
+
listOpen: (focusId: string) => Promise<AgentResolvableItem[]>;
|
|
66
|
+
markResolved: (id: string, notes?: string) => Promise<void>;
|
|
67
|
+
file: (params: FileEscalationIdempotentParams) => Promise<FileEscalationIdempotentResult>;
|
|
68
|
+
now: () => number;
|
|
69
|
+
thresholdMs: number;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Reconcile a focus's open agent_resolvable filings and return the ones that
|
|
73
|
+
* should ride into THIS spawn. Over-age filings are promoted (needs_operator
|
|
74
|
+
* refile + resolve the source) so they leave the machine lane and reach the
|
|
75
|
+
* human inbox; the rest are returned to ride in as before.
|
|
76
|
+
*
|
|
77
|
+
* Best-effort per filing: a promotion failure is logged and the filing is left
|
|
78
|
+
* to ride (it will be retried next spawn), never thrown -- reconciling must never
|
|
79
|
+
* block a spawn. This is the single entry point the spawn path calls instead of
|
|
80
|
+
* listOpenAgentResolvableForFocus.
|
|
81
|
+
*/
|
|
82
|
+
export declare function reconcileAgentResolvableForFocus(ctx: {
|
|
83
|
+
organizationId: string;
|
|
84
|
+
focusId: string;
|
|
85
|
+
productId?: string;
|
|
86
|
+
}, deps?: Partial<AgentResolvablePromotionDeps>): Promise<AgentResolvableItem[]>;
|
|
87
|
+
//# sourceMappingURL=agent-resolvable-promotion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-resolvable-promotion.d.ts","sourceRoot":"","sources":["../../src/queries/agent-resolvable-promotion.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAOH,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,aAAa,CAAC;AACrB,OAAO,EAEL,KAAK,8BAA8B,EACnC,KAAK,8BAA8B,EACpC,MAAM,6BAA6B,CAAC;AAMrC,+EAA+E;AAC/E,eAAO,MAAM,sCAAsC,KAAK,CAAC;AAEzD;;;;;;;;GAQG;AACH,wBAAgB,+BAA+B,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAE5F;AAED;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,KAAK,EAAE,SAAS,mBAAmB,EAAE,EACrC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB;IAAE,IAAI,EAAE,mBAAmB,EAAE,CAAC;IAAC,OAAO,EAAE,mBAAmB,EAAE,CAAA;CAAE,CAYjE;AAED,wFAAwF;AACxF,wBAAgB,gCAAgC,CAAC,oBAAoB,EAAE,MAAM,GAAG,MAAM,CAErF;AAED,yEAAyE;AACzE,eAAO,MAAM,8BAA8B,8BAA8B,CAAC;AAE1E;;;;GAIG;AACH,wBAAgB,mCAAmC,CACjD,IAAI,EAAE,mBAAmB,EACzB,GAAG,EAAE;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EACpE,QAAQ,EAAE,MAAM,GACf,8BAA8B,CAiChC;AAED,mFAAmF;AACnF,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC9D,YAAY,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,IAAI,EAAE,CAAC,MAAM,EAAE,8BAA8B,KAAK,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC1F,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAYD;;;;;;;;;;GAUG;AACH,wBAAsB,gCAAgC,CACpD,GAAG,EAAE;IAAE,cAAc,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EACpE,IAAI,GAAE,OAAO,CAAC,4BAA4B,CAAM,GAC/C,OAAO,CAAC,mBAAmB,EAAE,CAAC,CA2BhC"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* agent_resolvable promotion safety net (delivery "agent_resolvable never
|
|
3
|
+
* reaches the human inbox", TEL-3).
|
|
4
|
+
*
|
|
5
|
+
* agent_resolvable filings are machine-owned: hidden from the operator inbox
|
|
6
|
+
* (TEL-1) and ridden into the focus's next coding spawn to be resolved (TEL-2).
|
|
7
|
+
* That is only safe if a filing the machine CANNOT actually clear eventually
|
|
8
|
+
* surfaces to a human -- otherwise it lingers forever, invisible. This module is
|
|
9
|
+
* that backstop: an agent_resolvable filing that has stayed open past a bound
|
|
10
|
+
* (it rode into many spawn cycles and none resolved it -- "bounded failures") is
|
|
11
|
+
* PROMOTED to a human by resolving the machine-routed row and refiling the same
|
|
12
|
+
* content as a needs_operator escalation, which the operator inbox DOES show.
|
|
13
|
+
*
|
|
14
|
+
* Why age, not a per-row attempt counter: escalation_update accepts only
|
|
15
|
+
* status/notes/answer (no disposition or metadata writes without a separate edge
|
|
16
|
+
* deploy), and there is no per-focus "sessions since T" query. Open-age is the
|
|
17
|
+
* deploy-safe, restart-safe, count-free proxy for "it survived N spawn cycles
|
|
18
|
+
* unresolved" -- every spawn that rode it in and exited without clearing it is a
|
|
19
|
+
* failed attempt, and those accumulate as elapsed open time.
|
|
20
|
+
*
|
|
21
|
+
* Promotion is idempotent: the needs_operator refile rides the shared cause-keyed
|
|
22
|
+
* gate keyed on the original escalation id, and the source row is resolved in the
|
|
23
|
+
* same step, so a filing is promoted at most once.
|
|
24
|
+
*/
|
|
25
|
+
import { ESCALATION_REASONS, ESCALATION_DISPOSITIONS, loadEnvConfig, } from '@telora/daemon-core';
|
|
26
|
+
import { markEscalationResolved as defaultMarkEscalationResolved, listOpenAgentResolvableForFocus as defaultListOpenAgentResolvableForFocus, } from './issues.js';
|
|
27
|
+
import { fileEscalationIdempotent as defaultFileEscalationIdempotent, } from './escalation-suppression.js';
|
|
28
|
+
import { computeCauseKey } from './cause-key.js';
|
|
29
|
+
import { createLogger } from '../log.js';
|
|
30
|
+
const log = createLogger({ module: 'escalations' });
|
|
31
|
+
/** Default hours an agent_resolvable filing may stay open before promotion. */
|
|
32
|
+
export const DEFAULT_AGENT_RESOLVABLE_PROMOTE_HOURS = 24;
|
|
33
|
+
/**
|
|
34
|
+
* Resolve the promotion threshold (hours -> ms) from the typed, Zod-validated
|
|
35
|
+
* env-config -- the single declaration site for every operational knob
|
|
36
|
+
* (packages/daemon-core/src/env-config.ts). An unset value yields the schema
|
|
37
|
+
* default (DEFAULT_AGENT_RESOLVABLE_PROMOTE_HOURS); an invalid one fails loudly
|
|
38
|
+
* at startup rather than silently degrading to a default here.
|
|
39
|
+
*
|
|
40
|
+
* Same shape as resolveStuckBranchThresholdMs in merge-back-loop.ts.
|
|
41
|
+
*/
|
|
42
|
+
export function resolveAgentResolvablePromoteMs(env = process.env) {
|
|
43
|
+
return loadEnvConfig(env).TELORA_AGENT_RESOLVABLE_PROMOTE_HOURS * 3_600_000;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Pure: split the open agent_resolvable filings into the ones that should still
|
|
47
|
+
* RIDE into this spawn and the ones that are past the age bound and should be
|
|
48
|
+
* PROMOTED to a human. A filing with an unparseable/absent createdAt is treated
|
|
49
|
+
* as fresh (ride) -- promotion must never fire on a missing timestamp.
|
|
50
|
+
*/
|
|
51
|
+
export function partitionAgentResolvableByAge(items, nowMs, thresholdMs) {
|
|
52
|
+
const ride = [];
|
|
53
|
+
const promote = [];
|
|
54
|
+
for (const item of items) {
|
|
55
|
+
const createdMs = Date.parse(item.createdAt);
|
|
56
|
+
if (Number.isNaN(createdMs) || nowMs - createdMs <= thresholdMs) {
|
|
57
|
+
ride.push(item);
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
promote.push(item);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return { ride, promote };
|
|
64
|
+
}
|
|
65
|
+
/** The cause key that makes a promotion refile idempotent (one per original filing). */
|
|
66
|
+
export function agentResolvablePromotionCauseKey(originalEscalationId) {
|
|
67
|
+
return computeCauseKey('agent_resolvable_promoted', { escalationId: originalEscalationId });
|
|
68
|
+
}
|
|
69
|
+
/** escalation_kind for a promoted (formerly agent_resolvable) filing. */
|
|
70
|
+
export const AGENT_RESOLVABLE_PROMOTED_KIND = 'agent_resolvable_promoted';
|
|
71
|
+
/**
|
|
72
|
+
* Pure: build the needs_operator refile params for a filing the machine could
|
|
73
|
+
* not resolve autonomously. Carries the original description + kind so the
|
|
74
|
+
* operator sees what was tried and why it now needs them; anchored to the focus.
|
|
75
|
+
*/
|
|
76
|
+
export function buildAgentResolvablePromotionParams(item, ctx, ageHours) {
|
|
77
|
+
const originalKind = item.escalationKind ?? 'agent_resolvable';
|
|
78
|
+
return {
|
|
79
|
+
causeKey: agentResolvablePromotionCauseKey(item.id),
|
|
80
|
+
organizationId: ctx.organizationId,
|
|
81
|
+
issueId: null,
|
|
82
|
+
reasonType: ESCALATION_REASONS.BLOCKED_BY_EXTERNAL,
|
|
83
|
+
// It was machine-routable, but the machine had ~ageHours of spawn cycles to
|
|
84
|
+
// clear it and did not -- a human must now take it.
|
|
85
|
+
disposition: ESCALATION_DISPOSITIONS.NEEDS_OPERATOR,
|
|
86
|
+
anchor: { focusId: ctx.focusId },
|
|
87
|
+
...(ctx.productId ? { productId: ctx.productId } : {}),
|
|
88
|
+
escalationKind: AGENT_RESOLVABLE_PROMOTED_KIND,
|
|
89
|
+
description: `A machine-routable (agent_resolvable) filing has stayed open ~${ageHours}h ` +
|
|
90
|
+
`without the daemon's spawns clearing it, so it is promoted to you.\n\n` +
|
|
91
|
+
`**Original kind:** ${originalKind}\n` +
|
|
92
|
+
`**Original filing:** ${item.id}\n\n` +
|
|
93
|
+
`${item.description}`,
|
|
94
|
+
whatWasTried: `The filing rode into the focus's coding spawns for ~${ageHours}h ` +
|
|
95
|
+
`(disposition agent_resolvable) but was never resolved, so the machine has ` +
|
|
96
|
+
`exhausted its autonomous attempts.`,
|
|
97
|
+
helpNeeded: `Resolve the underlying condition manually, or re-file with clearer intent if ` +
|
|
98
|
+
`the machine cannot act on it.`,
|
|
99
|
+
metadata: {
|
|
100
|
+
cause: AGENT_RESOLVABLE_PROMOTED_KIND,
|
|
101
|
+
originalEscalationId: item.id,
|
|
102
|
+
originalKind,
|
|
103
|
+
ageHours,
|
|
104
|
+
},
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function defaultDeps() {
|
|
108
|
+
return {
|
|
109
|
+
listOpen: defaultListOpenAgentResolvableForFocus,
|
|
110
|
+
markResolved: defaultMarkEscalationResolved,
|
|
111
|
+
file: defaultFileEscalationIdempotent,
|
|
112
|
+
now: () => Date.now(),
|
|
113
|
+
thresholdMs: resolveAgentResolvablePromoteMs(),
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Reconcile a focus's open agent_resolvable filings and return the ones that
|
|
118
|
+
* should ride into THIS spawn. Over-age filings are promoted (needs_operator
|
|
119
|
+
* refile + resolve the source) so they leave the machine lane and reach the
|
|
120
|
+
* human inbox; the rest are returned to ride in as before.
|
|
121
|
+
*
|
|
122
|
+
* Best-effort per filing: a promotion failure is logged and the filing is left
|
|
123
|
+
* to ride (it will be retried next spawn), never thrown -- reconciling must never
|
|
124
|
+
* block a spawn. This is the single entry point the spawn path calls instead of
|
|
125
|
+
* listOpenAgentResolvableForFocus.
|
|
126
|
+
*/
|
|
127
|
+
export async function reconcileAgentResolvableForFocus(ctx, deps = {}) {
|
|
128
|
+
const d = { ...defaultDeps(), ...deps };
|
|
129
|
+
const open = await d.listOpen(ctx.focusId);
|
|
130
|
+
const { ride, promote } = partitionAgentResolvableByAge(open, d.now(), d.thresholdMs);
|
|
131
|
+
for (const item of promote) {
|
|
132
|
+
const ageHours = Math.max(1, Math.floor((d.now() - Date.parse(item.createdAt)) / 3_600_000));
|
|
133
|
+
try {
|
|
134
|
+
const result = await d.file(buildAgentResolvablePromotionParams(item, ctx, ageHours));
|
|
135
|
+
// Only retire the machine-routed row once the human-facing refile is in
|
|
136
|
+
// place (filed OR already suppressed by a prior promotion) -- never resolve
|
|
137
|
+
// the source without a landing spot, which would drop the signal entirely.
|
|
138
|
+
if (result.filed || result.suppressed) {
|
|
139
|
+
await d.markResolved(item.id, `Promoted to a needs_operator escalation after ~${ageHours}h open without ` +
|
|
140
|
+
`autonomous resolution (agent_resolvable -> needs_operator).`);
|
|
141
|
+
log.info(`[escalations] Promoted agent_resolvable ${item.id} to needs_operator (focus ${ctx.focusId}, ~${ageHours}h)`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch (err) {
|
|
145
|
+
log.warn(`[escalations] Failed to promote agent_resolvable ${item.id} for focus ${ctx.focusId}: ${err.message}`);
|
|
146
|
+
// Leave it to ride this spawn; next reconcile retries the promotion.
|
|
147
|
+
ride.push(item);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return ride;
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=agent-resolvable-promotion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-resolvable-promotion.js","sourceRoot":"","sources":["../../src/queries/agent-resolvable-promotion.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic escalation cause keys (PURE, no I/O).
|
|
3
|
+
*
|
|
4
|
+
* An escalation's CAUSE KEY identifies the underlying cause a detector observed,
|
|
5
|
+
* derived from the escalation's kind plus its identifying SUBJECT. Two filings
|
|
6
|
+
* with the same cause key are about the same underlying fact; the idempotent
|
|
7
|
+
* filing gate (queries/escalation-suppression.ts) uses the key so one cause
|
|
8
|
+
* appears in the inbox at most once while unresolved, and a dismissed cause stays
|
|
9
|
+
* silent until its subject state actually changes.
|
|
10
|
+
*
|
|
11
|
+
* The key encodes the subject, so "the subject state changed" is expressed
|
|
12
|
+
* simply: a new subject (a new sha going red) yields a DIFFERENT key and re-files
|
|
13
|
+
* naturally, while the same subject (the same sha re-observed) yields the SAME
|
|
14
|
+
* key and is suppressed. This is what makes dismissal-memory fall out of a plain
|
|
15
|
+
* string comparison instead of a bespoke diff.
|
|
16
|
+
*
|
|
17
|
+
* Recipes (from the focus "An escalation is a verdict, not a log line"):
|
|
18
|
+
* - ci_run_red -> sha + branch
|
|
19
|
+
* - verify_gate_unclearable / verify_evidence_unavailable -> deliveryId + guard
|
|
20
|
+
* - stuck_focus_branch / wedged_focus (stuck/wedged detectors) -> focusId + blockage kind
|
|
21
|
+
* - team_failure (team-exit filings) -> focusId + session-exit marker
|
|
22
|
+
*/
|
|
23
|
+
/** A subject is a flat bag of identifying strings (nullable/undefined dropped). */
|
|
24
|
+
export type CauseKeySubject = Record<string, string | null | undefined>;
|
|
25
|
+
/**
|
|
26
|
+
* Compute a deterministic cause key from a kind + subject bag.
|
|
27
|
+
*
|
|
28
|
+
* Deterministic and order-insensitive: the subject entries are sorted by key, so
|
|
29
|
+
* `{sha, branch}` and `{branch, sha}` yield the same key. Null/undefined values
|
|
30
|
+
* are dropped (an absent subject field never changes the key vs. omitting it).
|
|
31
|
+
* Same (kind, subject) -> same key; any changed subject value -> different key.
|
|
32
|
+
*/
|
|
33
|
+
export declare function computeCauseKey(kind: string, subject: CauseKeySubject): string;
|
|
34
|
+
/** ci_run_red: keyed on the sha + branch the red CI run belongs to. */
|
|
35
|
+
export declare function ciRunRedCauseKey(sha: string, branch: string): string;
|
|
36
|
+
/**
|
|
37
|
+
* verify_gate_unclearable / verify_evidence_unavailable and any other
|
|
38
|
+
* delivery+guard detector: keyed on the delivery and (optionally) the blocking
|
|
39
|
+
* guard. Omit `guard` for a strictly PER-DELIVERY key: both stall detectors file
|
|
40
|
+
* at most one open row per delivery regardless of which guard is blocking, so
|
|
41
|
+
* they key on the delivery alone (a per-guard key would let a guard-name change
|
|
42
|
+
* re-file). Detectors that genuinely differ by guard pass it through.
|
|
43
|
+
*/
|
|
44
|
+
export declare function deliveryGuardCauseKey(kind: string, deliveryId: string, guard?: string): string;
|
|
45
|
+
/**
|
|
46
|
+
* stuck/wedged focus detectors (stuck_focus_branch, wedged_focus, ...): keyed on
|
|
47
|
+
* the focus and the kind of blockage observed.
|
|
48
|
+
*/
|
|
49
|
+
export declare function focusBlockageCauseKey(kind: string, focusId: string, blockage: string): string;
|
|
50
|
+
/**
|
|
51
|
+
* team-exit filings (team_failure): keyed on the focus and a session-exit marker
|
|
52
|
+
* so one blocked team exit collapses to a single cause key regardless of how many
|
|
53
|
+
* partial filings a team attempts (the burst pattern).
|
|
54
|
+
*/
|
|
55
|
+
export declare function teamExitCauseKey(focusId: string, sessionExit: string): string;
|
|
56
|
+
/**
|
|
57
|
+
* daemon-staleness handover (propagation_stale): keyed on the specific version
|
|
58
|
+
* gap (running + newest). A per-daemon singleton signal -- one running version --
|
|
59
|
+
* so it needs no product/focus in the key. A dismissal silences THIS exact gap;
|
|
60
|
+
* when `newest` advances (a different gap) it re-files, and a catch-up simply
|
|
61
|
+
* stops the signal (auto-resolved).
|
|
62
|
+
*/
|
|
63
|
+
export declare function daemonStalenessCauseKey(running: string, newest: string): string;
|
|
64
|
+
//# sourceMappingURL=cause-key.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cause-key.d.ts","sourceRoot":"","sources":["../../src/queries/cause-key.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,mFAAmF;AACnF,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;AAExE;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,MAAM,CAM9E;AAID,uEAAuE;AACvE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAEpE;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAE9F;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE7F;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE/E"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deterministic escalation cause keys (PURE, no I/O).
|
|
3
|
+
*
|
|
4
|
+
* An escalation's CAUSE KEY identifies the underlying cause a detector observed,
|
|
5
|
+
* derived from the escalation's kind plus its identifying SUBJECT. Two filings
|
|
6
|
+
* with the same cause key are about the same underlying fact; the idempotent
|
|
7
|
+
* filing gate (queries/escalation-suppression.ts) uses the key so one cause
|
|
8
|
+
* appears in the inbox at most once while unresolved, and a dismissed cause stays
|
|
9
|
+
* silent until its subject state actually changes.
|
|
10
|
+
*
|
|
11
|
+
* The key encodes the subject, so "the subject state changed" is expressed
|
|
12
|
+
* simply: a new subject (a new sha going red) yields a DIFFERENT key and re-files
|
|
13
|
+
* naturally, while the same subject (the same sha re-observed) yields the SAME
|
|
14
|
+
* key and is suppressed. This is what makes dismissal-memory fall out of a plain
|
|
15
|
+
* string comparison instead of a bespoke diff.
|
|
16
|
+
*
|
|
17
|
+
* Recipes (from the focus "An escalation is a verdict, not a log line"):
|
|
18
|
+
* - ci_run_red -> sha + branch
|
|
19
|
+
* - verify_gate_unclearable / verify_evidence_unavailable -> deliveryId + guard
|
|
20
|
+
* - stuck_focus_branch / wedged_focus (stuck/wedged detectors) -> focusId + blockage kind
|
|
21
|
+
* - team_failure (team-exit filings) -> focusId + session-exit marker
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* Compute a deterministic cause key from a kind + subject bag.
|
|
25
|
+
*
|
|
26
|
+
* Deterministic and order-insensitive: the subject entries are sorted by key, so
|
|
27
|
+
* `{sha, branch}` and `{branch, sha}` yield the same key. Null/undefined values
|
|
28
|
+
* are dropped (an absent subject field never changes the key vs. omitting it).
|
|
29
|
+
* Same (kind, subject) -> same key; any changed subject value -> different key.
|
|
30
|
+
*/
|
|
31
|
+
export function computeCauseKey(kind, subject) {
|
|
32
|
+
const parts = Object.entries(subject)
|
|
33
|
+
.filter(([, v]) => v !== null && v !== undefined && v !== '')
|
|
34
|
+
.map(([k, v]) => `${k}=${v}`)
|
|
35
|
+
.sort();
|
|
36
|
+
return `${kind}::${parts.join('|')}`;
|
|
37
|
+
}
|
|
38
|
+
// ── Named recipes (one per detector family) ──────────────────────────
|
|
39
|
+
/** ci_run_red: keyed on the sha + branch the red CI run belongs to. */
|
|
40
|
+
export function ciRunRedCauseKey(sha, branch) {
|
|
41
|
+
return computeCauseKey('ci_run_red', { sha, branch });
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* verify_gate_unclearable / verify_evidence_unavailable and any other
|
|
45
|
+
* delivery+guard detector: keyed on the delivery and (optionally) the blocking
|
|
46
|
+
* guard. Omit `guard` for a strictly PER-DELIVERY key: both stall detectors file
|
|
47
|
+
* at most one open row per delivery regardless of which guard is blocking, so
|
|
48
|
+
* they key on the delivery alone (a per-guard key would let a guard-name change
|
|
49
|
+
* re-file). Detectors that genuinely differ by guard pass it through.
|
|
50
|
+
*/
|
|
51
|
+
export function deliveryGuardCauseKey(kind, deliveryId, guard) {
|
|
52
|
+
return computeCauseKey(kind, { deliveryId, guard });
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* stuck/wedged focus detectors (stuck_focus_branch, wedged_focus, ...): keyed on
|
|
56
|
+
* the focus and the kind of blockage observed.
|
|
57
|
+
*/
|
|
58
|
+
export function focusBlockageCauseKey(kind, focusId, blockage) {
|
|
59
|
+
return computeCauseKey(kind, { focusId, blockage });
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* team-exit filings (team_failure): keyed on the focus and a session-exit marker
|
|
63
|
+
* so one blocked team exit collapses to a single cause key regardless of how many
|
|
64
|
+
* partial filings a team attempts (the burst pattern).
|
|
65
|
+
*/
|
|
66
|
+
export function teamExitCauseKey(focusId, sessionExit) {
|
|
67
|
+
return computeCauseKey('team_failure', { focusId, sessionExit });
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* daemon-staleness handover (propagation_stale): keyed on the specific version
|
|
71
|
+
* gap (running + newest). A per-daemon singleton signal -- one running version --
|
|
72
|
+
* so it needs no product/focus in the key. A dismissal silences THIS exact gap;
|
|
73
|
+
* when `newest` advances (a different gap) it re-files, and a catch-up simply
|
|
74
|
+
* stops the signal (auto-resolved).
|
|
75
|
+
*/
|
|
76
|
+
export function daemonStalenessCauseKey(running, newest) {
|
|
77
|
+
return computeCauseKey('propagation_stale', { running, newest });
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=cause-key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cause-key.js","sourceRoot":"","sources":["../../src/queries/cause-key.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAKH;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,OAAwB;IACpE,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;SAClC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE,CAAC;SAC5D,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;SAC5B,IAAI,EAAE,CAAC;IACV,OAAO,GAAG,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACvC,CAAC;AAED,wEAAwE;AAExE,uEAAuE;AACvE,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,MAAc;IAC1D,OAAO,eAAe,CAAC,YAAY,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;AACxD,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,UAAkB,EAAE,KAAc;IACpF,OAAO,eAAe,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;AACtD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,OAAe,EAAE,QAAgB;IACnF,OAAO,eAAe,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;AACtD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,EAAE,WAAmB;IACnE,OAAO,eAAe,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;AACnE,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAe,EAAE,MAAc;IACrE,OAAO,eAAe,CAAC,mBAAmB,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -23,160 +23,12 @@ export declare function getReadyDeliveries(_organizationId: string, productId?:
|
|
|
23
23
|
*/
|
|
24
24
|
export declare function getDeliveryContext(deliveryId: string): Promise<DeliveryContext | null>;
|
|
25
25
|
/**
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
29
|
-
* "Waiting on", live-session inject, and the requeue/respawn prompt -- can
|
|
30
|
-
* surface WHAT failed and WHERE to read it, without a cold re-run.
|
|
26
|
+
* The gate_state vocabulary -- DeliveryGateState and its per-origin detail
|
|
27
|
+
* records -- lives in queries/delivery-gate-state.ts. Re-exported here so the
|
|
28
|
+
* many modules that reach these through queries/deliveries.js keep resolving.
|
|
31
29
|
*/
|
|
32
|
-
export
|
|
33
|
-
|
|
34
|
-
* Failing-test ids that GATE this delivery. When baseline-diff attribution ran,
|
|
35
|
-
* these are the NEW failures the focus introduced; otherwise all parsed failures.
|
|
36
|
-
*/
|
|
37
|
-
failingTests: string[];
|
|
38
|
-
/**
|
|
39
|
-
* Failing tests that pre-exist on the focus base -- recorded, non-blocking
|
|
40
|
-
* (they do not gate the focus). Absent when attribution did not run.
|
|
41
|
-
*/
|
|
42
|
-
preExisting?: string[];
|
|
43
|
-
/** Absolute path to the persistent full-log file, or null when none was written. */
|
|
44
|
-
logPath: string | null;
|
|
45
|
-
/** Process exit code of the failed run, or null. */
|
|
46
|
-
exitCode: number | null;
|
|
47
|
-
/** ISO timestamp of the failing run. */
|
|
48
|
-
failedAt: string;
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Detail attached to gate_state when the verify-shortfall RECONCILIATION (not a
|
|
52
|
-
* deterministic shell run) holds the flip: the achieved outcome fell short of
|
|
53
|
-
* the declared desired effect for one or more targeted nodes. Distinct from
|
|
54
|
-
* VerificationFailureDetail on purpose -- a shortfall hold has no exitCode /
|
|
55
|
-
* failingTests (the deterministic check may well have passed), it has a
|
|
56
|
-
* declared-vs-achieved gap. Keeping it under its own key prevents a reader from
|
|
57
|
-
* seeing a passed:false deterministic_verification whose exitCode is 0.
|
|
58
|
-
*/
|
|
59
|
-
export interface ShortfallReconciliationDetail {
|
|
60
|
-
/** ISO timestamp of the reconciliation that held the gate. */
|
|
61
|
-
heldAt: string;
|
|
62
|
-
/** The per-target declared/achieved/reason gaps that withheld the flip. */
|
|
63
|
-
shortfalls: Array<{
|
|
64
|
-
nodeId: string;
|
|
65
|
-
declared: string;
|
|
66
|
-
achieved: string;
|
|
67
|
-
reason: string;
|
|
68
|
-
/** The diff evidence grounding the shortfall, when the judge cited one. */
|
|
69
|
-
diffCitation?: string;
|
|
70
|
-
}>;
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Detail attached to gate_state when the verify path was handed NO evidence it
|
|
74
|
-
* could judge the work against (no diff, no changed-files, no inspection
|
|
75
|
-
* finding) -- an INSTRUMENT FAULT, not a verdict about the work. Distinct from
|
|
76
|
-
* VerificationFailureDetail (a shell command failed) and from
|
|
77
|
-
* ShortfallReconciliationDetail (the work fell short of intent): here the
|
|
78
|
-
* reconciliation is BLIND, so it must not render any verdict. The delivery is
|
|
79
|
-
* held in `verify` (never routed to verify_failed, so no iteration is
|
|
80
|
-
* consumed) and a first-occurrence escalation names the missing evidence.
|
|
81
|
-
*/
|
|
82
|
-
export interface EvidenceUnavailableDetail {
|
|
83
|
-
/** ISO timestamp the instrument-fault hold was recorded. */
|
|
84
|
-
heldAt: string;
|
|
85
|
-
/** Which evidence slots were empty (named, so the hold describes the fault, not the work). */
|
|
86
|
-
missing: string[];
|
|
87
|
-
/**
|
|
88
|
-
* Commits the delivery branch is ahead of the integration base. 0 => the
|
|
89
|
-
* branch already merged / did no work; > 0 => a broken diff MEASUREMENT
|
|
90
|
-
* (commits present but the diff resolved empty). Carried for operator triage.
|
|
91
|
-
*/
|
|
92
|
-
commitsAhead: number;
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Shape written into product_deliveries.gate_state when guard evaluation
|
|
96
|
-
* blocks a stage transition. Cleared (set to null) when guards pass.
|
|
97
|
-
*
|
|
98
|
-
* `verification` is populated when the block is a daemon-side deterministic
|
|
99
|
-
* verification failure (Harness-Owned Delivery Verification), carrying the
|
|
100
|
-
* failing tests + log path for the feedback loop; absent for guard-only gates.
|
|
101
|
-
*
|
|
102
|
-
* `shortfallReconciliation` is populated when the block is a verify-shortfall
|
|
103
|
-
* reconciliation hold (declared-vs-achieved gap), NOT a deterministic run; the
|
|
104
|
-
* two are mutually exclusive origins and never share the deterministic guard.
|
|
105
|
-
*/
|
|
106
|
-
export interface DeliveryGateState {
|
|
107
|
-
blocking: Array<{
|
|
108
|
-
guardName: string;
|
|
109
|
-
passed: boolean;
|
|
110
|
-
}>;
|
|
111
|
-
warnings: Array<{
|
|
112
|
-
guardName: string;
|
|
113
|
-
passed: boolean;
|
|
114
|
-
}>;
|
|
115
|
-
evaluatedAt: string;
|
|
116
|
-
verification?: VerificationFailureDetail;
|
|
117
|
-
shortfallReconciliation?: ShortfallReconciliationDetail;
|
|
118
|
-
/**
|
|
119
|
-
* Populated when the verify path was handed no evidence it could judge the
|
|
120
|
-
* work against (an instrument fault). Kept under its own key -- never
|
|
121
|
-
* conflated with `verification` (a shell failure) or `shortfallReconciliation`
|
|
122
|
-
* (a work shortfall) -- so a reader can tell "the gate was blind" from "the
|
|
123
|
-
* work fell short". The blocking guard is `verify_evidence_unavailable`.
|
|
124
|
-
*/
|
|
125
|
-
evidenceUnavailable?: EvidenceUnavailableDetail;
|
|
126
|
-
/**
|
|
127
|
-
* Undisposed shortfall drift proposal ids holding this delivery in verify.
|
|
128
|
-
*
|
|
129
|
-
* Kept OUT of `blocking` on purpose: that array is guard-verdict data
|
|
130
|
-
* (guardName + passed), and a shortfall hold is not a guard. Synthesizing a
|
|
131
|
-
* fake guardName to smuggle the ids through would make `blocking` lie about
|
|
132
|
-
* what a guard is. `formatGateBlockers` is the single place that merges the
|
|
133
|
-
* two for display.
|
|
134
|
-
*
|
|
135
|
-
* Absent for guard-only gates. Written by the review-exit shortfall hold and
|
|
136
|
-
* cleared, like the rest of gate_state, when the delivery finally routes.
|
|
137
|
-
*/
|
|
138
|
-
shortfallProposalIds?: string[];
|
|
139
|
-
/**
|
|
140
|
-
* The open operator-blocked escalation (disposition needs_operator /
|
|
141
|
-
* external_wait, any kind) holding this delivery in verify. Written by the
|
|
142
|
-
* operator-hold gate (operator-hold.ts) so the board can name what the
|
|
143
|
-
* delivery is waiting on without a second escalation being filed; cleared,
|
|
144
|
-
* like the rest of gate_state, when the delivery finally routes. When the hold
|
|
145
|
-
* read itself failed (fail-closed), escalationId is null and readFailed is
|
|
146
|
-
* true -- the delivery is still held, just without a specific escalation to
|
|
147
|
-
* name. Like shortfallProposalIds, kept OUT of `blocking` (a hold is not a
|
|
148
|
-
* guard verdict).
|
|
149
|
-
*/
|
|
150
|
-
operatorHold?: {
|
|
151
|
-
escalationId: string | null;
|
|
152
|
-
escalationKind: string | null;
|
|
153
|
-
disposition: string | null;
|
|
154
|
-
readFailed?: boolean;
|
|
155
|
-
};
|
|
156
|
-
/**
|
|
157
|
-
* An irreducibly-external dependency holding this delivery in verify, carried
|
|
158
|
-
* as durable STATE rather than an agent_escalations row (external-hold.ts).
|
|
159
|
-
* The blocking condition and what would clear it live here, attached to the
|
|
160
|
-
* delivery they block; the hold clears by re-evaluating that condition (a
|
|
161
|
-
* re-read of reality), not by a human resolving an inbox item. Kept OUT of
|
|
162
|
-
* `blocking` for the same reason as operatorHold/shortfallProposalIds: a hold
|
|
163
|
-
* is not a guard verdict. Cleared, like the rest of gate_state, when the
|
|
164
|
-
* delivery finally routes.
|
|
165
|
-
*/
|
|
166
|
-
externalHold?: ExternalHoldState;
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* The durable external-hold state on a delivery's gate_state. Distinct from an
|
|
170
|
-
* agent_escalations row: an external dependency is state, not an inbox event.
|
|
171
|
-
*/
|
|
172
|
-
export interface ExternalHoldState {
|
|
173
|
-
/** What is blocking -- the irreducibly-external dependency. */
|
|
174
|
-
condition: string;
|
|
175
|
-
/** The condition that, when re-read as true, clears the hold. */
|
|
176
|
-
clearsWhen: string;
|
|
177
|
-
/** ISO timestamp the hold was declared. */
|
|
178
|
-
declaredAt: string;
|
|
179
|
-
}
|
|
30
|
+
export type { VerificationFailureDetail, ShortfallReconciliationDetail, EvidenceUnavailableDetail, DeliveryGateState, ExternalHoldState, } from './delivery-gate-state.js';
|
|
31
|
+
import type { DeliveryGateState } from './delivery-gate-state.js';
|
|
180
32
|
/**
|
|
181
33
|
* Optional metadata that lets updateDeliveryStatus append a delivery_transitions
|
|
182
34
|
* row alongside the status change. The daemon is the single owner of delivery
|
|
@@ -425,6 +277,21 @@ export declare function recordFocusMerge(params: {
|
|
|
425
277
|
commitShas: string[];
|
|
426
278
|
branchName: string;
|
|
427
279
|
}): Promise<void>;
|
|
280
|
+
/**
|
|
281
|
+
* Fetch the RECORDED constituent commit shas for a delivery's merge, keyed by
|
|
282
|
+
* the merge_commit_sha the delivery row carries.
|
|
283
|
+
*
|
|
284
|
+
* Reads focus_merges (via focus_merge_list) -- the durable record the daemon
|
|
285
|
+
* wrote at merge time (extractConstituentCommits -> recordFocusMerge) -- and
|
|
286
|
+
* returns the commit_shas of the row whose merge_commit_sha matches. This is the
|
|
287
|
+
* exact attribution, immune to the fast-forward + rebase failures that corrupt a
|
|
288
|
+
* range re-derived from live branch topology at verify time.
|
|
289
|
+
*
|
|
290
|
+
* Returns [] when the focus/merge is unknown or the API action is unavailable
|
|
291
|
+
* (best-effort): the verify diff resolver then falls through to its
|
|
292
|
+
* live-topology sources rather than blocking.
|
|
293
|
+
*/
|
|
294
|
+
export declare function getRecordedCommitShasForMerge(focusId: string, mergeCommitSha: string): Promise<string[]>;
|
|
428
295
|
/**
|
|
429
296
|
* Report a git lifecycle state transition for a delivery.
|
|
430
297
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deliveries.d.ts","sourceRoot":"","sources":["../../src/queries/deliveries.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAY,eAAe,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAiChE;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,eAAe,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IACnG,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC,CAAC,CAeF;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAkB5F;AAED
|
|
1
|
+
{"version":3,"file":"deliveries.d.ts","sourceRoot":"","sources":["../../src/queries/deliveries.ts"],"names":[],"mappings":"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"}
|