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.
Files changed (141) hide show
  1. package/README.md +32 -11
  2. package/dist/audit/cli/args.d.ts +2 -2
  3. package/dist/audit/cli/args.d.ts.map +1 -1
  4. package/dist/audit/cli/args.js.map +1 -1
  5. package/dist/audit/cli/dispatch/paths.d.ts.map +1 -1
  6. package/dist/audit/cli/dispatch/paths.js +3 -9
  7. package/dist/audit/cli/dispatch/paths.js.map +1 -1
  8. package/dist/audit/cli/nextStepCommand.d.ts.map +1 -1
  9. package/dist/audit/cli/nextStepCommand.js +24 -1
  10. package/dist/audit/cli/nextStepCommand.js.map +1 -1
  11. package/dist/audit/cli/providerConfirmationStep.d.ts +13 -0
  12. package/dist/audit/cli/providerConfirmationStep.d.ts.map +1 -1
  13. package/dist/audit/cli/providerConfirmationStep.js +43 -7
  14. package/dist/audit/cli/providerConfirmationStep.js.map +1 -1
  15. package/dist/audit/extractors/analyzers/typescript.d.ts.map +1 -1
  16. package/dist/audit/extractors/analyzers/typescript.js +3 -2
  17. package/dist/audit/extractors/analyzers/typescript.js.map +1 -1
  18. package/dist/audit/extractors/graph.d.ts.map +1 -1
  19. package/dist/audit/extractors/graph.js +4 -5
  20. package/dist/audit/extractors/graph.js.map +1 -1
  21. package/dist/audit/io/artifacts.d.ts +1 -12
  22. package/dist/audit/io/artifacts.d.ts.map +1 -1
  23. package/dist/audit/io/artifacts.js +9 -39
  24. package/dist/audit/io/artifacts.js.map +1 -1
  25. package/dist/audit/orchestrator/designReviewSnapshot.d.ts.map +1 -1
  26. package/dist/audit/orchestrator/designReviewSnapshot.js +4 -2
  27. package/dist/audit/orchestrator/designReviewSnapshot.js.map +1 -1
  28. package/dist/audit/orchestrator/intakeExecutors.d.ts.map +1 -1
  29. package/dist/audit/orchestrator/intakeExecutors.js +59 -3
  30. package/dist/audit/orchestrator/intakeExecutors.js.map +1 -1
  31. package/dist/remediate/contractPipeline/reviewSnapshot.d.ts +8 -0
  32. package/dist/remediate/contractPipeline/reviewSnapshot.d.ts.map +1 -1
  33. package/dist/remediate/contractPipeline/reviewSnapshot.js +10 -2
  34. package/dist/remediate/contractPipeline/reviewSnapshot.js.map +1 -1
  35. package/dist/remediate/contractPipeline/testPlanCarry.d.ts +7 -1
  36. package/dist/remediate/contractPipeline/testPlanCarry.d.ts.map +1 -1
  37. package/dist/remediate/contractPipeline/testPlanCarry.js +9 -3
  38. package/dist/remediate/contractPipeline/testPlanCarry.js.map +1 -1
  39. package/dist/remediate/phases/close.d.ts.map +1 -1
  40. package/dist/remediate/phases/close.js +10 -8
  41. package/dist/remediate/phases/close.js.map +1 -1
  42. package/dist/remediate/phases/plan.js +2 -2
  43. package/dist/remediate/phases/plan.js.map +1 -1
  44. package/dist/remediate/riskSignal.d.ts.map +1 -1
  45. package/dist/remediate/riskSignal.js +5 -2
  46. package/dist/remediate/riskSignal.js.map +1 -1
  47. package/dist/remediate/state/itemStatus.d.ts +26 -3
  48. package/dist/remediate/state/itemStatus.d.ts.map +1 -1
  49. package/dist/remediate/state/itemStatus.js +56 -18
  50. package/dist/remediate/state/itemStatus.js.map +1 -1
  51. package/dist/remediate/state/store.d.ts.map +1 -1
  52. package/dist/remediate/state/store.js +18 -0
  53. package/dist/remediate/state/store.js.map +1 -1
  54. package/dist/remediate/state/types.d.ts +18 -42
  55. package/dist/remediate/state/types.d.ts.map +1 -1
  56. package/dist/remediate/state/types.js +5 -3
  57. package/dist/remediate/state/types.js.map +1 -1
  58. package/dist/remediate/steps/contractPipeline.d.ts +1 -1
  59. package/dist/remediate/steps/contractPipeline.d.ts.map +1 -1
  60. package/dist/remediate/steps/contractPipeline.js +7 -1
  61. package/dist/remediate/steps/contractPipeline.js.map +1 -1
  62. package/dist/remediate/steps/dispatch/marshal.d.ts.map +1 -1
  63. package/dist/remediate/steps/dispatch/marshal.js +16 -11
  64. package/dist/remediate/steps/dispatch/marshal.js.map +1 -1
  65. package/dist/remediate/steps/dispatch/worktreeLifecycle.d.ts.map +1 -1
  66. package/dist/remediate/steps/dispatch/worktreeLifecycle.js +10 -7
  67. package/dist/remediate/steps/dispatch/worktreeLifecycle.js.map +1 -1
  68. package/dist/remediate/steps/finalGate.d.ts.map +1 -1
  69. package/dist/remediate/steps/finalGate.js +11 -4
  70. package/dist/remediate/steps/finalGate.js.map +1 -1
  71. package/dist/remediate/steps/nextStep.d.ts.map +1 -1
  72. package/dist/remediate/steps/nextStep.js +111 -20
  73. package/dist/remediate/steps/nextStep.js.map +1 -1
  74. package/dist/remediate/steps/stepUtils.d.ts +23 -0
  75. package/dist/remediate/steps/stepUtils.d.ts.map +1 -1
  76. package/dist/remediate/steps/stepUtils.js +55 -1
  77. package/dist/remediate/steps/stepUtils.js.map +1 -1
  78. package/dist/shared/constitutionalDocPaths.d.ts +13 -0
  79. package/dist/shared/constitutionalDocPaths.d.ts.map +1 -0
  80. package/dist/shared/constitutionalDocPaths.js +73 -0
  81. package/dist/shared/constitutionalDocPaths.js.map +1 -0
  82. package/dist/shared/dispatch/coordinator.d.ts +19 -0
  83. package/dist/shared/dispatch/coordinator.d.ts.map +1 -1
  84. package/dist/shared/dispatch/coordinator.js +34 -0
  85. package/dist/shared/dispatch/coordinator.js.map +1 -1
  86. package/dist/shared/dispatch/hybridDispatch.d.ts +10 -0
  87. package/dist/shared/dispatch/hybridDispatch.d.ts.map +1 -1
  88. package/dist/shared/dispatch/hybridDispatch.js +1 -1
  89. package/dist/shared/dispatch/hybridDispatch.js.map +1 -1
  90. package/dist/shared/dispatch/rollingDispatch.d.ts +14 -0
  91. package/dist/shared/dispatch/rollingDispatch.d.ts.map +1 -1
  92. package/dist/shared/dispatch/rollingDispatch.js +44 -3
  93. package/dist/shared/dispatch/rollingDispatch.js.map +1 -1
  94. package/dist/shared/index.d.ts +5 -2
  95. package/dist/shared/index.d.ts.map +1 -1
  96. package/dist/shared/index.js +8 -1
  97. package/dist/shared/index.js.map +1 -1
  98. package/dist/shared/io/frictionCapture.d.ts.map +1 -1
  99. package/dist/shared/io/frictionCapture.js +6 -1
  100. package/dist/shared/io/frictionCapture.js.map +1 -1
  101. package/dist/shared/io/pathContainment.d.ts +46 -0
  102. package/dist/shared/io/pathContainment.d.ts.map +1 -0
  103. package/dist/shared/io/pathContainment.js +40 -0
  104. package/dist/shared/io/pathContainment.js.map +1 -0
  105. package/dist/shared/io/schemaVersion.d.ts +67 -0
  106. package/dist/shared/io/schemaVersion.d.ts.map +1 -0
  107. package/dist/shared/io/schemaVersion.js +87 -0
  108. package/dist/shared/io/schemaVersion.js.map +1 -0
  109. package/dist/shared/providers/auditorSources.d.ts +9 -1
  110. package/dist/shared/providers/auditorSources.d.ts.map +1 -1
  111. package/dist/shared/providers/auditorSources.js +46 -2
  112. package/dist/shared/providers/auditorSources.js.map +1 -1
  113. package/dist/shared/providers/claudeWorkerProvider.d.ts +0 -1
  114. package/dist/shared/providers/claudeWorkerProvider.d.ts.map +1 -1
  115. package/dist/shared/providers/claudeWorkerProvider.js +4 -2
  116. package/dist/shared/providers/claudeWorkerProvider.js.map +1 -1
  117. package/dist/shared/providers/openAiCompatibleProvider.d.ts.map +1 -1
  118. package/dist/shared/providers/openAiCompatibleProvider.js +5 -9
  119. package/dist/shared/providers/openAiCompatibleProvider.js.map +1 -1
  120. package/dist/shared/providers/sharedProviderConfirmation.d.ts +42 -1
  121. package/dist/shared/providers/sharedProviderConfirmation.d.ts.map +1 -1
  122. package/dist/shared/providers/sharedProviderConfirmation.js +197 -3
  123. package/dist/shared/providers/sharedProviderConfirmation.js.map +1 -1
  124. package/dist/shared/quota/coverage.js +1 -1
  125. package/dist/shared/repair/brokeredDispatch.d.ts.map +1 -1
  126. package/dist/shared/repair/brokeredDispatch.js +10 -48
  127. package/dist/shared/repair/brokeredDispatch.js.map +1 -1
  128. package/dist/shared/types/auditorDescriptor.d.ts +8 -2
  129. package/dist/shared/types/auditorDescriptor.d.ts.map +1 -1
  130. package/dist/shared/types/auditorDescriptor.js.map +1 -1
  131. package/dist/shared/types/sessionConfig.d.ts +25 -1
  132. package/dist/shared/types/sessionConfig.d.ts.map +1 -1
  133. package/dist/shared/types/sessionConfig.js +4 -0
  134. package/dist/shared/types/sessionConfig.js.map +1 -1
  135. package/docs/audit-pkg/operator-guide.md +19 -9
  136. package/docs/audit-pkg/release.md +4 -0
  137. package/package.json +10 -3
  138. package/dist/remediate/coverage/findingLedger.d.ts +0 -99
  139. package/dist/remediate/coverage/findingLedger.d.ts.map +0 -1
  140. package/dist/remediate/coverage/findingLedger.js +0 -110
  141. 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":"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"}
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;gBAEzD,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;IAyFvE;;;;;;;;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;;;;;;OAMG;IACH,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,yBAAyB;CASjE"}
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":"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"}
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;IACrE;;;;OAIG;IACK,sBAAsB,GAAa,EAAE,CAAC;IAE9C,YAAY,IAAmC;QAC7C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACxC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QACxC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IAChC,CAAC;IAED,4EAA4E;IACpE,WAAW;QACjB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtD,CAAC;IAED;;;;;;;;;;;;;;;;;;OAkBG;IACH,KAAK,CAAC,eAAe,CAAC,KAAqB;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAClC,6EAA6E;QAC7E,4EAA4E;QAC5E,4EAA4E;QAC5E,4EAA4E;QAC5E,IAAI,CAAC,sBAAsB,GAAG,EAAE,CAAC;QACjC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAEzD,yEAAyE;QACzE,kFAAkF;QAClF,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC;QAEjF,0EAA0E;QAC1E,+EAA+E;QAC/E,4EAA4E;QAC5E,MAAM,QAAQ,GAAG,uBAAuB,CAAC;YACvC,KAAK,EAAE,MAAM;YACb,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC;SACzD,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACvD,MAAM,WAAW,GAAqB,EAAE,CAAC;QACzC,+EAA+E;QAC/E,iFAAiF;QACjF,gFAAgF;QAChF,iFAAiF;QACjF,iFAAiF;QACjF,kBAAkB;QAClB,MAAM,UAAU,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC;QAEhC,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACzC,yEAAyE;YACzE,+CAA+C;YAC/C,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,IAAI,MAAM,GAAG,CAAC,CAAC;YACf,IAAI,IAAI,GAAG,CAAC,CAAC;YACb,OAAO,MAAM,GAAG,KAAK,CAAC,KAAK,IAAI,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC;gBACxD,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAE,CAAC;gBAC/B,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;oBACjC,uEAAuE;oBACvE,4EAA4E;oBAC5E,IAAI,IAAI,CAAC,CAAC;oBACV,SAAS;gBACX,CAAC;gBACD,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;gBAC3B,qEAAqE;gBACrE,0EAA0E;gBAC1E,+EAA+E;gBAC/E,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC/D,IAAI,CAAC,KAAK,CAAC,QAAQ;oBAAE,SAAS;gBAC9B,WAAW,CAAC,IAAI,CAAC;oBACf,MAAM,EAAE,IAAI,CAAC,EAAE;oBACf,MAAM,EAAE,IAAI,CAAC,EAAE;oBACf,YAAY,EAAE,IAAI,CAAC,YAAY;oBAC/B,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,UAAU,EAAE,KAAK,CAAC,UAAU;iBAC7B,CAAC,CAAC;gBACH,MAAM,IAAI,CAAC,CAAC;YACd,CAAC;YACD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM;QACrC,CAAC;QAED,4EAA4E;QAC5E,6EAA6E;QAC7E,2EAA2E;QAC3E,yEAAyE;QACzE,wEAAwE;QACxE,iCAAiC;QACjC,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CACxC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAC5C,CAAC;QACF,+EAA+E;QAC/E,yEAAyE;QACzE,gFAAgF;QAChF,8EAA8E;QAC9E,gFAAgF;QAChF,0EAA0E;QAC1E,gFAAgF;QAChF,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAChE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC;gBACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,CAAC,SAAS,CAAC;oBACb,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;oBAC5B,IAAI,EAAE,iCAAiC;oBACvC,QAAQ,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE;oBAC3C,gBAAgB,EAAE,MAAM;yBACrB,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,kBAAkB,EAAE,CAAC,CAAC,gBAAgB,IAAI,IAAI,EAAE,CAAC,CAAC;yBAC/E,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;iBACtD,CAAC,GAAG,IAAI,CACV,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,yCAAyC;YAC3C,CAAC;QACH,CAAC;QAED,OAAO,WAAW,CAAC;IACrB,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,UAAU,CAAC,MAAc;QAC7B,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO;QAC3C,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,OAAO,CAAC,UAA0B;QACtC,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,UAAU,CAAC,CAAC;IAC7E,CAAC;IAED;;;;;;;;;;;OAWG;IACH,kBAAkB;QAChB,OAAO,CAAC,GAAG,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC1C,CAAC;IAED;;;;;;OAMG;IACH,cAAc,CAAC,WAAqB;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACzF,IAAI,CAAC,YAAY;YAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;QACnD,OAAO;YACL,IAAI,EAAE,qBAAqB;YAC3B,QAAQ,EAAE,sBAAsB,CAAC,WAAW,CAAC;SAC9C,CAAC;IACJ,CAAC;CACF"}
@@ -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;AAqClG;;;;;;;;;;;;;;;;;;;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,CAAC;AAC1C,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":"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"}
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 (!state.completedIds.has(p.id))
1292
- state.strandedIds.add(p.id);
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 };