Systematic validation of all Phase 9c token-saving features: compact AST (6-7% of full size), lean scope (4% of detailed), diagnostic deltas, budget pagination across 3 pages, batch queries, and combined 95% savings. Benchmark confirms sub-millisecond parse->mutate->diagnose cycles. Also adds Environment Layer feature request to docs/annotations. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
6.9 KiB
Feature Request: Environment Layer (Runtime / Host Semantics)
Summary
Add a first-class Environment Layer to the AST-first pipeline so programs can be represented and transformed with explicit runtime/host context, not just syntax and pure computation.
This is required for meaningful equivalence across languages whose semantics depend on a host runtime (browser, JVM, Python runtime, OS process model, Emacs runtime, etc.).
Motivation
Many "languages" are inseparable from their environment:
- JavaScript in a browser includes event loop, microtasks/macrotasks, DOM/Web APIs, sandbox constraints.
- Python includes import system, module cache, object model, exceptions, refcount/GC behavior, venv packaging.
- JVM includes class loading, verification, reflection, JIT, GC, bytecode semantics.
If SemAnno only models AST/computation, the system will misrepresent equivalence and produce incorrect transpilation/runtime scaffolding.
Goals
- Represent environment assumptions explicitly alongside AST/IR.
- Allow transforms/transpilation to target either:
- a different language plus runtime scaffolding, or
- a different environment model (e.g., "browser-like event loop" in C++).
- Provide an interface for agents to add environment-specific capabilities incrementally without rewriting core AST.
Non-Goals
- Fully implementing a browser, JVM, or CPython.
- Building a complete OS abstraction layer.
- Perfect semantic equivalence across all edge cases (initially).
- Standardizing on any single IR format beyond "must be able to attach env info."
Definitions
- Environment: The execution context providing services and semantics beyond pure expression evaluation.
- Capability: A named service the environment provides (I/O, timers, threads, module loading, reflection, etc.).
- Binding Time: Whether a name/operation resolves at compile-time, link-time, load-time, or runtime.
- Scheduler Model: Event loop vs threads vs fibers vs cooperative coroutines.
- Memory Model: Ownership/RAII, tracing GC, ref-counting, region/arena, etc.
User Stories
- As a SemAnno user, I want to mark that a program depends on event loop semantics so a C++ target can generate appropriate scheduling code.
- As an agent generating C++ from Python-like semantics, I want to know whether imports are dynamic and how to model module caching and lookup.
- As an agent generating code for a browser target, I want to know which capabilities are required (DOM, fetch, timers) and which are forbidden (filesystem).
- As a developer debugging transpilation, I want the environment layer to explain why a transform chose threads vs event loop vs coroutines.
Requirements
R1. Environment Spec Object
There must be a structured "Environment Spec" attached to a program/module and accessible during transformations.
Minimum fields (names are suggestions; adapt to SemAnno conventions):
| Field | Type | Description |
|---|---|---|
env.id |
string | identifier, e.g. posix_process, browser, jvm, python_cpython_like, emacs_runtime |
env.version |
optional string | version of the environment spec |
env.capabilities |
set/list | declared required capabilities |
env.constraints |
set/list | forbidden or restricted behaviors |
env.scheduler |
enum-ish | event_loop, threads, fibers, coroutines, single_thread |
env.memory |
enum-ish | manual, raii, refcount, tracing_gc, region |
env.binding_times |
mapping | per symbol class or feature: compile, link, load, runtime |
env.exceptions |
model descriptor | unwind style / checked vs unchecked / typed vs untyped |
env.ffi |
descriptor | C ABI available? dynamic linking? host-call boundary? |
R2. Capability Declarations
Provide a small fixed vocabulary to start (expandable):
io.fsio.netio.stdinoutclock.timetimersevent_loopthreadsprocesssignalsmodulesdynamic_loadingreflectiongcjitui.dom(browser-like)editor.emacs(hosted in Emacs runtime / elisp interop)host.imgui(UI host integration)
R3. Transform Hooks Must Receive Env
All major transforms must have read access to the environment spec:
- AST -> IR lowering
- IR -> target emission
- optimization passes (esp. those unsafe across concurrency/GC boundaries)
- runtime scaffolding generation
R4. Environment-Aware Lowering
Certain constructs must lower differently depending on env. Examples:
| Construct | Lowering varies by... |
|---|---|
async/await |
event loop tasks vs threads vs coroutines |
imports/modules |
static linking vs dynamic loading vs runtime lookup |
exceptions |
unwind vs error unions vs result objects |
dynamic attribute access |
dictionary lookup vs vtable-like dispatch |
(Exact mapping is a later task; requirement is that the architecture supports this.)
R5. Explicit Host Boundary Nodes (Optional but Recommended)
To avoid hidden assumptions, represent host interactions as explicit IR/AST nodes:
HostCall(capability="io.net", name="fetch", args=...)
ScheduleTask(queue="microtask", ...)
ModuleLoad(name=..., mode=dynamic/static, ...)
This enables correct transpilation/scaffolding and helps debugging.
Implementation Notes (Low-Assumption)
- Prefer adding an annotation schema (e.g., JSON/YAML/S-expression) that can be attached to modules and referenced by UUID/path.
- The editor should surface the env spec as:
- a module-level panel (read/write), and
- per-node "requires capability" hints where relevant.
- Keep the initial environment models coarse:
- "POSIX-ish native"
- "Browser-ish event loop"
- "Python-like dynamic runtime"
- "JVM-like managed runtime"
- "Emacs-hosted runtime"
- Allow partial specs; missing fields should not crash transforms (fall back to conservative defaults).
Acceptance Criteria
- There exists a persisted Environment Spec artifact (in annotations) that is loadable with the rest of SemAnno metadata.
- A transform can query
env.schedulerandenv.capabilitiesand choose different lowering strategies. - The editor can display and edit the Environment Spec without requiring the AST editor to be complete.
- At least one demo transformation uses env info (e.g., toggling
event_loopvsthreadschanges generated scaffolding).
Suggested Deliverables
- EnvironmentSpec schema + parser/loader
- Editor UI panel to view/edit EnvironmentSpec
- Pass-through plumbing so all transforms receive EnvironmentSpec
- One example backend decision driven by env (scheduler or module loading)
- Documentation entry describing the field meanings and intended usage
Open Questions (Intentionally Not Assumed)
- Where should env live? (program-level, module-level, per-subtree override?)
- How should capabilities be namespaced/versioned?
- What is SemAnno's canonical serialization format for annotations?
- How should "mixed environments" work (e.g., native core + embedded JS VM)?