




















@@ -446,11 +446,13 @@ export async function runCodexAppServerAttempt(
446446const activeContextEngine = isActiveHarnessContextEngine(params.contextEngine)
447447 ? params.contextEngine
448448 : undefined;
449+const isInactiveThreadBootstrapBinding = (binding: CodexAppServerThreadBinding | undefined) =>
450+!activeContextEngine && binding?.contextEngine?.projection?.mode === "thread_bootstrap";
449451let startupBinding = await readCodexAppServerBinding(params.sessionFile);
450452preDynamicStartupStages.mark("read-binding");
451453const startupBindingAuthProfileId = startupBinding?.authProfileId;
452-const initialStartupBindingHadInactiveContextEngine =
453-!activeContextEngine && Boolean(startupBinding?.contextEngine);
454+const initialStartupBindingHadInactiveThreadBootstrap =
455+isInactiveThreadBootstrapBinding(startupBinding);
454456startupBinding = await rotateOversizedCodexAppServerStartupBinding({
455457binding: startupBinding,
456458sessionFile: params.sessionFile,
@@ -459,8 +461,8 @@ export async function runCodexAppServerAttempt(
459461config: params.config,
460462contextEngineActive: Boolean(activeContextEngine),
461463});
462-const initialInactiveContextEngineBindingForcedFreshStart =
463-initialStartupBindingHadInactiveContextEngine && !startupBinding?.threadId;
464+const initialInactiveThreadBootstrapBindingForcedFreshStart =
465+initialStartupBindingHadInactiveThreadBootstrap && !startupBinding?.threadId;
464466preDynamicStartupStages.mark("rotate-binding");
465467const startupAuthProfileCandidate =
466468params.runtimePlan?.auth.forwardedAuthProfileId ??
@@ -688,8 +690,8 @@ export async function runCodexAppServerAttempt(
688690let contextEngineProjection: CodexContextEngineThreadBootstrapProjection | undefined;
689691let precomputedStaleBindingContinuityProjectionApplied = false;
690692let staleBindingContinuityForcedFreshStart = false;
691-let inactiveContextEngineBindingForcedFreshStart =
692-initialInactiveContextEngineBindingForcedFreshStart;
693+let inactiveThreadBootstrapBindingForcedFreshStart =
694+initialInactiveThreadBootstrapBindingForcedFreshStart;
693695const applyFreshThreadContinuityProjection = () => {
694696const projection = projectContextEngineAssemblyForCodex({
695697assembledMessages: historyMessages,
@@ -881,8 +883,8 @@ export async function runCodexAppServerAttempt(
881883if (activeContextEngine || !binding?.threadId) {
882884return false;
883885}
884-if (binding.contextEngine) {
885-inactiveContextEngineBindingForcedFreshStart = true;
886+if (isInactiveThreadBootstrapBinding(binding)) {
887+inactiveThreadBootstrapBindingForcedFreshStart = true;
886888return false;
887889}
888890const projected = applyResumeStaleBindingContinuityProjection(binding);
@@ -892,7 +894,6 @@ export async function runCodexAppServerAttempt(
892894const applyNoContextEngineContinuityProjection = (
893895action: "started" | "resumed",
894896binding?: CodexAppServerThreadBinding,
895-rotatedContextEngineBinding = false,
896897) => {
897898if (activeContextEngine || !historyMessages.some((message) => message.role === "user")) {
898899return false;
@@ -903,12 +904,9 @@ export async function runCodexAppServerAttempt(
903904if (action === "started" && staleBindingContinuityForcedFreshStart) {
904905return true;
905906}
906-if (
907-action === "started" &&
908-(inactiveContextEngineBindingForcedFreshStart || rotatedContextEngineBinding)
909-) {
910-// A retired or changed context-engine binding already forced Codex onto a
911-// clean native thread; without the engine active, mirrored history would
907+if (action === "started" && inactiveThreadBootstrapBindingForcedFreshStart) {
908+// A retired thread-bootstrap context engine already forced Codex onto a
909+// clean native thread; without that engine active, mirrored history would
912910// re-inject stale bootstrap context as a new user turn.
913911return false;
914912}
@@ -929,8 +927,7 @@ export async function runCodexAppServerAttempt(
929927return;
930928}
931929const previousThreadId = startupBinding.threadId;
932-const hadInactiveContextEngineBinding =
933-!activeContextEngine && Boolean(startupBinding.contextEngine);
930+const hadInactiveThreadBootstrapBinding = isInactiveThreadBootstrapBinding(startupBinding);
934931const projectedTurnTokens = estimateCodexAppServerProjectedTurnTokens({
935932prompt: codexTurnPromptText,
936933developerInstructions: buildRenderedCodexDeveloperInstructions(),
@@ -947,10 +944,10 @@ export async function runCodexAppServerAttempt(
947944if (startupBinding?.threadId) {
948945return;
949946}
950-inactiveContextEngineBindingForcedFreshStart = hadInactiveContextEngineBinding;
947+inactiveThreadBootstrapBindingForcedFreshStart = hadInactiveThreadBootstrapBinding;
951948staleBindingContinuityForcedFreshStart =
952949precomputedStaleBindingContinuityProjectionApplied &&
953-!inactiveContextEngineBindingForcedFreshStart;
950+!inactiveThreadBootstrapBindingForcedFreshStart;
954951if (activeContextEngine) {
955952contextEngineProjection = undefined;
956953try {
@@ -1110,13 +1107,7 @@ export async function runCodexAppServerAttempt(
11101107params.abortSignal?.removeEventListener("abort", abortFromUpstream);
11111108throw error;
11121109}
1113-if (
1114-applyNoContextEngineContinuityProjection(
1115-thread.lifecycle.action,
1116-thread,
1117-thread.lifecycle.rotatedContextEngineBinding === true,
1118-)
1119-) {
1110+if (applyNoContextEngineContinuityProjection(thread.lifecycle.action, thread)) {
11201111await rebuildCodexTurnPromptTextFromCurrentProjection();
11211112}
11221113trajectoryRecorder?.recordEvent("session.started", {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。