Skip to content

v0.13.0

Choose a tag to compare

@github-actions github-actions released this 14 Oct 10:49
· 31 commits to main since this release

The browser-substrate ADR-0129 integration (the kernel owns every process), with the synchronous-child ownership
below. Each feature is additive and announced by a marker a host checks before it relies on it, so an engine without
it is never asked; none changes the lowered text, so the prepared format stays tabnode-prepared-7. Cut as 0.13.0, a
minor release, for the new public run options and exports.

  • The engine as a client of the kernel's store, its citations naming ADR-0006 on this line.
  • A run's fd 0 can be a reader over the host kernel's own pipe (RunOptions.stdinReader; marker RUN_STDIN_READER).
  • A process's signal listeners are its dispositions, told to its registry (ProcessRegistry.disposition; marker
    RUN_SIGNAL_DISPOSITIONS); a listener's name reaches the disposition words only as a signal's own name.
  • Behaviour change for a host whose registry sets ProcessRegistry.kernel: a host-run child's kill() now goes
    through the kernel registry (the kernel delivers it), where 0.12.0 ended the run itself. A kernel refusal (EPERM)
    is thrown out of ChildProcess.kill(), and SIGSTOP and SIGCONT are delivered as SIGTERM (no stop is modelled
    yet). A host that does not set kernel is unchanged.
  • A run handed its own tree gets that tree's shell at routing, and run() reads RunOptions.filesystem as runNode
    does (marker RUN_LINE_FILESYSTEM); tokenOfPid takes the caller's pid namespace.
  • A run's initial environment is published with its identity, for the process table's /proc/<pid>/environ.
  • A TCP server or Unix-socket listener passed over IPC is a duplicate of its socket, as SCM_RIGHTS duplicates a
    descriptor: before, it crossed as the sender's own instance, so the sender's close ended the receiver's listener.
    Either member accepts, in turn, and the socket listens until its last member closes; a bound, not-yet-listening
    socket (cluster's shared handle) keeps its bound name in the copy. A connection reaching a socket no member serves
    yet waits in the socket's accept queue, owned by no run until a member accepts it; the last listener's close
    resets what is queued (ECONNRESET), as Linux does. For a Pipe, the binder's close takes the socket's path with its
    node, as libuv and Linux do, and a passed copy accepts only by descriptor; a socket in the abstract namespace has
    no node, so its name passes at a close to a member still open.
  • Let a trusted synchronous child host explicitly own all children of the current
    run, including image scripts and Node programs the engine can resolve. Use the
    existing admitted host process/wait path before Worker fallback; preserve
    other embeddings' classification, precise refusals and raw Worker restriction.
    Honor explicit host image-handoff/end evidence before synthesizing a local
    launch failure; an admitted child still reaps its actual kernel end.
    The paired page retires its original descriptor release lease separately
    from an image's own close/end, including when Node receives a second channel.
    Source only; paired host integration, release and application qualification
    remain separate (substrate Articles 1/5/6/8/9).