- conforms_to::[[Observation Form Contract]]
- has_epistemic_status::[[Empirical Observation]]
- in_practice_domain::[[eOS Continuum]]
- authored_by::[[Christopher Allen]]
- has_lifecycle::[[Seed Stage]]↗
- has_curation::[[Working Draft]]↗
Recompiling an LPC File Over HTTP Updates the Next HTTP Response Without DGD Restart
Claim
In the eOS-Harness MVA running against DGD 1.7.9 plus the eOS-kernellib HTTP/1 platform, a POST /compile request whose body is new LPC source for /usr/Test/hello.c changes the response of the very next GET /greet from the baseline cold-boot string to the new string. The DGD process is the same process across both GET requests -- no restart, no statedump-and-reload, no operator-console intervention. The recompile is initiated from outside DGD (HTTP curl) and mediated by application LPC (compile_object(HELLO, body)); the platform's response to the compile is to update the program registry in place, and the next request that resolves "/usr/Test/hello"->greet() finds the new master and executes the new logic.
Grounds
This is an Empirical Observation. The grounds are a captured smoke sequence run 2026-05-13 against the live MVA demonstration instance.
Setup (verifiable from repo state):
- Driver: DGD 1.7.9 built from eOSContinuum/dgd at HEAD
aafc3784(1.7.9+2 commits), Mach-O 64-bit arm64, sha256e151e7...83ad7. Build flag:make YACC="/Library/Developer/CommandLineTools/usr/bin/bison -y"(macOS Command Line Tools yacc/bison stub workaround). - Kernel layer: eOSContinuum/eOS-kernellib at merged-main HEAD
cb4d18a(the docs-and-vocabulary PR merged), with three locally-applied platform fixes pending upstream PR (an include-path fix, plus a clone-arg + MODE_LINE + APP_SERVER lookup fix viastatus(O_INDEX)). - Application layer:
src/usr/Test/hello.c(the LPC deliverable),src/usr/Test/initd.c,src/usr/Test/sys/hello_handler.c(the dispatcher),src/usr/WWW/initd.c,src/usr/WWW/sys/httpd.c(the registry),src/usr/WWW/obj/server.c(the HTTP/1 subclass with theexpectEntity(length)opt-in at line 191). - Runtime config: the instance config at the eOS-Harness repo root, telnet
127.0.0.1:8023, binary/HTTP127.0.0.1:8080, isolated runtime staging tree layout per the runtime-provisioning skill's isolated-runtime hygiene.
Baseline hello.c (cold-boot state):
/* SPDX-License-Identifier: BSD-2-Clause-Patent */
string greet()
{
return "Hello from eOS-Harness Test/hello.\n";
}
Boot sequence:
$ rm -f state/snapshot state/boot.log
$ <runtime-provisioning script>
$ ./bin/dgd <instance config>
...
** Initialization complete.
** Initialization complete. reached in under one second; lsof -nP -iTCP -sTCP:LISTEN shows dgd ... TCP 127.0.0.1:8023 (LISTEN) and TCP 127.0.0.1:8080 (LISTEN).
Request 1 -- baseline GET:
$ curl -i http://127.0.0.1:8080/greet
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 35
Connection: close
Hello from eOS-Harness Test/hello.
The body is the baseline string the cold-boot compilation of hello.c returned from greet(). The dispatch path is obj/server::receiveRequest -> sys/httpd::query_root_handler("greet") -> Test/sys/hello_handler::handle(GET, "greet", ...) -> "/usr/Test/hello"->greet().
Request 2 -- POST a new source body:
A new source body is staged (the precise sed-substitution used here is incidental; any LPC-equivalent change to the greet() return value would suffice):
/* SPDX-License-Identifier: BSD-2-Clause-Patent */
string greet()
{
return "Hot-reloaded greeting from eOS-Harness.\n";
}
$ curl -i -X POST --data-binary @new-hello.c http://127.0.0.1:8080/compile
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 25
Connection: close
Compiled /usr/Test/hello
The dispatch path is obj/server::receiveRequest -> expectEntity(Content-Length) -> obj/server::receiveEntity (after the platform switches the connection to MODE_RAW and reads the body) -> Test/sys/hello_handler::handleCompile(body) -> compile_object(HELLO, body) at src/usr/Test/sys/hello_handler.c:84. The kfun compile_object(path, source) compiles the supplied source under the given runtime path, replacing the existing master object's program registry entry. The response body "Compiled /usr/Test/hello" confirms compile_object returned a non-nil object reference and the dispatcher caught no LPC error.
Request 3 -- next baseline GET:
$ curl -i http://127.0.0.1:8080/greet
HTTP/1.1 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 40
Connection: close
Hot-reloaded greeting from eOS-Harness.
The body is the new string from the source posted in request 2. The dispatch path is identical to request 1 -- the dispatcher's call to "/usr/Test/hello"->greet() resolves to the same master object name, but the master's program is now the recompiled one.
Process identity check: a single DGD process served all three requests. The lsof listener PID is unchanged between request 1 and request 3; the boot log records no ** System halted. entry between them; the next ** System halted. entry appears only after the eventual SIGINT shutdown. No statedump was invoked. No operator-console session was opened.
What the evidence establishes:
- Recompilation lands into a running runtime without a restart.
- The next request after recompilation uses the new logic.
- The recompile is initiated by an external HTTP client (curl) and mediated by application LPC, not by an operator-tier console command (the operator console was not used; the demonstration is at the realistic HTTP interface the harness-as-tool-inversion Conviction asks for).
- The platform's
compile_object()kfun does not destroy the master object's identity; subsequent name resolution finds the same master with new logic.
What the evidence does not establish:
The empirical sequence uses sequential curl requests, not concurrent ones. The hot-reload Conviction's "in-flight operations finish with the old logic" half is not directly demonstrated by this sequence. A request that began during the compile-and-swap window might or might not finish with the old logic; this evidence does not adjudicate. Demonstrating the in-flight half would require a concurrent-request probe (issue a long-running greet() -- by changing hello.c to a call_out-deferred response -- then POST /compile while it is in flight, and observe whether the deferred response uses the version current when the call started or the version current when the call returns). The MVA's scope at authoring time did not include this concurrent-request probe; it is named here as the explicit limit of the current Empirical claim.
What Would Revise It
-
A subsequent run on the same setup that fails to replicate the sequence -- where
POST /compilereturns 200 OK but the nextGET /greetreturns the baseline string -- would indicate that the platform's program-registry swap is not visible to the next request resolving the master. Most likely cause: a master-vs-clone confusion in the dispatcher (calling a cached clone whose internal program reference predates the swap). Worth checking if the dispatcher pattern changes; the current dispatcher resolves the master via the->operator's find-or-compile path each call, so cached-clone is not currently a risk. -
A platform or driver upgrade that changes
compile_object()'s semantics -- e.g., a future DGD release that defers the program-registry update until a quiescent point, or that requires explicitrecompile_object()for an already-compiled master -- would invalidate the snapshot claim. The current evidence rests on DGD 1.7.9 + the cited eOS-kernellib HEAD + the three locally-applied platform fixes; pinning these is part of the grounds. -
A concurrent-request probe demonstrating that an in-flight call finishes with the new logic would shift the framing: the platform's hot-reload would behave as a deploy-pipeline pattern (the in-flight call sees the swap mid-execution) rather than as the atomic-with-old-logic primitive the Conviction claims. The Conviction's "in-flight finishes with old logic" half would need to be amended.
-
A demonstration that recompilation drops or migrates state held in already-cloned instances would weaken the persistence-composition claim. The current
hellomaster has no instances and no per-instance state, so this evidence does not exercise the persistence boundary. A later demonstration that recompiles a stateful master and verifies clones retain their state would extend the claim; absence of that demonstration would shift this observation toward "verified for stateless masters; pending for stateful." -
A finding that the dispatcher's
"/usr/Test/hello"->greet()resolution is not in fact the platform's program-registry path would change the grounds. The current claim attributes the new-logic resolution to DGD's master-object program swap; if a tracing exercise revealed the dispatcher is somehow holding its own reference and being updated through a different path, the citation ofcompile_object()as the load-bearing mechanism would need correction.
Sources
src/usr/Test/hello.c-- the LPC source whosegreet()return value is hot-swapped during the sequence. Cold-boot baseline returns"Hello from eOS-Harness Test/hello.\n".src/usr/Test/sys/hello_handler.c-- the route handler.handleCompile()at line 74 callscompile_object(HELLO, body)at line 84;handle()at line 112 dispatchesPOST /compiletohandleCompile.src/usr/WWW/obj/server.c-- the HTTP/1 subclass.receiveRequestat line 169 calls inheritedexpectEntity(length)at line 191 for body-bearing methods (the opt-in fix that lets the body reachreceiveEntityand on tohandleCompile).- The instance config -- runtime config (telnet 8023, binary/HTTP 8080, isolated source directory).
- The runtime-provisioning script -- the rsync-into-isolated-runtime layout used to materialize the staging tree's source directory from the eOS-kernellib kernel source plus the eOS-Harness application source overlay.
- eOS-kernellib
usr/HTTP/lib/Connection1.c:239--expectEntity(int length), the platform flow API a subclass MUST opt into to receive a body. Documented nowhere in eOS-kernellib at the time (no comment, no example subclass); the discovery was noted as a platform documentation gap. - The session record covering the fix that made the body reach
handleCompile-- carries the verbatim chained smoke this Observation cites.
Relations
-
conforms_to::[[Observation Form Contract]]
- Carries
has_epistemic_status::[[Empirical Observation]], names the measurement (the three-curl smoke against the live MVA), states the limits of the measurement (sequential not concurrent; stateless master), and lists concrete revision conditions.
- Carries
-
informs_downstream::[[Hot Reload Is a Runtime Operation, Not a Deployment Event]]
- The hot-reload Conviction's "What It Asks" section calls explicitly for the MVA to produce empirical evidence. This Observation is that evidence for the recompile-while-running and next-operation-uses-new halves of the Conviction. The in-flight-finishes-with-old half remains an asserted-but-not-demonstrated claim of the Conviction; this Observation names that limit so the Conviction's evidence base is honest about what has and has not been measured.
-
grounded_in::[[Cloud Server (Croes, 2012, rev. 2026)]]
- The Cloud Server Reference's eight-primitives table marks hot reload as cloud-server "Provided; the hot-reload demo flows directly". This Observation is the demonstration that the Reference's mapping anticipated; the foundation layer's
compile_object()plus the eOS-kernellib HTTP/1 platform plus the application dispatcher together compose into the empirical sequence cited above.
- The Cloud Server Reference's eight-primitives table marks hot reload as cloud-server "Provided; the hot-reload demo flows directly". This Observation is the demonstration that the Reference's mapping anticipated; the foundation layer's
-
grounded_in::[[Runtime State Is Persistent by Default, Not by Application Discipline]]
- The persistence Conviction composes with the hot-reload Conviction at the recompilation boundary: the program-registry swap operates on a living master whose identity persists across the recompile. The current evidence exercises persistence only at the "master keeps its name and continues to dispatch" level; a stateful-master extension would exercise the deeper claim that per-instance state survives recompilation.
-
grounded_in::[[Agent Operations Commit Wholly or Roll Back Wholly]]
- The atomicity Conviction composes with the hot-reload Conviction at the recompilation boundary: the in-flight-finishes-with-old half of the hot-reload claim depends on atomicity holding the code version constant for an operation's duration. The current evidence does not demonstrate this composition (no concurrent request was in flight during the compile window); a future concurrent-request probe would close the gap.
-
contrasts_with::[[Recompilation Mid-Request Causes a Stateful Master to Lose Per-Instance State]]
- A sibling Observation, not yet authored, framing the failure case the persistence composition forbids. Reserved here so a future authoring covers the stateful-master extension without restating the setup evidence.