Merge pull request #3081 from heygen-com/canary-error-router-state

fix(producer): record routing state on the failure path
This commit is contained in:
Vance Ingalls
2026-08-06 23:35:52 -07:00
committed by GitHub
2 changed files with 21 additions and 2 deletions
@@ -3264,6 +3264,15 @@ async function executeRenderPipeline(input: {
usePageSideCompositing: capturePlan.usePageSideCompositing,
hasHdrContent: capturePlan.hasHdrContent,
forceScreenshot: capturePlan.forceScreenshot,
// Re-recorded here because `syncCapturePlan` above is where routing is
// actually decided — including "reverted", which the earlier update
// could not know. Without this, capture observability keeps whatever
// was true before the plan resolved, so a render that failed while
// routed reports no routing state at all: `de_parallel_router` was
// present on 95% of render_complete events and 0.8% of render_error.
// The failure path is the one the rollout is watching.
deWorkerInversion,
deParallelRouter,
});
observability.checkpoint("capture_strategy", "resolved", {
plan: capturePlan.kind,
@@ -173,8 +173,18 @@ function discoverCallers(): { found: string[]; unclassified: string[]; shell: st
for (const entry of readdirSync(dir)) {
if (SKIP_DIRS.has(entry) || entry.startsWith(".")) continue;
const abs = join(dir, entry);
if (statSync(abs).isDirectory()) walk(abs);
else if (isSourceFile(entry)) classify(abs);
// Per-entry, because a single unreadable one used to abort the whole
// traversal: a dangling symlink under packages/studio/data/projects
// threw ENOENT on stat, so every package sorting after `studio` —
// including both studio-server callers — silently stopped being
// checked. Skipping the entry keeps the sweep complete; the manifest
// assertion is what caught the truncation.
try {
if (statSync(abs).isDirectory()) walk(abs);
else if (isSourceFile(entry)) classify(abs);
} catch {
/* unreadable entry (dangling symlink, permissions) — not a caller */
}
}
};
for (const root of SWEEP_ROOTS) {