Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/).
seam.
- Syntax-independent delivery-loop phase graph with guarded transitions,
declared effects, bounded judgment leaves, and terminal reachability.
- Compiler-authored bounded workspace observation witness covering durable
request and claim recovery, capability-rooted settlement, idempotent and
conflicting retry, effect-free replay, rootless ambiguous outcome settlement,
post-claim aperture-substitution refusal, distinct compiler-artifact and
runtime-request admission errors at every phase boundary, checkout-independent
artifact paths, path and budget refusals, fixed-seed cases, and bounded
stress.

### Changed

Expand Down
63 changes: 63 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -95,5 +95,68 @@ each generic runner invocation; the deterministic rerun is separate evidence.
This is singleton scheduler integration: one Action in one Tick. It does not
claim permanent multi-Action Tick composition or introduce external effects.

## Hello Effect workspace observation

The first external-effect proof is separate from the pure Hello Echo runtime.
Run it with the same compatible producer checkouts:

```sh
EDICT_REPO=/path/to/edict \
ECHO_REPO=/path/to/echo \
./tests/effect-runtime.sh
```

The build corroborates the Edict source and complete `workspace.snapshot@1`
lawpack closure byte-for-byte, then uses Edict's public `externalAction` build
to emit the exact compiler-owned Core and Echo Target IR request artifacts. It
does not emit an executable-operation package or invoke an effect through the
compiler/provider seam.

The public shell boundary canonicalizes producer checkout paths before
serializing them into the generated Cargo manifest. Relative compiler-artifact
overrides are resolved from the application root, independent of the caller's
working directory.

The runtime witness uses Echo's public generic external-action coordinator and
bounded workspace adapter. It proves:

- request and claim WAL commits occur in separate host processes before the
requested file exists;
- recovery exposes requested and claimed pending states without filesystem
authority;
- only the capability-rooted adapter receives the workspace directory and
exact permitted paths;
- the canonical settlement is committed before its value becomes
consumer-visible;
- an identical settlement retry returns the original admission without another
WAL commit, while a kind-only conflict obstructs without mutation;
- replay accepts no workspace root, retains observed value A after the complete
source root is removed, and does not re-enter the adapter;
- a fresh request on a new worldline observes later value B;
- `outcomeUnknown` remains distinct from failure, requires no workspace root,
and settles after the source directory is removed;
- the exact permitted path aperture is part of durable request identity, so
post-claim aperture substitution cannot recover the claim;
- unauthorized, parent-escaped, symlink, and stale-basis paths settle as typed
refusals;
- the exact settlement-size boundary succeeds and one byte less refuses; and
- substituted compiler artifacts are rejected with the same typed obstruction
at request and recovery boundaries without appending to the WAL, while
invalid runtime requests remain a distinct pre-commit refusal.

The fixed suite contains one ordered golden path, one relative
compiler-artifact path probe, one idempotent retry, one conflicting retry, one
aperture substitution, one rootless replay, one fresh-world observation, one
rootless ambiguous outcome, four path-or-basis refusals, one boundary probe,
two boundary cases, two compiler-artifact refusals, one runtime-request
refusal, three cases derived from fixed seed `70110`, and eight bounded stress
worldlines. Every retained JSON artifact is checked for producer-checkout path
leaks. Reports contain compiler and causal identities but no producer-checkout
or workspace-root paths.

Edict declares `workspace.snapshot.observe@1`; Echo durably coordinates it; the
adapter alone reads the workspace. This proof grants Edict no filesystem,
process, network, or model authority and introduces no application callback.

No artifact in this repository may be replaced by a handwritten Echo package,
and no native Hello Echo callback may implement application semantics.
17 changes: 17 additions & 0 deletions docs/roadmap.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,19 @@ Start with `ObserveWorkspaceSnapshot` or a smaller
- replay without rereading the workspace; and
- unauthorized path obstruction.

The `workspace.snapshot.observe@1` consumer proof now satisfies this phase. The
exact Edict Core and Target IR artifacts derive the request independently.
Echo durably records request, claim, and settlement across separate host
processes. Recovery exposes pending work, exact retry is effect-free,
conflicting retry obstructs, and replay retains the admitted observation after
the entire workspace root is removed. A new worldline alone may observe a
changed workspace. Explicit uncertainty settles without reopening the removed
root. Post-claim aperture substitution cannot recover the durable claim, while
path, symlink, basis, terminal-size, compiler-artifact, and runtime-request
violations all fail closed at their owning boundary. Compiler artifacts are
re-admitted at every phase, so a post-request substitution returns a typed
obstruction without appending to the existing WAL.

### Basis-bound write

Add `ApplyValidatedPatch` only after read-only observation is green:
Expand All @@ -121,6 +134,10 @@ Add `ApplyValidatedPatch` only after read-only observation is green:

No generic process, filesystem, or network capability is introduced.

Roadmap A.1 is four of five phases complete: Echo durable external actions,
Edict typed external requests, Echo bounded observation, and this external
consumer proof are complete. Basis-bound validated patch application remains.

## Roadmap B — Graft hosted by Echo

Move Graft analysis over admitted workspace snapshots:
Expand Down
21 changes: 21 additions & 0 deletions edict.effect.application.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"schema": "edict.application/v1",
"buildKind": "externalAction",
"coordinate": "examples.workspace_observer@1",
"sources": [
"effect/src/observe-workspace.edict"
],
"lawpacks": [
{
"manifest": "effect/vendor/workspace-snapshot/manifest.cbor",
"exports": "effect/vendor/workspace-snapshot/exports.cbor",
"adapter": "effect/vendor/workspace-snapshot/adapter.cbor",
"targetConfiguration": "effect/vendor/workspace-snapshot/request-profile-configuration.cbor"
}
],
"target": {
"profile": "echo.dpo@1",
"providerPackage": ".build/effect/echo-provider"
},
"outputDirectory": ".build/effect/application"
}
16 changes: 16 additions & 0 deletions effect-host/Cargo.toml.template
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
[package]
name = "hello-effect-host"
version = "0.1.0"
edition = "2021"
publish = false

[dependencies]
blake3 = "1"
echo-edict-canonical = { path = "@ECHO_REPO@/crates/echo-edict-canonical" }
serde = { version = "1", features = ["derive"] }
serde_json = "1"
warp-core = { path = "@ECHO_REPO@/crates/warp-core" }

[[bin]]
name = "hello-effect-host"
path = "@PROJECT_ROOT@/effect-host/src/main.rs"
Loading