Part of Epic #12416 (graduated from Discussion #12412). The runtime self-registration core's boot-envelope mechanism.
Scope note (re-scoped during implementation): Originally bundled the boot envelope and the volatile HarnessPresence registry. The registry half (HarnessPresence record, addressType dispatch, staleness/TTL) was carved into #12422 because it gates on PR #12411 (state vocab) and is a separable concern. This ticket now covers the boot-envelope → overrideMetadata mechanism only — delivered by PR #12421. The graduated design (#12412) is unchanged; only the implementation tracking was split for clean PR↔ticket mapping.
Scope
- Typed boot bootstrap-envelope (env):
{instanceAddress, addressType ∈ userDataDir|pid|tmuxSession|webhookUrl} + appName/adapter. Transport ⟂ instance-address kept separate. NEO_AI_DATA_ROOT resolution is #12417's surface (out of scope here).
- memory-core boot derives wake-route
overrideMetadata from the envelope (the existing WakeSubscriptionService.bootstrap() overrideMetadata parameter is the seam). The durable subscriptionTemplate in identityRoots stays machine-agnostic (NO operator path — per the #11822 [hold-before-PR] catch).
- Fail-closed on a misconfigured envelope (partial config, unknown type, recognized-but-not-yet-dispatchable type) — a non-default instance must never silently fall back to the default route and misroute its wakes. The default instance (no envelope) is routed by the absence of an address (#12407).
Acceptance Criteria
Contract Ledger
| Surface |
Source of Authority |
Behavior |
Fallback |
Evidence |
NEO_HARNESS_INSTANCE_ADDRESS + _TYPE (boot env) |
Epic #12416 / Discussion #12412 address-dim |
typed envelope → overrideMetadata |
both omitted = default instance (route by absence) |
unit |
BootEnvelopeResolver.resolveOverrideMetadata |
this ticket |
pure env → override map; fail-closed on degenerate shapes |
throw → boot IIFE logs + skips (no subscription) |
unit |
| memory-core boot wiring |
WakeSubscriptionService.bootstrap({overrideMetadata}) seam |
inject per-instance address at boot |
bootstrap() with no override (default) |
static + unit; live → #12402 |
Carved out (now #12422)
The volatile HarnessPresence registry (state∪address union), bootId+pid-dead staleness/TTL, generic addressType delivery dispatch, and immediate-requires-fresh-presence — all gating on PR #12411's state vocab.
Related
Epic #12416; Discussion #12412; PR #12421 (delivers this); #12422 (carved-out HarnessPresence registry); #12402 (L3 validation); #11822/#12399/#12407 (wake-routing precedents); #12417 (NEO_AI_DATA_ROOT boundary).
Part of Epic #12416 (graduated from Discussion #12412). The runtime self-registration core's boot-envelope mechanism.
Scope
{instanceAddress, addressType ∈ userDataDir|pid|tmuxSession|webhookUrl}+appName/adapter. Transport ⟂ instance-address kept separate.NEO_AI_DATA_ROOTresolution is #12417's surface (out of scope here).overrideMetadatafrom the envelope (the existingWakeSubscriptionService.bootstrap()overrideMetadataparameter is the seam). The durablesubscriptionTemplateinidentityRootsstays machine-agnostic (NO operator path — per the #11822[hold-before-PR]catch).Acceptance Criteria
overrideMetadatafrom the env-envelope; no operator path enters sharedidentityRoots.userDataDirdispatchable today via the existing daemon; reserved types (pid/tmuxSession/webhookUrl) fail closed until their dispatch lands in #12422.resolveOverrideMetadatamatrix; live 2-instance proof folds with #12402.Contract Ledger
NEO_HARNESS_INSTANCE_ADDRESS+_TYPE(boot env)overrideMetadataBootEnvelopeResolver.resolveOverrideMetadataWakeSubscriptionService.bootstrap({overrideMetadata})seambootstrap()with no override (default)Carved out (now #12422)
The volatile HarnessPresence registry (state∪address union),
bootId+pid-dead staleness/TTL, genericaddressTypedelivery dispatch, andimmediate-requires-fresh-presence — all gating on PR #12411's state vocab.Related
Epic #12416; Discussion #12412; PR #12421 (delivers this); #12422 (carved-out HarnessPresence registry); #12402 (L3 validation); #11822/#12399/#12407 (wake-routing precedents); #12417 (NEO_AI_DATA_ROOT boundary).