This subsystem makes promises along these axes; each axis has its own compatibility tier:
| Axis | Stability tier (at 0.22) | Notes |
|---|---|---|
| Wire protocol envelope shape | Frozen | {ok, result} and {ok, error: {code, details}} shapes are stable. |
system.capabilities schema |
Additive-only | New fields under supports.* are additive; clients ignore unknown keys. |
supports.jobs.kinds membership and order |
Frozen | Byte-for-byte preserved from earlier freeze. Adding a kind is a major bump. |
Per-code error.details shape (7 lifecycle codes) |
Frozen | script_blocker_lint, script_busy, script_external_declaration_not_allowed, script_compile_error, script_timeout, script_statement_budget_exceeded, script_runtime_error. Adding a field to any of these is a major bump. |
| Request-validation tier error codes | Additive-only | New codes (e.g., consent_required in 0.9) may be introduced without major bump provided existing codes' details shapes are preserved. |
| Game-mode support | Best-effort | Verified against FO4; other modes inherit by structure but are not warranty-tested. |
Current: 0.22 (bounded daemon-surface compatibility fixes; Phase 17 runtime verification pending)
- 0.6: Phase 6A jobs/file-hygiene
- 0.7-0.9: Phase 6B/6C/6D + 6E freeze
- 0.10: Phase 12 (Starfield .esp write enablement)
- 0.11: Phase 13 — 9 new
elements.*verbs + 2 backward-compatible extensions - 0.12: Phase 14 —
supports.stringDecodingUTF-8 inline decode disclosure - 0.13: Phase 15A —
supports.childGroupNavigationand\Child Groupread-side navigation - 0.14: Phase 15B —
supports.applyFilterExtensions,parentFormId, and*Regexfilter fields - 0.15: Phase 15C —
supports.referencesRecursive,supports.conflictStatusChildGroup,records.references.recursive, and additiverecords.conflict_status.result.childGroup - 0.16: Phase 15D —
supports.createParentSpecand optionalrecords.create.parentfor CELL/DIAL/QUST ChildGroup authoring - 0.17: Phase 15H —
supports.elementsChildrenPaginationand optionalelements.children.limit/offsetpagination with additive response metadata - 0.18: Phase 15E — extends
supports.createParentSpecand optionalrecords.create.parentfor WRLD persistent/exterior CELL authoring - 0.19: Phase 15F —
supports.reverseNavigationand optionalincludeParents:trueon read verbs to emitrelations.parents - 0.20: Phase 15G —
supports.applyFilterExtensions.multiPatternand scalar-or-array OR semantics forrecords.apply_filteridentifier pattern/regex fields - 0.21: Phase 16 —
records.apply_filteroffset pagination,limit>100rejection, and Starfield small/localized header-flag capability updates - 0.22: bounded daemon-surface fixes — locator
pathomission defaults to"", andrecords.copy_intoreports native Reflection / Unmapped FormID nil-copy reasons when diagnosed
- Changed: locator
pathis no longer field-presence-required. Omittedpathdefaults to the record root and resolves identically topath:"". - Preserved:
fileremains required,formIdremains optional unless a command explicitly requires record identity, and resolver semantics are otherwise unchanged. - Changed: when
records.copy_intoreceives nil from nativewbCopyElementToFile, it still returnsmutation_not_allowedbut now forwards the diagnosed native Starfield Reflection refusal or Unmapped FormID / missing-game-master refusal instead of collapsing both to the generic copied-record identification message. - Preserved: unrecognized nil-copy failures keep the pre-0.22 generic message.
- Added:
records.apply_filter.limitdefaults to 100 and is capped at 100 hits per page.limit > 100is rejected asinvalid_requestinstead of silently clamping. - Added:
records.apply_filter.offsetcounts matched records, not raw record indices. Responses includeoffset,limit,truncated, andnextOffsetwhen another page is available. - Added:
supports.applyFilterExtensions.paginationdocuments the cursor field, max/default limit, over-cap rejection, and matched-record offset semantics. - Added:
supports.filesCreate.flagsandsupports.fileHygiene.headerFlagsadvertisesmallandlocalized;smallis an alias ofeslfor the Starfield light slot, and summaries/header readbacks expose localized state.
Design: docs/plans/2026-06-15-xedit-phase15g-apply-filter-multi-pattern-design.md.
- Added: the five existing glob fields and five existing regex fields under
records.apply_filternow accept either a scalar string or an array of strings. Scalar strings preserve the pre-0.20 behavior as a length-1 internal array. - Added: within one
*Patternor*Regexarray, matching uses OR semantics. Predicates across different fields remain AND-composed. - Added: request-boundary
invalid_requestwitherror.details.invalidFieldfor empty arrays, arrays longer than 32 entries, or non-string array elements. - Added:
supports.applyFilterExtensions.multiPatterncapability block declaring scalar/array support,maxArrayLength:32,semantics:"OR", and the ten fields to which it applies. - Preserved: same-identifier
*Pattern+*Regexconflicts are still rejected, regex timeout and slot-saturation accounting remains per regex evaluation, and all scalar Phase 15Bapply_filterbehavior remains backward-compatible.
Design: docs/plans/2026-06-15-xedit-phase15f-reverse-navigation-design.md.
- Added: optional
includeParentsboolean arg, defaultfalse, onrecords.get,records.find_by_form_id,records.find_by_editor_id,records.master_or_self,records.winning_override,elements.get, andelements.children. - Added: when
includeParents:true, each affected record/entry getsrelations.parents, an array of standard shallow record summaries with locators. The order is nearest-first and the depth is capped at 16. - Added: top-level records return
relations.parents: []when explicitly requested. When omitted or false,relations.parentsis absent to preserve pre-0.19 response shape. - Added:
supports.reverseNavigationcapability block documenting the opt-in arg, applies-to verb list, relation key, max depth, and ordering.
Design: docs/plans/2026-06-15-xedit-phase15e-wrld-parent-spec-design.md.
- Added:
WRLDtosupports.createParentSpec.supportedParents. - Added:
records.create.parentWRLD shapes for CELL authoring:subGroup:"Persistent"returns or creates the persistent worldspace CELL, andcoords:[x,y]creates or returns the exterior CELL at signed int16 grid coords through xEdit's nativeCELL[x,y]path. - Added:
supports.createParentSpec.subGroupVocabulary.WRLD:["Persistent"],wrldCoords:true, andwrldRequiresCellSignature:true. - Evolved: the Phase 15D WRLD deferral fields remain present for additive
system.capabilitiesclients. In 0.18+,unsupportedParentsis the empty array[], andwrldDeferralReasonis retained as the sentinel"superseded-by-0.18"because WRLD is no longer deferred. - Unchanged: non-CELL signatures under WRLD parents fail with
invalid_request; create signature validity otherwise remains native xEdit behavior with no CLI-side signature allowlist.
Design: docs/plans/2026-06-15-xedit-phase15h-elements-children-pagination-design.md.
- Added: optional
elements.children.limitinteger, default200, valid range1..1000inclusive. Values outside that range returninvalid_request. - Added: optional
elements.children.offsetinteger, default0, valid range>= 0. Negative values returninvalid_request. - Added: response fields
count,total,offset, andtruncatedbeside the existingchildrenarray.totalis the native immediate-child count and does not include synthetic ChildGroup stubs. - Preserved: the Phase 15A
object.kind:"child_group"navigation stub remains additive, but now appears only on the first page (offset:0) and counts as a returned entry, not as part oftotal. - Added:
supports.elementsChildrenPaginationcapability block documenting the default limit, maximum limit, and response metadata fields.
Design: docs/plans/2026-06-15-xedit-phase15d-records-create-parent-spec-design.md.
- Added: optional
records.create.parent = {file, formId, subGroup?}. When supplied,records.createauthors into the addressed parent record's ChildGroup instead of a top-level file group. - Supported parents:
CELL,DIAL, andQUST.CELLacceptssubGroup: "Persistent" | "Temporary" | "Visible when Distant"; omittedsubGroupdefaultsREFR/ACHR/PGRD/LAND/NAVMtoTemporaryand other signatures toPersistent. - Deferred:
WRLDparent-spec returnsinvalid_requestwitherror.details.unsupportedParent: "WRLD"because Block/Sub-Block parent resolution is a later-phase problem. - Added:
supports.createParentSpeccapability block documenting supported parents, CELL subgroup vocabulary, defaults, and WRLD deferral. - Unchanged: callers omitting
parentkeep the pre-0.16 top-levelrecords.createbehavior. Signature support remains native xEdit behavior; no CLI-side signature allowlist was added.
Design: docs/plans/2026-06-15-xedit-phase15c-references-conflict-childgroup-descent-design.md.
- Added: optional
records.references.recursiveboolean argument. Default remainsfalse; when true on a populated ChildGroup-owning record, the response unions outgoing references from ChildGroup-owned child records and applies dedup/limit semantics to the aggregate result. - Added:
records.conflict_status.result.childGroup, omitted when the target has no populated ChildGroup. The sub-block reports aggregate child count, per-signature totals/conflicting counts,hasConflict, and a cappedconflictingHitssummary list. - Added:
supports.referencesRecursiveandsupports.conflictStatusChildGroupcapability blocks describing the opt-in recursion flag and childGroup conflict result block. - Unchanged: existing
records.referencesshallow behavior whenrecursiveis omitted/false, and existing main-recordrecords.conflict_statusfields.
Design: docs/plans/2026-06-15-xedit-phase15b-apply-filter-parent-and-regex-design.md.
- Added:
records.apply_filter.parentFormId, a read-only predicate that matches records whose xEdit container/ChildGroup ownership chain contains the supplied load-order MainRecord FormID. - Added: five regex alternatives to existing glob fields:
editorIdRegex,displayNameRegex,fullNameRegex,baseEditorIdRegex, andbaseDisplayNameRegex. - Added:
supports.applyFilterExtensionscapability block describing the parent predicate, regex engine (System.RegularExpressions.TRegEx), fields, case-insensitive partial-match behavior, pattern/regex conflict rule, andresult.regexTimeoutsmetadata field. - Added: request-boundary
invalid_requestdetails withinvalidFieldfor invalid regex syntax and same-field pattern/regex conflicts. - Unchanged: existing glob fields and non-regex
records.apply_filterresponse envelope. The optionalregexTimeoutsfield is omitted when zero.
New commands:
elements.set_native_valueelements.set_to_defaultelements.clearelements.move_up,elements.move_downelements.next_member,elements.previous_memberelements.edit_capabilitieselements.assign_templates
Extended (backward-compatible) commands:
elements.add_child— optionaltargetIndex,templateIndex,templateNameelements.copy_child_to— optionaltargetIndex,addRequiredMasters(defaultfalse)
New capability block: supports.elementsMutation (see contract-reference.md).
Frozen Phase 6E supports.jobs.kinds membership and order unchanged.
- Added:
supports.childGroupNavigationcapability block advertising the\Child Grouplocator prefix, the four parent signatures (CELL / WRLD / DIAL / QUST), the sub-label vocabulary, the GroupType integer mapping, and therecordLocatorReentry: trueflag. - Extended:
elements.childrenappends a trailingobject.kind:"child_group"navigation stub when the target record has a non-emptyIwbMainRecord.ChildGroup. - Extended: locator-path resolver accepts the
\Child Groupprefix on the read side (xeAutomationRequireElement); the prefix is rejected on the write side (xeAutomationRequireOwnedElement) — synthetic ChildGroup paths are navigation-only. Mutate child records via their flat FormID locator. - Unchanged: all existing verbs, signatures, and response envelopes for paths
that do NOT start with
\Child Group. Backward compatibility verified by CG-BWC-001 on the MO2-backed FO4 harness.
Note: clients should not assume new object.kind enum values are exhaustive.
Forward compatibility requires that unknown kind values are ignored.
The 0.22 public wrapper-facing contract surface comprises:
- Wire envelope shapes:
{ok: true, result: <value>}for success;{ok: false, error: {code: <string>, details: <object>}}for failure. Both shapes are stable across0.xversions. system.capabilitiesschema: top-levelcontractVersion(string),supports.transport.*,supports.jobs.kinds(frozen membership and order — see below),supports.jobs.options,supports.scripts.execution.*includingoverlapPolicy = "single-process-single-runner",busyHolders,failureMessagesOnError, the new-in-0.9iKnowWhatImDoingboolean reflecting daemon launch state, and the additivesupports.elementsMutation,supports.stringDecoding,supports.childGroupNavigation,supports.applyFilterExtensions,supports.referencesRecursive,supports.conflictStatusChildGroup,supports.createParentSpec,supports.elementsChildrenPagination, andsupports.reverseNavigationblocks introduced through 0.22.supports.jobs.kindsmembership and order: byte-for-byte preserved from the earlier freeze. The exact list is enumerated incontract-reference.md. Adding, removing, or reordering any kind is a major bump.- Per-code
error.detailsshape for the 7 lifecycle codes:script_blocker_lint,script_busy,script_external_declaration_not_allowed,script_compile_error,script_timeout,script_statement_budget_exceeded,script_runtime_error. The full per-code field set is documented incontract-reference.mdand is preserved byte-for-byte from0.8into0.9. Adding a field to any of these codes is a major bump. - New request-validation tier error code
consent_required:error.details = {deniedReason: string, commandName: string, mutationCategory: string}. Returned at the request boundary when a mutating command is issued against a daemon launched without-IKnowWhatImDoing. Does NOT carry script-lifecycle fields (messages,messagesTruncated,ranInitialize, etc.) because no script execution has begun. - Locator semantics: file-by-name and master-by-id resolution rules from
0.8are preserved. As of 0.22, omittedpathdefaults to"". - Durability semantics:
session.savesaved-files vs pending-shutdown distinction from0.8is preserved.
The full schema reference, per-field types, and per-command envelope examples live in contract-reference.md.
- Renaming any field present in
0.22. - Removing any field present in
0.22. - Semantically narrowing the meaning of any field present in
0.22. - Adding a member to or reordering
supports.jobs.kinds. - Adding a field to or modifying any frozen 7-code lifecycle
error.detailsshape.
- New fields under
supports.*subtrees. - New request-validation tier error codes with their own
error.detailsshapes. - New examples in the
examples/directory.
A 1.0 or later 0.x bump is triggered by any breaking change as defined above. The capability descriptor contractVersion documents the current major/minor contract version.
A future async scripts.run or worker-thread script execution requires moving daemon execution off the GUI thread. That is a 1.x change with explicit migration documentation, not a 0.x additive evolution. Clients that depend on synchronous semantics today are safe.