diff --git a/.gitignore b/.gitignore
index e0c07ad92..3ed8b9da6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -26,6 +26,9 @@ playwright-report/
test-results/
blob-report/
+# Root npm lockfiles are accidental; desktop uses pnpm in /desktop.
+/package-lock.json
+
# sqlx offline query data (generated, not portable)
.sqlx/
diff --git a/README.md b/README.md
index 1af758d93..0985df6f8 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
-
+
# sprout
diff --git a/VISION_PROJECTS.md b/VISION_PROJECTS.md
index 600c6fe71..fb4fc73c7 100644
--- a/VISION_PROJECTS.md
+++ b/VISION_PROJECTS.md
@@ -36,7 +36,7 @@ The portable representation is a NIP-34 repo announcement (kind:30617) — stand
Branch protections live in the same event — `sprout-protect` tags. The relay enforces them at the git transport layer. Only npubs listed in `push-allowed` can push to protected branches. Force pushes are blocked. Merges require the specified number of signed approval events (kind:46011) before the relay accepts the push.
-Agents inherit access from their owner via [NIP-OA](NIP-OA.md). The relay checks: does the push carry a valid NIP-OA auth tag, and is the owner pubkey in that tag listed in `push-allowed`? If yes, the push is accepted — the agent's own pubkey doesn't need to be in the list. Add a maintainer, and all their authorized agents can push. Remove the maintainer, and all their agents lose access instantly. Agents without NIP-OA attestation are treated as their own identity and must be listed explicitly.
+Agents inherit access from their owner via [NIP-OA](docs/nips/NIP-OA.md). The relay checks: does the push carry a valid NIP-OA auth tag, and is the owner pubkey in that tag listed in `push-allowed`? If yes, the push is accepted — the agent's own pubkey doesn't need to be in the list. Add a maintainer, and all their authorized agents can push. Remove the maintainer, and all their agents lose access instantly. Agents without NIP-OA attestation are treated as their own identity and must be listed explicitly.
Standard NIP-34 clients see a normal repo. gitworkshop.dev renders it. ngit-cli works with it. Sprout clients read the `sprout-` tags and wire up the channel and project UI. One event, two audiences, zero custom kinds.
@@ -115,7 +115,7 @@ A new contributor submits a patch. Before you read the code:
This works because identity is cryptographic and portable. Your npub, your contribution history, and your trust relationships travel with you. No platform owns your reputation.
-**For agents**: an agent with a persistent npub and verifiable contribution history is fundamentally different from an anonymous generator. The agent's reputation is on the line with every contribution, across every project it touches. See [NIP-OA](NIP-OA.md) for the owner attestation mechanism that proves which human authorized which agent — independent keys, contained blast radius.
+**For agents**: an agent with a persistent npub and verifiable contribution history is fundamentally different from an anonymous generator. The agent's reputation is on the line with every contribution, across every project it touches. See [NIP-OA](docs/nips/NIP-OA.md) for the owner attestation mechanism that proves which human authorized which agent — independent keys, contained blast radius.
---
diff --git a/sprout-icon.png b/docs/assets/sprout-icon.png
similarity index 100%
rename from sprout-icon.png
rename to docs/assets/sprout-icon.png
diff --git a/sprout.png b/docs/assets/sprout.png
similarity index 100%
rename from sprout.png
rename to docs/assets/sprout.png
diff --git a/NIP-OA.md b/docs/nips/NIP-OA.md
similarity index 100%
rename from NIP-OA.md
rename to docs/nips/NIP-OA.md
diff --git a/NIP-RS.md b/docs/nips/NIP-RS.md
similarity index 100%
rename from NIP-RS.md
rename to docs/nips/NIP-RS.md
diff --git a/package-lock.json b/package-lock.json
deleted file mode 100644
index 0b4c0b6e6..000000000
--- a/package-lock.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "name": "sprout",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {}
-}
diff --git a/tests/e2e_relay.rs b/tests/e2e_relay.rs
deleted file mode 100644
index b34a92d51..000000000
--- a/tests/e2e_relay.rs
+++ /dev/null
@@ -1,11 +0,0 @@
-// NOTE: This file is a placeholder.
-//
-// The actual E2E integration tests live in:
-// crates/sprout-test-client/tests/e2e_relay.rs
-//
-// Workspace-root `tests/` requires a [package] section in Cargo.toml.
-// Since this is a pure workspace manifest, integration tests must live
-// inside a member crate.
-//
-// Run E2E tests with:
-// cargo test -p sprout-test-client --test e2e_relay -- --ignored