Get started
Codex Harness-contextengineport
Status
Concept-implementatiespecificatie.
Doel
Laat de gebundelde Codex app-server-harness hetzelfde OpenClaw context-engine-levenscycluscontract respecteren dat ingebedde OpenClaw-beurten al respecteren.
Een sessie die provider/model agentRuntime.id: "codex" of een codex/*-model gebruikt, moet de geselecteerde context-engine-plugin, zoals lossless-claw, nog steeds contextassemblage, ingest na de beurt, onderhoud en OpenClaw-niveau Compaction-beleid laten beheren voor zover de Codex app-server-grens dat toestaat.
Niet-doelen
- Implementeer Codex app-server-internals niet opnieuw.
- Laat native Codex-thread-Compaction geen lossless-claw-samenvatting produceren.
- Vereis niet dat niet-Codex-modellen de Codex-harness gebruiken.
- Wijzig het gedrag van ACP/acpx-sessies niet. Deze specificatie is alleen voor het niet-ACP-pad van de ingebedde agent-harness.
- Laat externe plugins geen Codex app-server-extensiefabrieken registreren; de bestaande vertrouwensgrens voor gebundelde plugins blijft ongewijzigd.
Huidige architectuur
De ingebedde run-loop lost de geconfigureerde context-engine eenmaal per run op voordat een concrete low-level harness wordt geselecteerd:
src/agents/embedded-agent-runner/run.ts- initialiseert context-engine-plugins
- roept
resolveContextEngine(params.config)aan - geeft
contextEngineencontextTokenBudgetdoor aanrunEmbeddedAttemptWithBackend(...)
runEmbeddedAttemptWithBackend(...) delegeert naar de geselecteerde agent-harness:
src/agents/embedded-agent-runner/run/backend.tssrc/agents/harness/selection.ts
De Codex app-server-harness wordt geregistreerd door de gebundelde Codex Plugin:
extensions/codex/index.tsextensions/codex/harness.ts
De Codex-harnessimplementatie ontvangt dezelfde EmbeddedRunAttemptParams als ingebouwde OpenClaw-pogingen:
extensions/codex/src/app-server/run-attempt.ts
Dat betekent dat het vereiste hookpunt in door OpenClaw beheerde code zit. De externe grens is het Codex app-server-protocol zelf: OpenClaw kan beheren wat het naar thread/start, thread/resume en turn/start stuurt, en kan notificaties observeren, maar het kan Codex' interne threadopslag of native compactor niet wijzigen.
Huidige kloof
Ingebouwde OpenClaw-pogingen roepen de context-engine-levenscyclus direct aan:
- bootstrap/onderhoud vóór de poging
- assemble vóór de modelaanroep
- afterTurn of ingest na de poging
- onderhoud na een geslaagde beurt
- context-engine-Compaction voor engines die Compaction beheren
Relevante OpenClaw-code:
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
Codex app-server-pogingen voeren momenteel generieke agent-harness-hooks uit en spiegelen het transcript, maar roepen params.contextEngine.bootstrap, params.contextEngine.assemble, params.contextEngine.afterTurn, params.contextEngine.ingestBatch, params.contextEngine.ingest of params.contextEngine.maintain niet aan.
Relevante Codex-code:
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
Gewenst gedrag
Voor Codex-harnessbeurten moet OpenClaw deze levenscyclus behouden:
- Lees het gespiegelde OpenClaw-sessietranscript.
- Bootstrap de actieve context-engine wanneer er een vorig sessiebestand bestaat.
- Voer bootstraponderhoud uit wanneer beschikbaar.
- Assembleer context met de actieve context-engine.
- Converteer de geassembleerde context naar Codex-compatibele invoer.
- Start of hervat de Codex-thread met ontwikkelaarsinstructies die eventuele context-engine-
systemPromptAdditionbevatten. - Start de Codex-beurt met de geassembleerde gebruikersgerichte prompt.
- Spiegel het Codex-resultaat terug naar het OpenClaw-transcript.
- Roep
afterTurnaan indien geïmplementeerd, andersingestBatch/ingest, met de gespiegelde transcriptsnapshot. - Voer beurtonderhoud uit na geslaagde, niet-afgebroken beurten.
- Behoud native Codex-Compaction-signalen en OpenClaw-Compaction-hooks.
Ontwerpbeperkingen
Codex app-server blijft canoniek voor native threadstatus
Codex beheert zijn native thread en eventuele interne uitgebreide geschiedenis. OpenClaw moet niet proberen de interne geschiedenis van de app-server te muteren, behalve via ondersteunde protocolaanroepen.
OpenClaw's transcriptspiegel blijft de bron voor OpenClaw-functies:
- chatgeschiedenis
- zoeken
/new- en/reset-boekhouding- toekomstige model- of harnesswissels
- context-engine-pluginstatus
Context-engineassemblage moet naar Codex-invoer worden geprojecteerd
De context-engine-interface retourneert OpenClaw AgentMessage[], geen Codex-threadpatch. Codex app-server turn/start accepteert een huidige gebruikersinvoer, terwijl thread/start en thread/resume ontwikkelaarsinstructies accepteren.
Daarom heeft de implementatie een projectielaag nodig. De veilige eerste versie moet vermijden te doen alsof die Codex' interne geschiedenis kan vervangen. Ze moet geassembleerde context injecteren als deterministisch prompt-/ontwikkelaarsinstructiemateriaal rond de huidige beurt.
Prompt-cachestabiliteit is belangrijk
Voor engines zoals lossless-claw moet de geassembleerde context deterministisch zijn voor ongewijzigde invoer. Voeg geen tijdstempels, willekeurige id's of niet-deterministische ordening toe aan gegenereerde contexttekst.
Runtime-selectiesemantiek verandert niet
Harnessselectie blijft zoals die is:
runtime: "openclaw"selecteert de ingebouwde OpenClaw-harnessruntime: "codex"selecteert de geregistreerde Codex-harnessruntime: "auto"laat plugin-harnesses ondersteunde providers claimen- niet-gematchte
auto-runs gebruiken de ingebouwde OpenClaw-harness
Dit werk verandert wat er gebeurt nadat de Codex-harness is geselecteerd.
Implementatieplan
1. Exporteer of verplaats herbruikbare context-engine-poginghelpers
Vandaag staan de herbruikbare levenscyclushelpers onder de ingebedde agentrunner:
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 moet harness-neutrale helpers importeren in plaats van in runnerimplementatiedetails te grijpen.
Maak een harness-neutrale module, bijvoorbeeld:
src/agents/harness/context-engine-lifecycle.ts
Verplaats of herexporteer:
runAttemptContextEngineBootstrapassembleAttemptContextEnginefinalizeAttemptContextEngineTurnbuildAfterTurnRuntimeContextbuildAfterTurnRuntimeContextFromUsage- een kleine wrapper rond
runContextEngineMaintenance
Werk de aanroeppunten van de ingebouwde harness in dezelfde PR bij.
De neutrale helpernamen mogen de ingebouwde harness niet noemen.
Voorgestelde namen:
bootstrapHarnessContextEngineassembleHarnessContextEnginefinalizeHarnessContextEngineTurnbuildHarnessContextEngineRuntimeContextrunHarnessContextEngineMaintenance
2. Voeg een Codex-contextprojectiehelper toe
Voeg een nieuwe module toe:
extensions/codex/src/app-server/context-engine-projection.ts
Verantwoordelijkheden:
- Accepteer de geassembleerde
AgentMessage[], oorspronkelijke gespiegelde geschiedenis en huidige prompt. - Bepaal welke context in ontwikkelaarsinstructies hoort en welke in de huidige gebruikersinvoer.
- Behoud de huidige gebruikersprompt als het laatste uitvoerbare verzoek.
- Render eerdere berichten in een stabiel, expliciet formaat.
- Vermijd vluchtige metadata.
Voorgestelde 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;Aanbevolen eerste projectie:
- Plaats
systemPromptAdditionin ontwikkelaarsinstructies. - Plaats de geassembleerde transcriptcontext vóór de huidige prompt in
promptText. - Label die duidelijk als door OpenClaw geassembleerde context.
- Houd de huidige prompt als laatste.
- Sluit dubbele huidige gebruikersprompt uit als die al aan het einde voorkomt.
Voorbeeldpromptvorm:
OpenClaw assembled context for this turn: <conversation_context>[user]... [assistant]...</conversation_context> Current user request:...Dit is minder elegant dan native Codex-geschiedenischirurgie, maar het is implementeerbaar binnen OpenClaw en behoudt context-engine-semantiek.
Toekomstige verbetering: als Codex app-server een protocol beschikbaar maakt voor het vervangen of aanvullen van threadgeschiedenis, wijzig deze projectielaag dan om die API te gebruiken.
3. Sluit bootstrap aan vóór Codex-threadopstart
In extensions/codex/src/app-server/run-attempt.ts:
- Lees gespiegelde sessiegeschiedenis zoals vandaag.
- Bepaal of het sessiebestand vóór deze run bestond. Geef de voorkeur aan een helper die
fs.stat(params.sessionFile)controleert vóór spiegelingswrites. - Open een
SessionManagerof gebruik een smalle sessiemanageradapter als de helper die vereist. - Roep de neutrale bootstraphelper aan wanneer
params.contextEnginebestaat.
Pseudo-flow:
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,});Gebruik dezelfde sessionKey-conventie als de Codex-toolbrug en transcriptspiegel. Vandaag berekent Codex sandboxSessionKey uit params.sessionKey of params.sessionId; gebruik dat consistent, tenzij er een reden is om ruwe params.sessionKey te behouden.
4. Sluit assemble aan vóór thread/start / thread/resume en turn/start
In runCodexAppServerAttempt:
- Bouw eerst dynamische tools, zodat de context-engine de daadwerkelijk beschikbare toolnamen ziet.
- Lees gespiegelde sessiegeschiedenis.
- Voer context-engine
assemble(...)uit wanneerparams.contextEnginebestaat. - Projecteer het geassembleerde resultaat naar:
- toevoeging aan ontwikkelaarsinstructies
- prompttekst voor
turn/start
De bestaande hookaanroep:
resolveAgentHarnessBeforePromptBuildResult({ prompt: params.prompt, developerInstructions: buildDeveloperInstructions(params), messages: historyMessages, ctx: hookContext,});moet contextbewust worden:
- bereken basisontwikkelaarsinstructies met
buildDeveloperInstructions(params) - pas context-engineassemblage/-projectie toe
- voer
before_prompt_builduit met de geprojecteerde prompt/ontwikkelaarsinstructies
Deze volgorde laat generieke prompthooks dezelfde prompt zien die Codex zal ontvangen. Als strikte OpenClaw-pariteit nodig is, voer context-engineassemblage dan uit vóór hookcompositie, omdat de ingebouwde harness context-engine-systemPromptAddition toepast op de uiteindelijke systeemprompt na de promptpipeline. De belangrijke invariant is dat zowel context-engine als hooks een deterministische, gedocumenteerde volgorde krijgen.
Aanbevolen volgorde voor de eerste implementatie:
buildDeveloperInstructions(params)- context-engine
assemble() - voeg
systemPromptAdditiontoe aan ontwikkelaarsinstructies, vooraf of achteraf - projecteer geassembleerde berichten naar prompttekst
resolveAgentHarnessBeforePromptBuildResult(...)- geef uiteindelijke ontwikkelaarsinstructies door aan
startOrResumeThread(...) - geef uiteindelijke prompttekst door aan
buildTurnStartParams(...)
De specificatie moet in tests worden vastgelegd zodat toekomstige wijzigingen de volgorde niet per ongeluk veranderen.
5. Behoud prompt-cache-stabiele opmaak
De projectiehelper moet byte-stabiele uitvoer produceren voor identieke invoer:
- stabiele berichtvolgorde
- stabiele rollabels
- geen gegenereerde tijdstempels
- geen lekkage van object-sleutelvolgorde
- geen willekeurige scheidingstekens
- geen per-run-id's
Gebruik vaste scheidingstekens en expliciete secties.
6. Sluit post-turn aan na transcriptspiegeling
Codex' CodexAppServerEventProjector bouwt een lokale messagesSnapshot voor de
huidige beurt. mirrorTranscriptBestEffort(...) schrijft die momentopname naar de
OpenClaw-transcriptspiegel.
Nadat spiegelen slaagt of faalt, roep je de context-enginefinalizer aan met de best beschikbare berichtmomentopname:
- Geef de voorkeur aan volledige gespiegelde sessiecontext na de schrijfactie, omdat
afterTurnde sessiemomentopname verwacht, niet alleen de huidige beurt. - Val terug op
historyMessages + result.messagesSnapshotals het sessiebestand niet opnieuw kan worden geopend.
Pseudoflow:
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,});Als spiegelen mislukt, roep dan nog steeds afterTurn aan met de fallbackmomentopname, maar log
dat de context engine gegevens inneemt uit fallbackbeurtgegevens.
7. Gebruik en prompt-cache-runtimecontext normaliseren
Codex-resultaten bevatten genormaliseerd gebruik uit app-servertokenmeldingen wanneer beschikbaar. Geef dat gebruik door aan de context-engine-runtimecontext.
Als de Codex-app-server uiteindelijk cachelees-/schrijfdetails beschikbaar stelt, map die dan naar
ContextEnginePromptCacheInfo. Laat tot die tijd promptCache weg in plaats van
nullen te verzinnen.
8. Compaction-beleid
Er zijn twee Compaction-systemen:
- OpenClaw context-engine
compact() - Codex app-server native
thread/compact/start
Voeg ze niet stilzwijgend samen.
/compact en expliciete OpenClaw-Compaction
Wanneer de geselecteerde context engine info.ownsCompaction === true heeft, moet expliciete
OpenClaw-Compaction de voorkeur geven aan het compact()-resultaat van de context engine voor
de OpenClaw-transcriptspiegel en Plugin-status.
Wanneer de geselecteerde Codex-harness een native threadbinding heeft, kunnen we daarnaast Codex-native Compaction aanvragen om de app-serverthread gezond te houden, maar dit moet in details als een afzonderlijke backendactie worden gerapporteerd.
Aanbevolen gedrag:
- Als
contextEngine.info.ownsCompaction === true:- roep eerst context-engine
compact()aan - roep daarna best-effort Codex-native Compaction aan wanneer er een threadbinding bestaat
- retourneer het context-engineresultaat als het primaire resultaat
- neem de status van Codex-native Compaction op in
details.codexNativeCompaction
- roep eerst context-engine
- Als de actieve context engine geen eigenaar is van Compaction:
- behoud het huidige gedrag voor Codex-native Compaction
Dit vereist waarschijnlijk een wijziging in extensions/codex/src/app-server/compact.ts of
een wrapper vanuit het generieke Compaction-pad, afhankelijk van waar
maybeCompactAgentHarnessSession(...) wordt aangeroepen.
In-turn Codex-native contextCompaction-events
Codex kan tijdens een beurt contextCompaction-itemevents uitsturen. Behoud de huidige
emissie van before/after-Compaction-hooks in event-projector.ts, maar behandel
dat niet als een voltooide context-engine-Compaction.
Voor engines die eigenaar zijn van Compaction, emit je een expliciete diagnostische melding wanneer Codex toch native Compaction uitvoert:
- stream-/eventnaam: bestaande
compaction-stream is acceptabel - details:
{ backend: "codex-app-server", ownsCompaction: true }
Dit maakt de splitsing controleerbaar.
9. Sessiereset en bindingsgedrag
De bestaande Codex-harness reset(...) wist de Codex-app-serverbinding uit
het OpenClaw-sessiebestand. Behoud dat gedrag.
Zorg er ook voor dat opschoning van context-engine-status via bestaande OpenClaw-sessielevenscycluspaden blijft verlopen. Voeg geen Codex-specifieke opschoning toe, tenzij de context-enginelevenscyclus momenteel reset-/delete-events mist voor alle harnesses.
10. Foutafhandeling
Volg ingebouwde OpenClaw-semantiek:
- bootstrapfouten waarschuwen en gaan door
- assemble-fouten waarschuwen en vallen terug op niet-geassembleerde pipelineberichten/prompt
- afterTurn-/ingest-fouten waarschuwen en markeren post-turn-finalisatie als onsuccesvol
- onderhoud draait alleen na geslaagde, niet-afgebroken beurten zonder yield
- Compaction-fouten mogen niet opnieuw worden geprobeerd als nieuwe prompts
Codex-specifieke aanvullingen:
- Als contextprojectie mislukt, waarschuw dan en val terug op de oorspronkelijke prompt.
- Als transcriptspiegeling mislukt, probeer dan nog steeds context-enginefinalisatie met fallbackberichten.
- Als Codex-native Compaction mislukt nadat context-engine-Compaction is geslaagd, laat dan niet de hele OpenClaw-Compaction falen wanneer de context engine primair is.
Testplan
Unittests
Voeg tests toe onder extensions/codex/src/app-server:
-
run-attempt.context-engine.test.ts- Codex roept
bootstrapaan wanneer er een sessiebestand bestaat. - Codex roept
assembleaan met gespiegelde berichten, tokenbudget, toolnamen, citatiemodus, model-id en prompt. systemPromptAdditionwordt opgenomen in developer-instructies.- Geassembleerde berichten worden vóór het huidige verzoek in de prompt geprojecteerd.
- Codex roept
afterTurnaan na transcriptspiegeling. - Zonder
afterTurnroept CodexingestBatchof per-berichtingestaan. - Beurtonderhoud draait na geslaagde beurten.
- Beurtonderhoud draait niet bij promptfout, afbreken of yield-afbreken.
- Codex roept
-
context-engine-projection.test.ts- stabiele uitvoer voor identieke invoer
- geen dubbele huidige prompt wanneer geassembleerde geschiedenis die bevat
- verwerkt lege geschiedenis
- behoudt rolvolgorde
- neemt systeem-prompttoevoeging alleen op in developer-instructies
-
compact.context-engine.test.ts- primair resultaat van eigenaar-context engine wint
- status van Codex-native Compaction verschijnt in details wanneer die ook is geprobeerd
- Codex-native fout laat eigenaar-context-engine-Compaction niet falen
- niet-eigenaar context engine behoudt huidig native Compaction-gedrag
Bestaande tests om bij te werken
extensions/codex/src/app-server/run-attempt.test.tsindien aanwezig, anders de dichtstbijzijnde Codex-app-serverruntests.extensions/codex/src/app-server/event-projector.test.tsalleen als details van Compaction-events wijzigen.src/agents/harness/selection.test.tszou geen wijzigingen nodig moeten hebben, tenzij configuratiegedrag wijzigt; die moet stabiel blijven.- Ingebouwde harness-context-enginetests moeten ongewijzigd blijven slagen.
Integratie-/livetests
Voeg live Codex-harness-smoketests toe of breid ze uit:
- configureer
plugins.slots.contextEnginenaar een testengine - configureer
agents.defaults.modelnaar eencodex/*-model - configureer provider/model
agentRuntime.id = "codex" - verifieer dat de testengine het volgende observeerde:
- bootstrap
- assemble
- afterTurn of ingest
- onderhoud
Vermijd dat lossless-claw vereist is in OpenClaw-coretests. Gebruik een kleine in-repo fake context-engine-Plugin.
Observeerbaarheid
Voeg debuglogs toe rond Codex context-engine-levenscyclusaanroepen:
codex context engine bootstrap started/completed/failedcodex context engine assemble appliedcodex context engine finalize completed/failedcodex context engine maintenance skippedmet redencodex native compaction completed alongside context-engine compaction
Log geen volledige prompts of transcriptinhoud.
Voeg gestructureerde velden toe waar nuttig:
sessionIdsessionKeygeredigeerd of weggelaten volgens bestaande loggingpraktijkengineIdthreadIdturnIdassembledMessageCountestimatedTokenshasSystemPromptAddition
Migratie / compatibiliteit
Dit moet achterwaarts compatibel zijn:
- Als er geen context engine is geconfigureerd, moet legacy context-enginegedrag gelijkwaardig zijn aan het huidige Codex-harnessgedrag.
- Als context-engine
assemblemislukt, moet Codex doorgaan met het oorspronkelijke promptpad. - Bestaande Codex-threadbindingen moeten geldig blijven.
- Dynamische toolfingerprinting mag geen context-engine-uitvoer bevatten; anders kan elke contextwijziging een nieuwe Codex-thread afdwingen. Alleen de toolcatalogus mag invloed hebben op de dynamische toolfingerprint.
Open vragen
-
Moet geassembleerde context volledig in de gebruikersprompt worden geïnjecteerd, volledig in developer-instructies, of gesplitst?
Aanbeveling: splitsen. Plaats
systemPromptAdditionin developer-instructies; plaats geassembleerde transcriptcontext in de wrapper voor de gebruikersprompt. Dit sluit het best aan bij het huidige Codex-protocol zonder native threadgeschiedenis te muteren. -
Moet Codex-native Compaction worden uitgeschakeld wanneer een context engine eigenaar is van Compaction?
Aanbeveling: nee, aanvankelijk niet. Codex-native Compaction kan nog steeds nodig zijn om de app-serverthread actief te houden. Maar het moet worden gerapporteerd als native Codex-Compaction, niet als context-engine-Compaction.
-
Moet
before_prompt_buildvóór of na context-engine-assembly draaien?Aanbeveling: na context-engineprojectie voor Codex, zodat generieke harnesshooks de daadwerkelijke prompt/developer-instructies zien die Codex zal ontvangen. Als pariteit met ingebouwde harnesses het tegenovergestelde vereist, leg dan de gekozen volgorde vast in tests en documenteer die hier.
-
Kan de Codex-app-server in de toekomst een gestructureerde context-/geschiedenisoverride accepteren?
Onbekend. Als dat kan, vervang dan de tekstprojectielaag door dat protocol en houd de levenscyclusaanroepen ongewijzigd.
Acceptatiecriteria
- Een
codex/*embedded harnessbeurt roept de assemble-levenscyclus van de geselecteerde context engine aan. - Een context-engine
systemPromptAdditionbeïnvloedt Codex developer-instructies. - Geassembleerde context beïnvloedt de invoer van de Codex-beurt deterministisch.
- Geslaagde Codex-beurten roepen
afterTurnof ingest-fallback aan. - Geslaagde Codex-beurten draaien context-engine-beurtonderhoud.
- Mislukte/afgebroken/yield-afgebroken beurten draaien geen beurtonderhoud.
- Context-engine-owned Compaction blijft primair voor OpenClaw-/Plugin-status.
- Codex-native Compaction blijft controleerbaar als native Codex-gedrag.
- Bestaand ingebouwd harness-context-enginegedrag is ongewijzigd.
- Bestaand Codex-harnessgedrag is ongewijzigd wanneer geen non-legacy context engine is geselecteerd of wanneer assembly mislukt.