Get started
انتقال موتور زمینهٔ هارنس Codex
وضعیت
مشخصات پیادهسازی پیشنویس.
هدف
کاری کنید که هارنس app-server بستهبندیشده Codex همان قرارداد چرخهعمر context-engine در OpenClaw را رعایت کند که turnهای تعبیهشده OpenClaw همین حالا رعایت میکنند.
یک نشست که از provider/model با agentRuntime.id: "codex" یا یک مدل codex/* استفاده میکند، همچنان باید به Plugin context-engine انتخابشده، مانند lossless-claw، اجازه دهد تا تا جایی که مرز app-server Codex اجازه میدهد، مونتاژ context، دریافت پس از turn، نگهداشت، و سیاست Compaction در سطح OpenClaw را کنترل کند.
غیرهدفها
- پیادهسازی دوباره درونکاریهای app-server Codex انجام نشود.
- Compaction بومی thread در Codex وادار نشود که خلاصه
lossless-clawتولید کند. - مدلهای غیر Codex ملزم به استفاده از هارنس Codex نشوند.
- رفتار نشست ACP/acpx تغییر نکند. این مشخصات فقط برای مسیر هارنس عامل تعبیهشده غیر ACP است.
- Pluginهای شخص ثالث وادار نشوند factoryهای افزونه app-server Codex را ثبت کنند؛ مرز اعتماد Plugin بستهبندیشده موجود بدون تغییر میماند.
معماری فعلی
حلقه اجرای تعبیهشده، context engine پیکربندیشده را پیش از انتخاب یک هارنس سطح پایین مشخص، یک بار برای هر اجرا resolve میکند:
src/agents/embedded-agent-runner/run.ts- Pluginهای context-engine را مقداردهی اولیه میکند
resolveContextEngine(params.config)را فراخوانی میکندcontextEngineوcontextTokenBudgetرا بهrunEmbeddedAttemptWithBackend(...)پاس میدهد
runEmbeddedAttemptWithBackend(...) کار را به هارنس عامل انتخابشده واگذار میکند:
src/agents/embedded-agent-runner/run/backend.tssrc/agents/harness/selection.ts
هارنس app-server Codex توسط Plugin بستهبندیشده Codex ثبت میشود:
extensions/codex/index.tsextensions/codex/harness.ts
پیادهسازی هارنس Codex همان EmbeddedRunAttemptParams را دریافت میکند که attemptهای داخلی OpenClaw دریافت میکنند:
extensions/codex/src/app-server/run-attempt.ts
این یعنی نقطه hook لازم در کدی قرار دارد که تحت کنترل OpenClaw است. مرز خارجی، خود پروتکل app-server Codex است: OpenClaw میتواند آنچه را به thread/start، thread/resume و turn/start میفرستد کنترل کند و میتواند اعلانها را مشاهده کند، اما نمیتواند store داخلی thread یا compactor بومی Codex را تغییر دهد.
شکاف فعلی
attemptهای داخلی OpenClaw چرخهعمر context-engine را مستقیما فراخوانی میکنند:
- bootstrap/maintenance پیش از attempt
- assemble پیش از فراخوانی مدل
- afterTurn یا ingest پس از attempt
- maintenance پس از یک turn موفق
- Compaction مربوط به context-engine برای engineهایی که مالک Compaction هستند
کدهای مرتبط OpenClaw:
src/agents/embedded-agent-runner/run/attempt.tssrc/agents/embedded-agent-runner/run/attempt.context-engine-helpers.tssrc/agents/embedded-agent-runner/context-engine-maintenance.ts
attemptهای app-server Codex در حال حاضر hookهای عمومی هارنس عامل را اجرا و transcript را mirror میکنند، اما params.contextEngine.bootstrap، params.contextEngine.assemble، params.contextEngine.afterTurn، params.contextEngine.ingestBatch، params.contextEngine.ingest یا params.contextEngine.maintain را فراخوانی نمیکنند.
کدهای مرتبط Codex:
extensions/codex/src/app-server/run-attempt.tsextensions/codex/src/app-server/thread-lifecycle.tsextensions/codex/src/app-server/event-projector.tsextensions/codex/src/app-server/compact.ts
رفتار مطلوب
برای turnهای هارنس Codex، OpenClaw باید این چرخهعمر را حفظ کند:
- transcript نشست mirrorشده OpenClaw را بخواند.
- وقتی فایل نشست قبلی وجود دارد، context engine فعال را bootstrap کند.
- وقتی در دسترس است، bootstrap maintenance را اجرا کند.
- با استفاده از context engine فعال، context را assemble کند.
- context اسمبلشده را به ورودیهای سازگار با Codex تبدیل کند.
- thread Codex را با developer instructions که شامل هر
systemPromptAdditionمربوط به context-engine است، شروع یا resume کند. - turn Codex را با prompt روبهکاربر اسمبلشده شروع کند.
- نتیجه Codex را دوباره در transcript OpenClaw mirror کند.
- اگر
afterTurnپیادهسازی شده است آن را فراخوانی کند، وگرنه با استفاده از snapshot transcript mirrorشده،ingestBatch/ingestرا فراخوانی کند. - پس از turnهای موفق و abortنشده، turn maintenance را اجرا کند.
- سیگنالهای Compaction بومی Codex و hookهای Compaction در OpenClaw را حفظ کند.
محدودیتهای طراحی
app-server Codex برای وضعیت thread بومی canonical میماند
Codex مالک thread بومی خودش و هر تاریخچه داخلی توسعهیافته است. OpenClaw نباید تلاش کند تاریخچه داخلی app-server را جز از راه فراخوانیهای پشتیبانیشده پروتکل تغییر دهد.
mirror transcript در OpenClaw منبع قابلیتهای OpenClaw میماند:
- تاریخچه chat
- جستوجو
- bookkeeping مربوط به
/newو/reset - تعویض آینده مدل یا هارنس
- وضعیت Plugin context-engine
اسمبل context engine باید به ورودیهای Codex تصویر شود
رابط context-engine، AgentMessage[] مربوط به OpenClaw را برمیگرداند، نه یک patch برای thread در Codex. turn/start در app-server Codex یک ورودی کاربر فعلی میپذیرد، در حالی که thread/start و thread/resume، developer instructions میپذیرند.
بنابراین پیادهسازی به یک لایه projection نیاز دارد. نسخه اول ایمن نباید وانمود کند که میتواند تاریخچه داخلی Codex را جایگزین کند. باید context اسمبلشده را به صورت محتوای قطعی prompt/developer-instruction پیرامون turn فعلی تزریق کند.
پایداری prompt-cache مهم است
برای engineهایی مانند lossless-claw، context اسمبلشده باید برای ورودیهای بدون تغییر قطعی باشد. timestamp، id تصادفی یا ترتیب غیرقطعی به متن context تولیدشده اضافه نکنید.
معناشناسی انتخاب runtime تغییر نمیکند
انتخاب هارنس همانطور باقی میماند:
runtime: "openclaw"هارنس داخلی OpenClaw را انتخاب میکندruntime: "codex"هارنس ثبتشده Codex را انتخاب میکندruntime: "auto"اجازه میدهد هارنسهای Plugin، providerهای پشتیبانیشده را claim کنند- اجراهای
autoبدون match از هارنس داخلی OpenClaw استفاده میکنند
این کار آنچه را پس از انتخاب هارنس Codex رخ میدهد تغییر میدهد.
برنامه پیادهسازی
1. helperهای قابلاستفاده مجدد attempt مربوط به context-engine را export یا relocate کنید
امروز helperهای قابلاستفاده مجدد چرخهعمر زیر embedded agent runner قرار دارند:
src/agents/embedded-agent-runner/run/attempt.context-engine-helpers.tssrc/agents/embedded-agent-runner/run/attempt.prompt-helpers.tssrc/agents/embedded-agent-runner/context-engine-maintenance.ts
Codex باید بهجای دستبردن به جزئیات پیادهسازی runner، helperهای harness-neutral را import کند.
یک ماژول harness-neutral بسازید، برای مثال:
src/agents/harness/context-engine-lifecycle.ts
این موارد را move یا re-export کنید:
runAttemptContextEngineBootstrapassembleAttemptContextEnginefinalizeAttemptContextEngineTurnbuildAfterTurnRuntimeContextbuildAfterTurnRuntimeContextFromUsage- یک wrapper کوچک پیرامون
runContextEngineMaintenance
call siteهای هارنس داخلی را در همان PR بهروزرسانی کنید.
نامهای helperهای neutral نباید به هارنس داخلی اشاره کنند.
نامهای پیشنهادی:
bootstrapHarnessContextEngineassembleHarnessContextEnginefinalizeHarnessContextEngineTurnbuildHarnessContextEngineRuntimeContextrunHarnessContextEngineMaintenance
2. یک helper projection مربوط به context در Codex اضافه کنید
یک ماژول جدید اضافه کنید:
extensions/codex/src/app-server/context-engine-projection.ts
مسئولیتها:
AgentMessage[]اسمبلشده، تاریخچه mirrorشده اصلی، و prompt فعلی را بپذیرد.- تعیین کند کدام context به developer instructions تعلق دارد و کدام به ورودی کاربر فعلی.
- prompt فعلی کاربر را بهعنوان درخواست عملیاتی نهایی حفظ کند.
- پیامهای قبلی را در قالبی پایدار و صریح render کند.
- از metadata ناپایدار پرهیز کند.
API پیشنهادی:
export type CodexContextProjection = { developerInstructionAddition?: string; promptText: string; assembledMessages: AgentMessage[]; prePromptMessageCount: number;}; export function projectContextEngineAssemblyForCodex(params: { assembledMessages: AgentMessage[]; originalHistoryMessages: AgentMessage[]; prompt: string; systemPromptAddition?: string;}): CodexContextProjection;projection اولیه پیشنهادی:
systemPromptAdditionرا در developer instructions قرار دهید.- context transcript اسمبلشده را پیش از prompt فعلی در
promptTextقرار دهید. - آن را بهوضوح بهعنوان context اسمبلشده OpenClaw برچسب بزنید.
- prompt فعلی را در انتها نگه دارید.
- اگر prompt تکراری کاربر فعلی از قبل در انتهای tail ظاهر شده است، آن را حذف کنید.
شکل نمونه prompt:
OpenClaw assembled context for this turn: <conversation_context>[user]... [assistant]...</conversation_context> Current user request:...این روش از جراحی بومی تاریخچه Codex کمظرافتتر است، اما داخل OpenClaw قابل پیادهسازی است و معناشناسی context-engine را حفظ میکند.
بهبود آینده: اگر app-server Codex پروتکلی برای جایگزینی یا تکمیل تاریخچه thread ارائه کند، این لایه projection را برای استفاده از آن API تعویض کنید.
3. bootstrap را پیش از راهاندازی thread در Codex wire کنید
در extensions/codex/src/app-server/run-attempt.ts:
- تاریخچه نشست mirrorشده را مثل امروز بخوانید.
- تعیین کنید آیا فایل نشست پیش از این اجرا وجود داشته است یا نه. helperی را ترجیح دهید که پیش از نوشتن mirror،
fs.stat(params.sessionFile)را بررسی کند. - اگر helper به آن نیاز دارد، یک
SessionManagerباز کنید یا از adapter باریک session manager استفاده کنید. - وقتی
params.contextEngineوجود دارد، helper bootstrap neutral را فراخوانی کنید.
جریان شبهکد:
const hadSessionFile = await fileExists(params.sessionFile);const sessionManager = SessionManager.open(params.sessionFile);const historyMessages = sessionManager.buildSessionContext().messages; await bootstrapHarnessContextEngine({ hadSessionFile, contextEngine: params.contextEngine, sessionId: params.sessionId, sessionKey: sandboxSessionKey, sessionFile: params.sessionFile, sessionManager, runtimeContext: buildHarnessContextEngineRuntimeContext(...), runMaintenance: runHarnessContextEngineMaintenance, warn,});از همان قرارداد sessionKey استفاده کنید که bridge ابزار Codex و mirror transcript استفاده میکنند. امروز Codex، sandboxSessionKey را از params.sessionKey یا params.sessionId محاسبه میکند؛ مگر اینکه دلیلی برای حفظ params.sessionKey خام وجود داشته باشد، از همان بهصورت سازگار استفاده کنید.
4. assemble را پیش از thread/start / thread/resume و turn/start wire کنید
در runCodexAppServerAttempt:
- ابتدا ابزارهای dynamic را بسازید، تا context engine نام ابزارهای واقعا در دسترس را ببیند.
- تاریخچه نشست mirrorشده را بخوانید.
- وقتی
params.contextEngineوجود دارد،assemble(...)مربوط به context-engine را اجرا کنید. - نتیجه اسمبلشده را به این موارد project کنید:
- افزوده developer instruction
- متن prompt برای
turn/start
فراخوانی hook موجود:
resolveAgentHarnessBeforePromptBuildResult({ prompt: params.prompt, developerInstructions: buildDeveloperInstructions(params), messages: historyMessages, ctx: hookContext,});باید context-aware شود:
- developer instructions پایه را با
buildDeveloperInstructions(params)محاسبه کنید - assembly/projection مربوط به context-engine را اعمال کنید
before_prompt_buildرا با prompt/developer instructions projectشده اجرا کنید
این ترتیب اجازه میدهد hookهای عمومی prompt همان promptی را ببینند که Codex دریافت خواهد کرد. اگر به برابری سختگیرانه OpenClaw نیاز داشته باشیم، assembly مربوط به context-engine را پیش از composition مربوط به hook اجرا کنید، چون هارنس داخلی systemPromptAddition مربوط به context-engine را پس از pipeline prompt خودش به system prompt نهایی اعمال میکند. invariant مهم این است که هم context engine و هم hookها یک ترتیب قطعی و مستند دریافت کنند.
ترتیب پیشنهادی برای پیادهسازی اول:
buildDeveloperInstructions(params)- context-engine
assemble() - افزودن/پیشافزودن
systemPromptAdditionبه developer instructions - project کردن پیامهای اسمبلشده در متن prompt
resolveAgentHarnessBeforePromptBuildResult(...)- پاس دادن developer instructions نهایی به
startOrResumeThread(...) - پاس دادن متن prompt نهایی به
buildTurnStartParams(...)
این مشخصات باید در تستها encode شود تا تغییرات آینده بهصورت تصادفی ترتیب آن را عوض نکنند.
5. قالببندی پایدار prompt-cache را حفظ کنید
helper projection باید برای ورودیهای یکسان خروجی byte-stable تولید کند:
- ترتیب پایدار پیامها
- برچسبهای پایدار role
- بدون timestamp تولیدشده
- بدون نشت ترتیب کلیدهای object
- بدون delimiterهای تصادفی
- بدون idهای per-run
از delimiterهای ثابت و بخشهای صریح استفاده کنید.
6. پس از mirror کردن transcript، post-turn را wire کنید
CodexAppServerEventProjector در Codex یک messagesSnapshot محلی برای نوبت
فعلی میسازد. mirrorTranscriptBestEffort(...) آن snapshot را در آینهٔ transcript
OpenClaw مینویسد.
پس از موفقیت یا شکست mirroring، نهاییساز context-engine را با بهترین snapshot پیام موجود فراخوانی کنید:
- پس از نوشتن، context کامل session آینهشده را ترجیح دهید، زیرا
afterTurnsnapshot مربوط به session را انتظار دارد، نه فقط نوبت فعلی. - اگر فایل session دوباره باز نشد، به
historyMessages + result.messagesSnapshotfallback کنید.
جریان شبهکد:
const prePromptMessageCount = historyMessages.length;await mirrorTranscriptBestEffort(...);const finalMessages = readMirroredSessionHistoryMessages(params.sessionFile) ?? [...historyMessages, ...result.messagesSnapshot]; await finalizeHarnessContextEngineTurn({ contextEngine: params.contextEngine, promptError: Boolean(finalPromptError), aborted: finalAborted, yieldAborted, sessionIdUsed: params.sessionId, sessionKey: sandboxSessionKey, sessionFile: params.sessionFile, messagesSnapshot: finalMessages, prePromptMessageCount, tokenBudget: params.contextTokenBudget, runtimeContext: buildHarnessContextEngineRuntimeContextFromUsage({ attempt: params, workspaceDir: effectiveWorkspace, agentDir, tokenBudget: params.contextTokenBudget, lastCallUsage: result.attemptUsage, promptCache: result.promptCache, }), runMaintenance: runHarnessContextEngineMaintenance, sessionManager, warn,});اگر mirroring شکست خورد، همچنان afterTurn را با snapshot fallback فراخوانی کنید،
اما log کنید که context engine از دادههای fallback نوبت ingest میکند.
۷. نرمالسازی context زمان اجرای usage و prompt-cache
نتایج Codex، در صورت موجود بودن، شامل usage نرمالشده از اعلانهای token در app-server هستند. آن usage را به context زمان اجرای context-engine پاس دهید.
اگر app-server در Codex در نهایت جزئیات خواندن/نوشتن cache را افشا کند، آنها را به
ContextEnginePromptCacheInfo نگاشت کنید. تا آن زمان، بهجای ساختن صفرهای
مصنوعی، promptCache را حذف کنید.
۸. سیاست Compaction
دو سیستم compaction وجود دارد:
compact()مربوط به context-engine در OpenClawthread/compact/startبومی app-server در Codex
آنها را بیسروصدا با هم یکی نکنید.
/compact و compaction صریح OpenClaw
وقتی context engine انتخابشده info.ownsCompaction === true دارد، compaction
صریح OpenClaw باید نتیجهٔ compact() مربوط به context engine را برای آینهٔ
transcript و وضعیت Plugin در OpenClaw ترجیح دهد.
وقتی harness انتخابشدهٔ Codex یک binding بومی thread دارد، علاوه بر آن میتوانیم برای سالم نگهداشتن thread در app-server، compaction بومی Codex را هم درخواست کنیم، اما این باید در details بهعنوان یک اقدام backend جداگانه گزارش شود.
رفتار پیشنهادی:
- اگر
contextEngine.info.ownsCompaction === true:- ابتدا
compact()مربوط به context-engine را فراخوانی کنید - سپس وقتی binding مربوط به thread وجود دارد، بهصورت best-effort compaction بومی Codex را فراخوانی کنید
- نتیجهٔ context-engine را بهعنوان نتیجهٔ اصلی برگردانید
- وضعیت compaction بومی Codex را در
details.codexNativeCompactionقرار دهید
- ابتدا
- اگر context engine فعال مالک compaction نیست:
- رفتار فعلی compaction بومی Codex را حفظ کنید
این احتمالاً به تغییر extensions/codex/src/app-server/compact.ts یا wrap کردن آن
از مسیر عمومی compaction نیاز دارد، بسته به اینکه maybeCompactAgentHarnessSession(...)
کجا فراخوانی میشود.
رویدادهای contextCompaction بومی Codex درون نوبت
Codex ممکن است در طول یک نوبت رویدادهای item از نوع contextCompaction صادر کند.
انتشار hook فعلی before/after compaction را در event-projector.ts نگه دارید، اما
آن را بهعنوان compaction کاملشدهٔ context-engine تلقی نکنید.
برای engineهایی که مالک compaction هستند، وقتی Codex با این حال compaction بومی انجام میدهد، یک diagnostic صریح صادر کنید:
- نام stream/event: stream موجود
compactionقابل قبول است - details:
{ backend: "codex-app-server", ownsCompaction: true }
این جداسازی را قابل audit میکند.
۹. reset شدن session و رفتار binding
reset(...) موجود در harness Codex، binding app-server در Codex را از فایل session
OpenClaw پاک میکند. این رفتار را حفظ کنید.
همچنین مطمئن شوید cleanup وضعیت context-engine همچنان از مسیرهای lifecycle موجود session در OpenClaw انجام میشود. cleanup مخصوص Codex اضافه نکنید، مگر اینکه lifecycle مربوط به context-engine در حال حاضر رویدادهای reset/delete را برای همهٔ harnessها از دست بدهد.
۱۰. مدیریت خطا
از semantics داخلی OpenClaw پیروی کنید:
- شکستهای bootstrap هشدار میدهند و ادامه میدهند
- شکستهای assemble هشدار میدهند و به پیامها/prompt خط لولهٔ assembleنشده fallback میکنند
- شکستهای afterTurn/ingest هشدار میدهند و finalization پس از نوبت را ناموفق علامتگذاری میکنند
- maintenance فقط پس از نوبتهای موفق، abortنشده و non-yield اجرا میشود
- خطاهای compaction نباید بهعنوان promptهای تازه دوباره تلاش شوند
افزودههای مخصوص Codex:
- اگر projection مربوط به context شکست خورد، هشدار دهید و به prompt اصلی fallback کنید.
- اگر آینهٔ transcript شکست خورد، همچنان finalization مربوط به context-engine را با پیامهای fallback تلاش کنید.
- اگر پس از موفقیت compaction مربوط به context-engine، compaction بومی Codex شکست خورد، وقتی context engine اصلی است، کل compaction OpenClaw را ناموفق نکنید.
برنامهٔ آزمون
آزمونهای unit
آزمونهایی زیر extensions/codex/src/app-server اضافه کنید:
-
run-attempt.context-engine.test.ts- Codex وقتی فایل session وجود دارد
bootstrapرا فراخوانی میکند. - Codex،
assembleرا با پیامهای آینهشده، بودجهٔ token، نام toolها، حالت citations، شناسهٔ مدل، و prompt فراخوانی میکند. systemPromptAdditionدر دستورالعملهای developer قرار میگیرد.- پیامهای assembleشده پیش از درخواست فعلی به prompt projected میشوند.
- Codex پس از mirroring مربوط به transcript،
afterTurnرا فراخوانی میکند. - بدون
afterTurn، CodexingestBatchیاingestتکپیامی را فراخوانی میکند. - maintenance نوبت پس از نوبتهای موفق اجرا میشود.
- maintenance نوبت در صورت خطای prompt، abort، یا yield abort اجرا نمیشود.
- Codex وقتی فایل session وجود دارد
-
context-engine-projection.test.ts- خروجی پایدار برای ورودیهای یکسان
- وقتی history assembleشده شامل prompt فعلی است، prompt فعلی تکراری ایجاد نمیشود
- history خالی را مدیریت میکند
- ترتیب roleها را حفظ میکند
- system prompt addition را فقط در دستورالعملهای developer قرار میدهد
-
compact.context-engine.test.ts- نتیجهٔ اصلی context engine مالک برنده میشود
- وقتی compaction بومی Codex نیز تلاش میشود، وضعیت آن در details ظاهر میشود
- شکست بومی Codex باعث شکست compaction مربوط به context-engine مالک نمیشود
- context engine غیرمالک رفتار فعلی compaction بومی را حفظ میکند
آزمونهای موجود برای بهروزرسانی
extensions/codex/src/app-server/run-attempt.test.tsاگر وجود دارد، در غیر این صورت نزدیکترین آزمونهای اجرای app-server در Codex.extensions/codex/src/app-server/event-projector.test.tsفقط اگر جزئیات رویداد compaction تغییر کند.src/agents/harness/selection.test.tsنباید نیاز به تغییر داشته باشد، مگر اینکه رفتار config تغییر کند؛ باید پایدار بماند.- آزمونهای داخلی harness context-engine باید بدون تغییر همچنان pass شوند.
آزمونهای integration / live
آزمونهای smoke مربوط به harness زندهٔ Codex را اضافه یا گسترش دهید:
plugins.slots.contextEngineرا روی یک engine آزمایشی configure کنیدagents.defaults.modelرا روی یک مدلcodex/*configure کنید- provider/model
agentRuntime.id = "codex"را configure کنید - assert کنید engine آزمایشی موارد زیر را مشاهده کرده است:
- bootstrap
- assemble
- afterTurn یا ingest
- maintenance
از الزام lossless-claw در آزمونهای core OpenClaw پرهیز کنید. از یک Plugin جعلی کوچک context engine درون repo استفاده کنید.
مشاهدهپذیری
اطراف فراخوانیهای lifecycle مربوط به context-engine در Codex، debug log اضافه کنید:
codex context engine bootstrap started/completed/failedcodex context engine assemble appliedcodex context engine finalize completed/failedcodex context engine maintenance skippedهمراه با reasoncodex native compaction completed alongside context-engine compaction
از log کردن promptهای کامل یا محتوای transcript پرهیز کنید.
در جاهایی که مفید است، فیلدهای ساختاریافته اضافه کنید:
sessionIdsessionKeyمطابق با رویهٔ logging موجود redacted یا حذفشدهengineIdthreadIdturnIdassembledMessageCountestimatedTokenshasSystemPromptAddition
migration / سازگاری
این باید backward-compatible باشد:
- اگر هیچ context engineای configure نشده باشد، رفتار legacy context engine باید معادل رفتار امروز harness Codex باشد.
- اگر
assembleمربوط به context-engine شکست بخورد، Codex باید با مسیر prompt اصلی ادامه دهد. - bindingهای موجود thread در Codex باید معتبر بمانند.
- fingerprinting پویای tool نباید خروجی context-engine را شامل شود؛ در غیر این صورت هر تغییر context میتواند یک thread جدید Codex را اجباری کند. فقط catalog مربوط به tool باید fingerprint پویای tool را تحت تأثیر قرار دهد.
پرسشهای باز
-
آیا context assembleشده باید کاملاً در prompt کاربر تزریق شود، کاملاً در دستورالعملهای developer، یا تقسیم شود؟
توصیه: تقسیم شود.
systemPromptAdditionرا در دستورالعملهای developer بگذارید؛ context مربوط به transcript assembleشده را در wrapper مربوط به prompt کاربر قرار دهید. این با protocol فعلی Codex، بدون mutate کردن history بومی thread، بیشترین تطابق را دارد. -
آیا وقتی یک context engine مالک compaction است، compaction بومی Codex باید غیرفعال شود؟
توصیه: نه، نه در ابتدا. compaction بومی Codex ممکن است همچنان برای زنده نگهداشتن thread در app-server لازم باشد. اما باید بهعنوان compaction بومی Codex گزارش شود، نه بهعنوان compaction مربوط به context-engine.
-
آیا
before_prompt_buildباید پیش از assembly مربوط به context-engine اجرا شود یا پس از آن؟توصیه: برای Codex پس از projection مربوط به context-engine، تا hookهای عمومی harness، prompt/دستورالعملهای developer واقعی را که Codex دریافت خواهد کرد ببینند. اگر parity با harness داخلی خلاف این را لازم دارد، ترتیب انتخابشده را در آزمونها encode و اینجا مستند کنید.
-
آیا app-server در Codex میتواند در آینده یک override ساختاریافتهٔ context/history بپذیرد؟
نامشخص است. اگر بتواند، لایهٔ projection متنی را با آن protocol جایگزین کنید و فراخوانیهای lifecycle را بدون تغییر نگه دارید.
معیارهای پذیرش
- یک نوبت harness embedded از نوع
codex/*، lifecycle مربوط به assemble در context engine انتخابشده را invoke میکند. systemPromptAdditionمربوط به context-engine بر دستورالعملهای developer در Codex اثر میگذارد.- context assembleشده بهصورت deterministic بر ورودی نوبت Codex اثر میگذارد.
- نوبتهای موفق Codex،
afterTurnیا fallback ingest را فراخوانی میکنند. - نوبتهای موفق Codex، maintenance نوبت مربوط به context-engine را اجرا میکنند.
- نوبتهای شکستخورده/abortشده/yield-aborted، maintenance نوبت را اجرا نمیکنند.
- compaction تحت مالکیت context-engine برای وضعیت OpenClaw/Plugin اصلی میماند.
- compaction بومی Codex بهعنوان رفتار بومی Codex قابل audit میماند.
- رفتار موجود context-engine در harness داخلی بدون تغییر میماند.
- رفتار موجود harness Codex وقتی هیچ context engine غیرlegacy انتخاب نشده یا وقتی assembly شکست میخورد، بدون تغییر میماند.