audit-tools 0.34.28 → 0.34.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -11
- package/dist/audit/cli/args.d.ts +2 -2
- package/dist/audit/cli/args.d.ts.map +1 -1
- package/dist/audit/cli/args.js.map +1 -1
- package/dist/audit/cli/dispatch/paths.d.ts.map +1 -1
- package/dist/audit/cli/dispatch/paths.js +3 -9
- package/dist/audit/cli/dispatch/paths.js.map +1 -1
- package/dist/audit/cli/nextStepCommand.d.ts.map +1 -1
- package/dist/audit/cli/nextStepCommand.js +24 -1
- package/dist/audit/cli/nextStepCommand.js.map +1 -1
- package/dist/audit/cli/providerConfirmationStep.d.ts +13 -0
- package/dist/audit/cli/providerConfirmationStep.d.ts.map +1 -1
- package/dist/audit/cli/providerConfirmationStep.js +43 -7
- package/dist/audit/cli/providerConfirmationStep.js.map +1 -1
- package/dist/audit/extractors/analyzers/typescript.d.ts.map +1 -1
- package/dist/audit/extractors/analyzers/typescript.js +3 -2
- package/dist/audit/extractors/analyzers/typescript.js.map +1 -1
- package/dist/audit/extractors/graph.d.ts.map +1 -1
- package/dist/audit/extractors/graph.js +4 -5
- package/dist/audit/extractors/graph.js.map +1 -1
- package/dist/audit/io/artifacts.d.ts +1 -12
- package/dist/audit/io/artifacts.d.ts.map +1 -1
- package/dist/audit/io/artifacts.js +9 -39
- package/dist/audit/io/artifacts.js.map +1 -1
- package/dist/audit/orchestrator/designReviewSnapshot.d.ts.map +1 -1
- package/dist/audit/orchestrator/designReviewSnapshot.js +4 -2
- package/dist/audit/orchestrator/designReviewSnapshot.js.map +1 -1
- package/dist/audit/orchestrator/intakeExecutors.d.ts.map +1 -1
- package/dist/audit/orchestrator/intakeExecutors.js +59 -3
- package/dist/audit/orchestrator/intakeExecutors.js.map +1 -1
- package/dist/remediate/contractPipeline/reviewSnapshot.d.ts +8 -0
- package/dist/remediate/contractPipeline/reviewSnapshot.d.ts.map +1 -1
- package/dist/remediate/contractPipeline/reviewSnapshot.js +10 -2
- package/dist/remediate/contractPipeline/reviewSnapshot.js.map +1 -1
- package/dist/remediate/contractPipeline/testPlanCarry.d.ts +7 -1
- package/dist/remediate/contractPipeline/testPlanCarry.d.ts.map +1 -1
- package/dist/remediate/contractPipeline/testPlanCarry.js +9 -3
- package/dist/remediate/contractPipeline/testPlanCarry.js.map +1 -1
- package/dist/remediate/phases/close.d.ts.map +1 -1
- package/dist/remediate/phases/close.js +10 -8
- package/dist/remediate/phases/close.js.map +1 -1
- package/dist/remediate/phases/plan.js +2 -2
- package/dist/remediate/phases/plan.js.map +1 -1
- package/dist/remediate/riskSignal.d.ts.map +1 -1
- package/dist/remediate/riskSignal.js +5 -2
- package/dist/remediate/riskSignal.js.map +1 -1
- package/dist/remediate/state/itemStatus.d.ts +26 -3
- package/dist/remediate/state/itemStatus.d.ts.map +1 -1
- package/dist/remediate/state/itemStatus.js +56 -18
- package/dist/remediate/state/itemStatus.js.map +1 -1
- package/dist/remediate/state/store.d.ts.map +1 -1
- package/dist/remediate/state/store.js +18 -0
- package/dist/remediate/state/store.js.map +1 -1
- package/dist/remediate/state/types.d.ts +18 -42
- package/dist/remediate/state/types.d.ts.map +1 -1
- package/dist/remediate/state/types.js +5 -3
- package/dist/remediate/state/types.js.map +1 -1
- package/dist/remediate/steps/contractPipeline.d.ts +1 -1
- package/dist/remediate/steps/contractPipeline.d.ts.map +1 -1
- package/dist/remediate/steps/contractPipeline.js +7 -1
- package/dist/remediate/steps/contractPipeline.js.map +1 -1
- package/dist/remediate/steps/dispatch/marshal.d.ts.map +1 -1
- package/dist/remediate/steps/dispatch/marshal.js +16 -11
- package/dist/remediate/steps/dispatch/marshal.js.map +1 -1
- package/dist/remediate/steps/dispatch/worktreeLifecycle.d.ts.map +1 -1
- package/dist/remediate/steps/dispatch/worktreeLifecycle.js +10 -7
- package/dist/remediate/steps/dispatch/worktreeLifecycle.js.map +1 -1
- package/dist/remediate/steps/finalGate.d.ts.map +1 -1
- package/dist/remediate/steps/finalGate.js +11 -4
- package/dist/remediate/steps/finalGate.js.map +1 -1
- package/dist/remediate/steps/nextStep.d.ts.map +1 -1
- package/dist/remediate/steps/nextStep.js +111 -20
- package/dist/remediate/steps/nextStep.js.map +1 -1
- package/dist/remediate/steps/stepUtils.d.ts +23 -0
- package/dist/remediate/steps/stepUtils.d.ts.map +1 -1
- package/dist/remediate/steps/stepUtils.js +55 -1
- package/dist/remediate/steps/stepUtils.js.map +1 -1
- package/dist/shared/constitutionalDocPaths.d.ts +13 -0
- package/dist/shared/constitutionalDocPaths.d.ts.map +1 -0
- package/dist/shared/constitutionalDocPaths.js +73 -0
- package/dist/shared/constitutionalDocPaths.js.map +1 -0
- package/dist/shared/dispatch/coordinator.d.ts +19 -0
- package/dist/shared/dispatch/coordinator.d.ts.map +1 -1
- package/dist/shared/dispatch/coordinator.js +34 -0
- package/dist/shared/dispatch/coordinator.js.map +1 -1
- package/dist/shared/dispatch/hybridDispatch.d.ts +10 -0
- package/dist/shared/dispatch/hybridDispatch.d.ts.map +1 -1
- package/dist/shared/dispatch/hybridDispatch.js +1 -1
- package/dist/shared/dispatch/hybridDispatch.js.map +1 -1
- package/dist/shared/dispatch/rollingDispatch.d.ts +14 -0
- package/dist/shared/dispatch/rollingDispatch.d.ts.map +1 -1
- package/dist/shared/dispatch/rollingDispatch.js +44 -3
- package/dist/shared/dispatch/rollingDispatch.js.map +1 -1
- package/dist/shared/index.d.ts +5 -2
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +8 -1
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/io/frictionCapture.d.ts.map +1 -1
- package/dist/shared/io/frictionCapture.js +6 -1
- package/dist/shared/io/frictionCapture.js.map +1 -1
- package/dist/shared/io/pathContainment.d.ts +46 -0
- package/dist/shared/io/pathContainment.d.ts.map +1 -0
- package/dist/shared/io/pathContainment.js +40 -0
- package/dist/shared/io/pathContainment.js.map +1 -0
- package/dist/shared/io/schemaVersion.d.ts +67 -0
- package/dist/shared/io/schemaVersion.d.ts.map +1 -0
- package/dist/shared/io/schemaVersion.js +87 -0
- package/dist/shared/io/schemaVersion.js.map +1 -0
- package/dist/shared/providers/auditorSources.d.ts +9 -1
- package/dist/shared/providers/auditorSources.d.ts.map +1 -1
- package/dist/shared/providers/auditorSources.js +46 -2
- package/dist/shared/providers/auditorSources.js.map +1 -1
- package/dist/shared/providers/claudeWorkerProvider.d.ts +0 -1
- package/dist/shared/providers/claudeWorkerProvider.d.ts.map +1 -1
- package/dist/shared/providers/claudeWorkerProvider.js +4 -2
- package/dist/shared/providers/claudeWorkerProvider.js.map +1 -1
- package/dist/shared/providers/openAiCompatibleProvider.d.ts.map +1 -1
- package/dist/shared/providers/openAiCompatibleProvider.js +5 -9
- package/dist/shared/providers/openAiCompatibleProvider.js.map +1 -1
- package/dist/shared/providers/sharedProviderConfirmation.d.ts +42 -1
- package/dist/shared/providers/sharedProviderConfirmation.d.ts.map +1 -1
- package/dist/shared/providers/sharedProviderConfirmation.js +197 -3
- package/dist/shared/providers/sharedProviderConfirmation.js.map +1 -1
- package/dist/shared/quota/coverage.js +1 -1
- package/dist/shared/repair/brokeredDispatch.d.ts.map +1 -1
- package/dist/shared/repair/brokeredDispatch.js +10 -48
- package/dist/shared/repair/brokeredDispatch.js.map +1 -1
- package/dist/shared/types/auditorDescriptor.d.ts +8 -2
- package/dist/shared/types/auditorDescriptor.d.ts.map +1 -1
- package/dist/shared/types/auditorDescriptor.js.map +1 -1
- package/dist/shared/types/sessionConfig.d.ts +25 -1
- package/dist/shared/types/sessionConfig.d.ts.map +1 -1
- package/dist/shared/types/sessionConfig.js +4 -0
- package/dist/shared/types/sessionConfig.js.map +1 -1
- package/docs/audit-pkg/operator-guide.md +19 -9
- package/docs/audit-pkg/release.md +4 -0
- package/package.json +10 -3
- package/dist/remediate/coverage/findingLedger.d.ts +0 -99
- package/dist/remediate/coverage/findingLedger.d.ts.map +0 -1
- package/dist/remediate/coverage/findingLedger.js +0 -110
- package/dist/remediate/coverage/findingLedger.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isTerminalStatus, isVerifiedCompleteStatus } from "../state/itemStatus.js";
|
|
1
|
+
import { isInProgressStatus, isTerminalStatus, isVerifiedCompleteStatus, } from "../state/itemStatus.js";
|
|
2
2
|
export const NO_CHANGE_RE = /\b(already correct|no.?op|no change|nothing to (change|do|fix)|code is correct)\b/i;
|
|
3
3
|
/**
|
|
4
4
|
* A block is ready to implement only once every dependency block is fully
|
|
@@ -48,6 +48,60 @@ export function dependencyVerifiedComplete(block, state) {
|
|
|
48
48
|
}
|
|
49
49
|
return true;
|
|
50
50
|
}
|
|
51
|
+
/**
|
|
52
|
+
* Whether every unsatisfied dependency edge of `block` traces to an item that is
|
|
53
|
+
* merely AWAITING A CLARIFICATION ANSWER, rather than to one that genuinely
|
|
54
|
+
* failed. This is the discriminator the dead-end sweep needs.
|
|
55
|
+
*
|
|
56
|
+
* {@link dependencyVerifiedComplete} answers only "may this node dispatch NOW",
|
|
57
|
+
* and a `needs_clarification` prerequisite fails it exactly the way a skipped or
|
|
58
|
+
* blocked one does. Conflating them is safe only while an unanswered question
|
|
59
|
+
* freezes the entire run. Once the question is DEFERRED to the end of the
|
|
60
|
+
* implement phase (so siblings keep working), the dead-end sweep reaches the
|
|
61
|
+
* dependents of an unanswered question and would mark them `blocked` — silently
|
|
62
|
+
* converting "awaiting an answer" into "upstream failed", a worse bug than the
|
|
63
|
+
* freeze. A node this predicate accepts is left `pending` instead and re-decided
|
|
64
|
+
* after the batched clarification round: an answer that re-opens the upstream
|
|
65
|
+
* makes the node eligible; an answer that disposes the upstream (a SKIP) makes
|
|
66
|
+
* this predicate false, so the ordinary sweep dead-ends the node then, with the
|
|
67
|
+
* accurate reason.
|
|
68
|
+
*
|
|
69
|
+
* Transitive, because the hold propagates down a chain (A→B→C with C awaiting
|
|
70
|
+
* leaves both B and A held), and cycle-guarded, so a cyclic edge is never
|
|
71
|
+
* reported as awaiting and still dead-ends exactly as it does today.
|
|
72
|
+
*/
|
|
73
|
+
export function dependencyAwaitingClarification(block, state, seen = new Set()) {
|
|
74
|
+
if (seen.has(block.block_id))
|
|
75
|
+
return false; // cycle: not awaiting, dead-end it
|
|
76
|
+
const guard = new Set(seen).add(block.block_id);
|
|
77
|
+
let awaiting = false;
|
|
78
|
+
for (const depId of block.dependencies ?? []) {
|
|
79
|
+
const depBlock = state.plan?.blocks.find((b) => b.block_id === depId);
|
|
80
|
+
if (!depBlock)
|
|
81
|
+
continue; // dangling edge: never waited on (mirrors the predicates above)
|
|
82
|
+
for (const findingId of depBlock.items) {
|
|
83
|
+
const status = state.items?.[findingId]?.status;
|
|
84
|
+
if (isVerifiedCompleteStatus(status))
|
|
85
|
+
continue; // this edge is satisfied
|
|
86
|
+
if (status === "needs_clarification") {
|
|
87
|
+
awaiting = true;
|
|
88
|
+
continue;
|
|
89
|
+
}
|
|
90
|
+
// A dependency still mid-flight counts as awaiting only when IT is itself
|
|
91
|
+
// held by a question further upstream. Anything else — blocked, a SKIP, a
|
|
92
|
+
// missing item, an eligible-but-undispatched node — is not an awaited
|
|
93
|
+
// answer, so the node is left to the ordinary dead-end sweep.
|
|
94
|
+
if (status !== undefined &&
|
|
95
|
+
isInProgressStatus(status) &&
|
|
96
|
+
dependencyAwaitingClarification(depBlock, state, guard)) {
|
|
97
|
+
awaiting = true;
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return awaiting;
|
|
104
|
+
}
|
|
51
105
|
/**
|
|
52
106
|
* Decide whether an item spec represents a no-op (no source changes planned).
|
|
53
107
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stepUtils.js","sourceRoot":"","sources":["../../../src/remediate/steps/stepUtils.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"stepUtils.js","sourceRoot":"","sources":["../../../src/remediate/steps/stepUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The canonical constitutional doc path list. Exact repo-relative paths, sorted
|
|
3
|
+
* by content (path-sort) so the serialized order is stable and the parity
|
|
4
|
+
* comparison is deterministic.
|
|
5
|
+
*/
|
|
6
|
+
export declare const CONSTITUTIONAL_DOC_PATHS: readonly string[];
|
|
7
|
+
/**
|
|
8
|
+
* Whether a repo-relative path names a constitutional doc. Exact match only —
|
|
9
|
+
* a doc is constitutional because it was deliberately listed, never because it
|
|
10
|
+
* happens to sit under a protected directory.
|
|
11
|
+
*/
|
|
12
|
+
export declare function isConstitutionalDocPath(path: string): boolean;
|
|
13
|
+
//# sourceMappingURL=constitutionalDocPaths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constitutionalDocPaths.d.ts","sourceRoot":"","sources":["../../src/shared/constitutionalDocPaths.ts"],"names":[],"mappings":"AAyCA;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,EAAE,SAAS,MAAM,EAcrD,CAAC;AAOF;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE7D"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
// Single source of truth for the "constitutional" doc set — the normative
|
|
2
|
+
// documents that define what this project IS, rather than describing what its
|
|
3
|
+
// code currently DOES.
|
|
4
|
+
//
|
|
5
|
+
// WHY THIS EXISTS. `docs/doc-review-guidelines.md` already SAYS these must never
|
|
6
|
+
// be silently rewritten to match code ("goals docs are normative — never
|
|
7
|
+
// silently rewritten to match code", "Policy & conventions untouchable",
|
|
8
|
+
// "**No — escalate-only**"). A label is not a refusal: commit 6fc2e453 rewrote
|
|
9
|
+
// `spec/remediate/remediation-goals.md` anyway, inside a 9-file doc-review sweep,
|
|
10
|
+
// and nothing stopped it. Per `CLAUDE.md`'s auditor-agnostic-robustness rule —
|
|
11
|
+
// whatever CAN be enforced in tooling must be — the label is now backed by a
|
|
12
|
+
// mechanical refusal: `.claude/hooks/pre-commit-gate.mjs` blocks a commit whose
|
|
13
|
+
// staged set touches one of these paths unless an explicit, staged-tree-bound
|
|
14
|
+
// override record exists (`scripts/attest-constitutional-doc-change.mjs`).
|
|
15
|
+
//
|
|
16
|
+
// This mirrors `loopCorePaths.ts` deliberately: one canonical list here, a
|
|
17
|
+
// generated `.mjs` sibling the pre-build hooks can import
|
|
18
|
+
// (`scripts/shared/constitutional-doc-paths.generated.mjs`), and a `--check`
|
|
19
|
+
// parity gate (`npm run check:constitutional-doc-paths`) so the two can never
|
|
20
|
+
// drift. Edit HERE; the generator and the parity check follow.
|
|
21
|
+
//
|
|
22
|
+
// HOW THE LIST IS DERIVED — never guessed. Every entry is a path the doc
|
|
23
|
+
// manifest itself marks normative or escalate-only:
|
|
24
|
+
// • `CLAUDE.md`, `AGENTS.md` — the manifest's *instruction / policy* row:
|
|
25
|
+
// "Policy & conventions untouchable", "**No — escalate-only.**"
|
|
26
|
+
// • `docs/project-philosophy.md`, `docs/documentation-philosophy.md` — the two
|
|
27
|
+
// rubric sources every judgement in the doc-review routine measures against.
|
|
28
|
+
// • `docs/doc-review-guidelines.md` — "This file is **excluded from its own
|
|
29
|
+
// review**… the routine reads it, never rewrites it."
|
|
30
|
+
// • `spec/audit/audit-goals.md`, `spec/remediate/remediation-goals.md` — named
|
|
31
|
+
// *normative goals docs* ("never silently rewritten to match code").
|
|
32
|
+
// • the rest of `spec/audit/*` — the manifest's *package docs (audit)* row
|
|
33
|
+
// calls them "the normative `spec/audit/*`".
|
|
34
|
+
// The list is deliberately NOT padded out to cover `spec/` wholesale: an
|
|
35
|
+
// over-broad refusal trains the override into a reflex, and an override that is
|
|
36
|
+
// always used has stopped signalling anything.
|
|
37
|
+
//
|
|
38
|
+
// Entries are EXACT repo-relative paths (no directory prefixes — over-capture is
|
|
39
|
+
// the specific failure mode here). Paths compare with forward slashes (win32
|
|
40
|
+
// backslashes are normalized first), so the set is OS-agnostic.
|
|
41
|
+
/**
|
|
42
|
+
* The canonical constitutional doc path list. Exact repo-relative paths, sorted
|
|
43
|
+
* by content (path-sort) so the serialized order is stable and the parity
|
|
44
|
+
* comparison is deterministic.
|
|
45
|
+
*/
|
|
46
|
+
export const CONSTITUTIONAL_DOC_PATHS = [
|
|
47
|
+
"AGENTS.md",
|
|
48
|
+
"CLAUDE.md",
|
|
49
|
+
"docs/doc-review-guidelines.md",
|
|
50
|
+
"docs/documentation-philosophy.md",
|
|
51
|
+
"docs/project-philosophy.md",
|
|
52
|
+
"spec/audit/artifact-contract.md",
|
|
53
|
+
"spec/audit/audit-goals.md",
|
|
54
|
+
"spec/audit/dependency-map.md",
|
|
55
|
+
"spec/audit/dispatch-admission-control.md",
|
|
56
|
+
"spec/audit/entrypoint-contract.md",
|
|
57
|
+
"spec/audit/executor-catalog.md",
|
|
58
|
+
"spec/audit/orchestration-policy.md",
|
|
59
|
+
"spec/remediate/remediation-goals.md",
|
|
60
|
+
];
|
|
61
|
+
/** Normalize a repo-relative path to forward slashes, no leading "./". */
|
|
62
|
+
function normalizeRepoRelPath(path) {
|
|
63
|
+
return path.replace(/\\/g, "/").replace(/^\.\//, "");
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Whether a repo-relative path names a constitutional doc. Exact match only —
|
|
67
|
+
* a doc is constitutional because it was deliberately listed, never because it
|
|
68
|
+
* happens to sit under a protected directory.
|
|
69
|
+
*/
|
|
70
|
+
export function isConstitutionalDocPath(path) {
|
|
71
|
+
return CONSTITUTIONAL_DOC_PATHS.includes(normalizeRepoRelPath(path));
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=constitutionalDocPaths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constitutionalDocPaths.js","sourceRoot":"","sources":["../../src/shared/constitutionalDocPaths.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,8EAA8E;AAC9E,uBAAuB;AACvB,EAAE;AACF,iFAAiF;AACjF,yEAAyE;AACzE,yEAAyE;AACzE,+EAA+E;AAC/E,kFAAkF;AAClF,+EAA+E;AAC/E,6EAA6E;AAC7E,gFAAgF;AAChF,8EAA8E;AAC9E,2EAA2E;AAC3E,EAAE;AACF,2EAA2E;AAC3E,0DAA0D;AAC1D,6EAA6E;AAC7E,8EAA8E;AAC9E,+DAA+D;AAC/D,EAAE;AACF,yEAAyE;AACzE,oDAAoD;AACpD,4EAA4E;AAC5E,oEAAoE;AACpE,iFAAiF;AACjF,iFAAiF;AACjF,8EAA8E;AAC9E,0DAA0D;AAC1D,iFAAiF;AACjF,yEAAyE;AACzE,6EAA6E;AAC7E,iDAAiD;AACjD,yEAAyE;AACzE,gFAAgF;AAChF,+CAA+C;AAC/C,EAAE;AACF,iFAAiF;AACjF,6EAA6E;AAC7E,gEAAgE;AAEhE;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAsB;IACzD,WAAW;IACX,WAAW;IACX,+BAA+B;IAC/B,kCAAkC;IAClC,4BAA4B;IAC5B,iCAAiC;IACjC,2BAA2B;IAC3B,8BAA8B;IAC9B,0CAA0C;IAC1C,mCAAmC;IACnC,gCAAgC;IAChC,oCAAoC;IACpC,qCAAqC;CACtC,CAAC;AAEF,0EAA0E;AAC1E,SAAS,oBAAoB,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AACvD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,OAAO,wBAAwB,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;AACvE,CAAC"}
|
|
@@ -117,6 +117,12 @@ export declare class HybridSpillCoordinator {
|
|
|
117
117
|
private readonly claimRegistry;
|
|
118
118
|
private readonly readSettled;
|
|
119
119
|
private readonly onSettle?;
|
|
120
|
+
/**
|
|
121
|
+
* Node ids from the MOST RECENT {@link planAssignments} that fit no active pool.
|
|
122
|
+
* Read back via {@link unplaceableNodeIds}; a post-plan consult, exactly like
|
|
123
|
+
* {@link terminalStatus}.
|
|
124
|
+
*/
|
|
125
|
+
private lastUnplaceableNodeIds;
|
|
120
126
|
constructor(opts: HybridSpillCoordinatorOptions);
|
|
121
127
|
/** The pools NOT in the current shared settled set, in preference order. */
|
|
122
128
|
private activePools;
|
|
@@ -158,6 +164,19 @@ export declare class HybridSpillCoordinator {
|
|
|
158
164
|
* release only on a terminal accept outcome.
|
|
159
165
|
*/
|
|
160
166
|
release(assignment: NodeAssignment): Promise<void>;
|
|
167
|
+
/**
|
|
168
|
+
* Node ids the last {@link planAssignments} could place on NO active pool —
|
|
169
|
+
* their size exceeds every pool's declared context cap. Sorted, and empty until
|
|
170
|
+
* a plan has run.
|
|
171
|
+
*
|
|
172
|
+
* A caller reading an empty partition needs this to tell a structural refusal
|
|
173
|
+
* ("nothing fits — pause and name the real cause") from the two benign empties
|
|
174
|
+
* it otherwise looks identical to: capacity full this cycle, or a peer driver
|
|
175
|
+
* holding the claims. Both of those re-offer next cycle; an unplaceable node
|
|
176
|
+
* never will, so folding it into them merges a node that was never allowed to
|
|
177
|
+
* run and terminal-blocks it.
|
|
178
|
+
*/
|
|
179
|
+
unplaceableNodeIds(): string[];
|
|
161
180
|
/**
|
|
162
181
|
* The single pause-authorization check. Returns `all_pools_exhausted` — carrying
|
|
163
182
|
* a `PartialCompletionTerminal` over `strandedIds` — ONLY when every confirmed
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coordinator.d.ts","sourceRoot":"","sources":["../../../src/shared/dispatch/coordinator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAMpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAM/D;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,sEAAsE;IACtE,EAAE,EAAE,MAAM,CAAC;IACX,8EAA8E;IAC9E,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,YAAY,CAAC,cAAc,CAAC,CAAC;IAC3C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,yBAAyB,GACjC;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,QAAQ,EAAE,yBAAyB,CAAA;CAAE,CAAC;AAEzE,8DAA8D;AAC9D,MAAM,WAAW,6BAA6B;IAC5C,kEAAkE;IAClE,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,aAAa,EAAE,aAAa,CAAC;IAC7B;;;OAGG;IACH,aAAa,EAAE,aAAa,CAAC;IAC7B;;;;OAIG;IACH,WAAW,EAAE,MAAM,mBAAmB,CAAC;IACvC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrD;AAiBD,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiB;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA4B;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAA2C;
|
|
1
|
+
{"version":3,"file":"coordinator.d.ts","sourceRoot":"","sources":["../../../src/shared/dispatch/coordinator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAMpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAM/D;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,sEAAsE;IACtE,EAAE,EAAE,MAAM,CAAC;IACX,8EAA8E;IAC9E,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,YAAY,CAAC,cAAc,CAAC,CAAC;IAC3C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,yEAAyE;IACzE,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;GASG;AACH,MAAM,MAAM,yBAAyB,GACjC;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IAAE,IAAI,EAAE,qBAAqB,CAAC;IAAC,QAAQ,EAAE,yBAAyB,CAAA;CAAE,CAAC;AAEzE,8DAA8D;AAC9D,MAAM,WAAW,6BAA6B;IAC5C,kEAAkE;IAClE,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,aAAa,EAAE,aAAa,CAAC;IAC7B;;;OAGG;IACH,aAAa,EAAE,aAAa,CAAC;IAC7B;;;;OAIG;IACH,WAAW,EAAE,MAAM,mBAAmB,CAAC;IACvC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrD;AAiBD,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiB;IACvC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAC9C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA4B;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAA2C;IACrE;;;;OAIG;IACH,OAAO,CAAC,sBAAsB,CAAgB;gBAElC,IAAI,EAAE,6BAA6B;IAQ/C,4EAA4E;IAC5E,OAAO,CAAC,WAAW;IAKnB;;;;;;;;;;;;;;;;;;OAkBG;IACG,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAsGvE;;;;;;;;OAQG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK/C;;;;;;OAMG;IACG,OAAO,CAAC,UAAU,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAIxD;;;;;;;;;;;OAWG;IACH,kBAAkB,IAAI,MAAM,EAAE;IAI9B;;;;;;OAMG;IACH,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,yBAAyB;CASjE"}
|
|
@@ -64,6 +64,12 @@ export class HybridSpillCoordinator {
|
|
|
64
64
|
claimRegistry;
|
|
65
65
|
readSettled;
|
|
66
66
|
onSettle;
|
|
67
|
+
/**
|
|
68
|
+
* Node ids from the MOST RECENT {@link planAssignments} that fit no active pool.
|
|
69
|
+
* Read back via {@link unplaceableNodeIds}; a post-plan consult, exactly like
|
|
70
|
+
* {@link terminalStatus}.
|
|
71
|
+
*/
|
|
72
|
+
lastUnplaceableNodeIds = [];
|
|
67
73
|
constructor(opts) {
|
|
68
74
|
this.pools = opts.pools;
|
|
69
75
|
this.sessionConfig = opts.sessionConfig;
|
|
@@ -97,6 +103,11 @@ export class HybridSpillCoordinator {
|
|
|
97
103
|
*/
|
|
98
104
|
async planAssignments(nodes) {
|
|
99
105
|
const active = this.activePools();
|
|
106
|
+
// Reset per plan: unplaceability is a fact about THIS pass's pool set, and a
|
|
107
|
+
// stale carry-over would pause a run whose operator has since freed a pool.
|
|
108
|
+
// With no active pools nothing is "unplaceable" — that is the all-exhausted
|
|
109
|
+
// case `terminalStatus` owns, and reporting a fit mismatch would misdirect.
|
|
110
|
+
this.lastUnplaceableNodeIds = [];
|
|
100
111
|
if (active.length === 0 || nodes.length === 0)
|
|
101
112
|
return [];
|
|
102
113
|
// Largest-node-first so the capacity split and the claim walk agree with
|
|
@@ -161,6 +172,14 @@ export class HybridSpillCoordinator {
|
|
|
161
172
|
// structured line per plan so the caller/operator can see exactly which
|
|
162
173
|
// nodes are unplaceable and why.
|
|
163
174
|
const neverFits = unassigned.filter((n) => active.every((p) => !nodeContextFits(n, p)));
|
|
175
|
+
// Surface the same fact to the CALLER, not just to stderr (spec F1 shipped the
|
|
176
|
+
// observability half only). A caller that sees an empty partition cannot
|
|
177
|
+
// otherwise tell "every node is unplaceable" from "capacity is full this cycle"
|
|
178
|
+
// or "a peer driver holds them" — and those want opposite handling: the first
|
|
179
|
+
// is a structural refusal to pause on, the other two are re-offered next cycle.
|
|
180
|
+
// Recorded here rather than recomputed by the caller so the fit predicate
|
|
181
|
+
// (`nodeContextFits`) stays single-sourced and predicate + report cannot drift.
|
|
182
|
+
this.lastUnplaceableNodeIds = neverFits.map((n) => n.id).sort();
|
|
164
183
|
if (neverFits.length > 0) {
|
|
165
184
|
try {
|
|
166
185
|
process.stderr.write(JSON.stringify({
|
|
@@ -202,6 +221,21 @@ export class HybridSpillCoordinator {
|
|
|
202
221
|
async release(assignment) {
|
|
203
222
|
await this.claimRegistry.release(assignment.nodeId, assignment.ownerToken);
|
|
204
223
|
}
|
|
224
|
+
/**
|
|
225
|
+
* Node ids the last {@link planAssignments} could place on NO active pool —
|
|
226
|
+
* their size exceeds every pool's declared context cap. Sorted, and empty until
|
|
227
|
+
* a plan has run.
|
|
228
|
+
*
|
|
229
|
+
* A caller reading an empty partition needs this to tell a structural refusal
|
|
230
|
+
* ("nothing fits — pause and name the real cause") from the two benign empties
|
|
231
|
+
* it otherwise looks identical to: capacity full this cycle, or a peer driver
|
|
232
|
+
* holding the claims. Both of those re-offer next cycle; an unplaceable node
|
|
233
|
+
* never will, so folding it into them merges a node that was never allowed to
|
|
234
|
+
* run and terminal-blocks it.
|
|
235
|
+
*/
|
|
236
|
+
unplaceableNodeIds() {
|
|
237
|
+
return [...this.lastUnplaceableNodeIds];
|
|
238
|
+
}
|
|
205
239
|
/**
|
|
206
240
|
* The single pause-authorization check. Returns `all_pools_exhausted` — carrying
|
|
207
241
|
* a `PartialCompletionTerminal` over `strandedIds` — ONLY when every confirmed
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../../src/shared/dispatch/coordinator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAGH,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,sCAAsC,GACvC,MAAM,sBAAsB,CAAC;AA0E9B;;;;;GAKG;AACH,SAAS,eAAe,CAAC,IAAkB,EAAE,IAAkB;IAC7D,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/C,OAAO,IAAI,CAAC,eAAe,GAAG,sCAAsC,IAAI,IAAI,CAAC,gBAAgB,CAAC;AAChG,CAAC;AAED,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E,MAAM,OAAO,sBAAsB;IAChB,KAAK,CAAiB;IACtB,aAAa,CAAgB;IAC7B,aAAa,CAAgB;IAC7B,WAAW,CAA4B;IACvC,QAAQ,CAA4C;
|
|
1
|
+
{"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../../src/shared/dispatch/coordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,6 +31,16 @@ export interface HybridDispatchPartition {
|
|
|
31
31
|
inProcess: NodeAssignment[];
|
|
32
32
|
/** Nodes handed to the conversation host's driver (its own pool). */
|
|
33
33
|
host: NodeAssignment[];
|
|
34
|
+
/**
|
|
35
|
+
* Node ids that fit NO active pool this pass (size vs. every declared context
|
|
36
|
+
* cap). These appear in NEITHER partition, and unlike the other reasons a node
|
|
37
|
+
* goes unassigned — capacity full, or a peer driver holding the claim — they
|
|
38
|
+
* will not become placeable by being re-offered next cycle. A caller that folds
|
|
39
|
+
* an all-unplaceable frontier into "nothing to do" merges nodes that were never
|
|
40
|
+
* allowed to run; treat a non-empty set with both partitions empty as a
|
|
41
|
+
* structural refusal to PAUSE on, naming the fit mismatch as the cause.
|
|
42
|
+
*/
|
|
43
|
+
unplaceable: string[];
|
|
34
44
|
/**
|
|
35
45
|
* The live coordinator, so the caller can `release` claims on terminal accept,
|
|
36
46
|
* `settlePool` an exhausted pool, and consult `terminalStatus` for the sole
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hybridDispatch.d.ts","sourceRoot":"","sources":["../../../src/shared/dispatch/hybridDispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,sBAAsB,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE,yFAAyF;AACzF,MAAM,WAAW,uBAAuB;IACtC,yEAAyE;IACzE,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,qEAAqE;IACrE,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB;;;;OAIG;IACH,WAAW,EAAE,sBAAsB,CAAC;CACrC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,aAAa,EAAE,aAAa,CAAC;IAC7B,aAAa,EAAE,aAAa,CAAC;IAC7B,gFAAgF;IAChF,WAAW,EAAE,MAAM,mBAAmB,CAAC;IACvC,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD;;;;OAIG;IACH,WAAW,EAAE,CAAC,IAAI,EAAE;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC;CAC1D;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAerG"}
|
|
1
|
+
{"version":3,"file":"hybridDispatch.d.ts","sourceRoot":"","sources":["../../../src/shared/dispatch/hybridDispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,sBAAsB,EAAE,KAAK,YAAY,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAErE,yFAAyF;AACzF,MAAM,WAAW,uBAAuB;IACtC,yEAAyE;IACzE,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,qEAAqE;IACrE,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB;;;;;;;;OAQG;IACH,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB;;;;OAIG;IACH,WAAW,EAAE,sBAAsB,CAAC;CACrC;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,aAAa,EAAE,aAAa,CAAC;IAC7B,aAAa,EAAE,aAAa,CAAC;IAC7B,gFAAgF;IAChF,WAAW,EAAE,MAAM,mBAAmB,CAAC;IACvC,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpD;;;;OAIG;IACH,WAAW,EAAE,CAAC,IAAI,EAAE;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC;CAC1D;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAerG"}
|
|
@@ -55,6 +55,6 @@ export async function planHybridDispatch(input) {
|
|
|
55
55
|
for (const a of assignments) {
|
|
56
56
|
(input.isInProcess(a) ? inProcess : host).push(a);
|
|
57
57
|
}
|
|
58
|
-
return { inProcess, host, coordinator };
|
|
58
|
+
return { inProcess, host, unplaceable: coordinator.unplaceableNodeIds(), coordinator };
|
|
59
59
|
}
|
|
60
60
|
//# sourceMappingURL=hybridDispatch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hybridDispatch.js","sourceRoot":"","sources":["../../../src/shared/dispatch/hybridDispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,sBAAsB,EAA0C,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"hybridDispatch.js","sourceRoot":"","sources":["../../../src/shared/dispatch/hybridDispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,sBAAsB,EAA0C,MAAM,kBAAkB,CAAC;AA+ClG;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,KAA0B;IACjE,MAAM,WAAW,GAAG,IAAI,sBAAsB,CAAC;QAC7C,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;KACzB,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACtE,MAAM,SAAS,GAAqB,EAAE,CAAC;IACvC,MAAM,IAAI,GAAqB,EAAE,CAAC;IAClC,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,kBAAkB,EAAE,EAAE,WAAW,EAAE,CAAC;AACzF,CAAC"}
|
|
@@ -238,6 +238,20 @@ export interface RollingDispatchState<TPacket> {
|
|
|
238
238
|
* 2026-07-23).
|
|
239
239
|
*/
|
|
240
240
|
wallStrandEarliestResetAtMs: number | null;
|
|
241
|
+
/**
|
|
242
|
+
* Stranded packet ids whose blockers were ALL structural fit/capability
|
|
243
|
+
* failures (`context_cap` / `oversized_for_pool` / `below_capability_floor`) —
|
|
244
|
+
* the packet fits NO confirmed pool, as opposed to the pools having died.
|
|
245
|
+
*
|
|
246
|
+
* Classification is captured AT STRAND TIME, never re-derived in
|
|
247
|
+
* `getTerminal`: the pool set and the packet's 413 skip-set both move on, so a
|
|
248
|
+
* later re-read would misattribute the cause. A wholly-structural strand is a
|
|
249
|
+
* fit mismatch the operator clears by freeing a larger pool or splitting the
|
|
250
|
+
* work — so `getTerminal` renders it as the RESUMABLE `no_capable_pool` pause
|
|
251
|
+
* rather than the non-retryable `empty_pool` terminal, whose "the provider
|
|
252
|
+
* pool was exhausted" message sends the operator to quota when nothing was.
|
|
253
|
+
*/
|
|
254
|
+
structuralStrandIds: Set<string>;
|
|
241
255
|
/**
|
|
242
256
|
* Pool ids demoted by reactive cost verification: a pool DECLARED free
|
|
243
257
|
* (`declaredCostPerMtok === 0`) that reported a positive cost on a completion, so
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rollingDispatch.d.ts","sourceRoot":"","sources":["../../../src/shared/dispatch/rollingDispatch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,KAAK,EAAE,YAAY,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAEpF,OAAO,KAAK,EAAE,eAAe,EAA4B,MAAM,mBAAmB,CAAC;AAYnF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAE9E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAEpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AASvE,OAAO,KAAK,EAEV,kBAAkB,EAEnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"rollingDispatch.d.ts","sourceRoot":"","sources":["../../../src/shared/dispatch/rollingDispatch.ts"],"names":[],"mappings":"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"}
|
|
@@ -64,6 +64,22 @@ import { DISPATCH_LEASE_TTL_MS } from "../quota/reservationLedger.js";
|
|
|
64
64
|
import { foldAccountCooldown } from "../quota/accountId.js";
|
|
65
65
|
import { tierRank } from "./tierRank.js";
|
|
66
66
|
import { buildCapacityPoolCapabilityFloor, toConstraintOutcomeRecords, } from "./admissionLoop.js";
|
|
67
|
+
/**
|
|
68
|
+
* The block reasons that mean "this packet fits no pool that exists" rather than
|
|
69
|
+
* "the pools died". All three are properties of the (packet, pool) PAIRING —
|
|
70
|
+
* a declared context window, a 413 the pool already returned for this packet, or
|
|
71
|
+
* a capability floor the pool sits below — so no reset, credit top-up or retry
|
|
72
|
+
* clears them; only a larger/stronger pool or a smaller packet does.
|
|
73
|
+
*
|
|
74
|
+
* `pool_exhausted` is deliberately absent (a dead pool is exhaustion, which
|
|
75
|
+
* `empty_pool` already reports honestly), and `pool_paused` cannot appear in a
|
|
76
|
+
* never-dispatchable strand at all — that strand admits permanent reasons only.
|
|
77
|
+
*/
|
|
78
|
+
const STRUCTURAL_FIT_BLOCK_REASONS = new Set([
|
|
79
|
+
"below_capability_floor",
|
|
80
|
+
"context_cap",
|
|
81
|
+
"oversized_for_pool",
|
|
82
|
+
]);
|
|
67
83
|
// ---------------------------------------------------------------------------
|
|
68
84
|
// InFlightTokenTracker
|
|
69
85
|
// ---------------------------------------------------------------------------
|
|
@@ -391,6 +407,7 @@ export function createRollingDispatcher(config, options = {}) {
|
|
|
391
407
|
pausedPoolResetAt: new Map(),
|
|
392
408
|
strandedIds: new Set(),
|
|
393
409
|
wallStrandEarliestResetAtMs: null,
|
|
410
|
+
structuralStrandIds: new Set(),
|
|
394
411
|
// A driver-provided set (driveRolling) makes demotion span this run's sub-waves
|
|
395
412
|
// + levels; a standalone dispatcher owns a fresh per-instance set.
|
|
396
413
|
costDemotedPoolIds: injectedCostDemotedPoolIds ?? new Set(),
|
|
@@ -1287,9 +1304,18 @@ export function createRollingDispatcher(config, options = {}) {
|
|
|
1287
1304
|
neverDispatchable.push({ packet: p, pools });
|
|
1288
1305
|
}
|
|
1289
1306
|
if (neverDispatchable.length > 0) {
|
|
1290
|
-
for (const { packet: p } of neverDispatchable) {
|
|
1291
|
-
if (
|
|
1292
|
-
|
|
1307
|
+
for (const { packet: p, pools } of neverDispatchable) {
|
|
1308
|
+
if (state.completedIds.has(p.id))
|
|
1309
|
+
continue;
|
|
1310
|
+
state.strandedIds.add(p.id);
|
|
1311
|
+
// Capture the CAUSE now (see `structuralStrandIds`): a packet blocked
|
|
1312
|
+
// everywhere by fit/capability alone fits no pool that exists, which is
|
|
1313
|
+
// an operator-clearable mismatch — not the dead-pool exhaustion the
|
|
1314
|
+
// `empty_pool` terminal reports. A single `pool_exhausted` blocker means
|
|
1315
|
+
// pools really did die, so the strand keeps the exhaustion reading.
|
|
1316
|
+
if (pools.length > 0 && pools.every((b) => STRUCTURAL_FIT_BLOCK_REASONS.has(b.why))) {
|
|
1317
|
+
state.structuralStrandIds.add(p.id);
|
|
1318
|
+
}
|
|
1293
1319
|
}
|
|
1294
1320
|
const strandedIdSet = new Set(neverDispatchable.map(({ packet: p }) => p.id));
|
|
1295
1321
|
state.pendingQueue = state.pendingQueue.filter((p) => !strandedIdSet.has(p.id));
|
|
@@ -1385,6 +1411,21 @@ export function createRollingDispatcher(config, options = {}) {
|
|
|
1385
1411
|
if (earliest != null) {
|
|
1386
1412
|
return buildQuotaPausedTerminal([...state.strandedIds], new Date(earliest).toISOString());
|
|
1387
1413
|
}
|
|
1414
|
+
// No reset to wait for. Before falling back to the non-retryable `empty_pool`
|
|
1415
|
+
// terminal, separate the two ways that happens: pools that DIED (exhaustion —
|
|
1416
|
+
// `empty_pool` is honest) from packets that fit NO pool (a structural
|
|
1417
|
+
// mismatch). The latter is resumable the moment the operator frees a larger
|
|
1418
|
+
// pool or splits the work, so terminal-blocking it kills nodes that are still
|
|
1419
|
+
// perfectly runnable — and `empty_pool`'s "provider pool was exhausted" points
|
|
1420
|
+
// at quota when nothing was exhausted. Emit the `no_capable_pool` pause, whose
|
|
1421
|
+
// consumers keep the nodes PENDING and render the real cause.
|
|
1422
|
+
//
|
|
1423
|
+
// Whole-batch, matching getTerminal's one-reason-per-batch contract: a strand
|
|
1424
|
+
// mixing exhaustion with unplaceability still reads as `empty_pool`, since the
|
|
1425
|
+
// dead pools are the fact the operator must act on first.
|
|
1426
|
+
if ([...state.strandedIds].every((id) => state.structuralStrandIds.has(id))) {
|
|
1427
|
+
return buildQuotaPausedTerminal([...state.strandedIds], null, "no_capable_pool");
|
|
1428
|
+
}
|
|
1388
1429
|
return buildEmptyPoolTerminal([...state.strandedIds]);
|
|
1389
1430
|
}
|
|
1390
1431
|
return { enqueue, run, getState, getTerminal };
|