Files
whetstone_DSL/docs/annotations/Environment Layer.md
Bill 5830361463 Step 257: token efficiency tests + benchmarks (Phase 9c complete)
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>
2026-02-11 19:34:58 +00:00

160 lines
6.9 KiB
Markdown

# 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.fs`
- `io.net`
- `io.stdinout`
- `clock.time`
- `timers`
- `event_loop`
- `threads`
- `process`
- `signals`
- `modules`
- `dynamic_loading`
- `reflection`
- `gc`
- `jit`
- `ui.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.scheduler` and `env.capabilities` and 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_loop` vs `threads` changes generated scaffolding).
## Suggested Deliverables
1. EnvironmentSpec schema + parser/loader
2. Editor UI panel to view/edit EnvironmentSpec
3. Pass-through plumbing so all transforms receive EnvironmentSpec
4. One example backend decision driven by env (scheduler or module loading)
5. 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)?