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
6 changes: 6 additions & 0 deletions .markdownlint-cli2.jsonc
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"config": {
"MD013": false,
},
"ignores": ["node_modules/**", "packages/**/node_modules/**", "target/**"],
}
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -587,6 +587,10 @@ Applied, Rejected, Obstructed}` with receipt evidence and typed contract

### Fixed

- `echo-file-aperture` now normalizes `HostFileSnapshot` material at the
aperture boundary so caller-forged snapshot metadata or fingerprints cannot
bind a basis, observation receipt, or materialization verification to bytes
different from the observed host bytes.
- `scripts/verify-local.sh` stamp storage now resolves the real gitdir via
`git rev-parse --git-dir`, so pre-commit and pre-push hooks work in linked
worktrees where `.git` is a file rather than a directory. Stamps are
Expand Down
8 changes: 8 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ members = [
"crates/warp-geom",
"crates/warp-benches",
"crates/echo-app-core",
"crates/echo-file-aperture",
"crates/echo-config-fs",
"crates/echo-session-proto",
"crates/echo-graph",
Expand Down Expand Up @@ -42,6 +43,7 @@ echo-cas = { version = "0.1.0", path = "crates/echo-cas" }
echo-config-fs = { version = "0.1.0", path = "crates/echo-config-fs" }
echo-dind-tests = { version = "0.1.0", path = "crates/echo-dind-tests" }
echo-dry-tests = { version = "0.1.0", path = "crates/echo-dry-tests" }
echo-file-aperture = { version = "0.1.0", path = "crates/echo-file-aperture" }
echo-graph = { version = "0.1.0", path = "crates/echo-graph" }
echo-runtime-schema = { version = "0.1.0", path = "crates/echo-runtime-schema", default-features = false }
echo-registry-api = { version = "0.1.0", path = "crates/echo-registry-api" }
Expand Down
58 changes: 37 additions & 21 deletions METHOD.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,42 +24,58 @@ The Echo work doctrine: A backlog, a loop, and honest bookkeeping.
| **`CONTINUUM.md`** | Platform memo: hot/cold split and shared contracts. |
| **`METHOD.md`** | Repo work doctrine (this document). |

## Backlog Lanes
## Backlog

| Lane | Purpose |
| :---------------- | :---------------------------------------------------------- |
| **`asap/`** | Imminent work; pull into the next cycle. |
| **`v0.1.0/`** | Release-bar blockers for the local contract-host milestone. |
| **`up-next/`** | Queued after `asap/`, outside the release-bar lane. |
| **`cool-ideas/`** | Uncommitted experiments. |
| **`bad-code/`** | Technical debt that must be addressed. |
| **`inbox/`** | Raw ideas. |
GitHub Issues are the live backlog. Labels are the index.

`v0.1.0/` is a milestone lane, not an automatic priority override. Move a
release-blocking card into `asap/` only when it becomes the current pull.
| Label | Purpose |
| :-------------------- | :----------------------------- |
| **`lane:inbox`** | Unprocessed work or raw ideas. |
| **`lane:asap`** | Pull into a cycle soon. |
| **`lane:up-next`** | Queued after `asap`. |
| **`lane:cool-ideas`** | Uncommitted experiments. |
| **`lane:bad-code`** | Technical debt. |
| **`lane:release`** | Release-bar work. |

Historical filesystem backlog cards are archived under
`docs/method/graveyard/github-issue-migration/`. The `docs/method/backlog/`
directory remains only as a compatibility marker for legacy `cargo xtask
method ...` workspace discovery. Do not add new live work cards there.

## The Cycle Loop

```mermaid
stateDiagram-v2
direction LR
[*] --> Pull: asap/
[*] --> Pull: issue
Pull --> Branch: cycle/
Branch --> Red: failing tests
Branch --> Design: template
Design --> Red: failing tests
Red --> Green: passing tests
Green --> Retro: findings/debt
Retro --> Ship: PR to main
Ship --> [*]
```

1. **Pull**: Move an item from `backlog/asap/` to `docs/design/`.
2. **Branch**: Create `cycle/<cycle_id>-<slug>`.
3. **Red**: Write failing tests. Playback questions become specs.
4. **Green**: Make them pass. Fix determinism drift (DIND).
5. **Retro**: Document findings and follow-on debt in the cycle doc.
6. **Ship**: Open a PR to `main`. Update `BEARING.md` and `CHANGELOG.md` after merge.
1. **Pull**: Choose a GitHub Issue with Method labels. Create or update a
design doc under `docs/design/` and link it to the issue.
2. **Branch**: Create a branch named from the issue title, or
`cycle/<id>-<slug>` when the work is explicitly cycle-shaped.
3. **Design**: Use `docs/method/design-template.md`.
4. **Red**: Write failing tests from the design's playback questions.
5. **Green**: Make them pass. Fix determinism drift with DIND when relevant.
6. **Witness**: Record the reproducible proof.
7. **Retro**: Document drift and follow-on debt.
8. **Ship**: Open a PR to `main`.

Design docs may define intent, but they do not prove implementation. Runtime
and product work must include at least one executable behavior witness such as
Rust API behavior, CLI output, WASM ABI behavior, schema validation, WAL/WSC
recovery, DIND determinism, or generated contract behavior.

## Naming Convention

Backlog and cycle files follow: `<ID>-<slug>.md` or `<LEGEND>-<slug>.md`
Example: `RE-017-byte-pipeline.md`
Issues use readable titles and Method labels. Branches use lowercase slugs of
the issue title unless a cycle id is explicitly assigned.

Design docs use the Echo template at `docs/method/design-template.md`.
20 changes: 20 additions & 0 deletions crates/echo-file-aperture/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# SPDX-License-Identifier: Apache-2.0
# © James Ross Ω FLYING•ROBOTS <https://github.com/flyingrobots>
[package]
name = "echo-file-aperture"
version = "0.1.0"
edition = "2021"
license.workspace = true
repository.workspace = true
rust-version.workspace = true
description = "Echo-owned host file aperture contract"
readme = "README.md"
keywords = ["echo", "files", "causal", "aperture"]
categories = ["filesystem", "data-structures"]

[dependencies]
blake3 = "1.5"
thiserror = "2"

[lints]
workspace = true
26 changes: 26 additions & 0 deletions crates/echo-file-aperture/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<!-- SPDX-License-Identifier: Apache-2.0 OR LicenseRef-MIND-UCAL-1.0 -->
<!-- © James Ross Ω FLYING•ROBOTS <https://github.com/flyingrobots> -->

# echo-file-aperture

`echo-file-aperture` is the Echo-owned standard artifact for host-file
observation, basis tracking, content admission, and materialization
verification.

It is not a filesystem runtime and it is not a FUSE adapter. Callers provide
host capabilities such as reading bytes, writing bytes, and collecting path
evidence. This crate owns the deterministic contract that turns those host
facts into file sites, fingerprints, basis tokens, projections, receipts, and
obstructions.

File-site identity is resolved by authority tier:

- platform identity derives a `PlatformStable` `FileSiteId`;
- path-only evidence derives a weaker `PathBound` `FileSiteId`.

Path evidence is observation evidence, not durable authority. `FileSiteId`
binds local host-aperture observations; it is not `WorldlineId` and must not be
treated as portable WSC causal identity.

The first slice is intentionally in-memory. Later slices should attach these
receipts and retained materials to Echo WAL/WSC recovery surfaces.
Loading
Loading