# Aeonora

One agent. Any runtime. Verifiable continuity.

Aeonora is an experimental open framework for durable, owner-controlled agents. It keeps public identity, constitution commitments, lifecycle, and receipt hashes verifiable while private memory, prompts, secrets, models, and execution stay off-chain.

## Website

```bash
python3 -m http.server 4173
```

Open `http://127.0.0.1:4173/site/`.

## Start in five minutes

Requires Node.js 22+ and npm.

```bash
npm install
npm link
aeonora validate examples/duckman.aeonora.json
aeonora keygen .aeonora/controller-key.json
aeonora bind-controller examples/duckman.aeonora.json .aeonora/controller-key.json .aeonora/duckman.json
```

```bash
aeonora register .aeonora/duckman.json .aeonora/controller-key.json
aeonora resolve <agentId>
aeonora verify <agentId>
aeonora authorize <agentId> research
aeonora authorize <agentId> publish
aeonora authorize <agentId> delete
```

Expected decisions: `allow`, `require-human`, `deny`. Full walkthrough: [quickstart](docs/quickstart.md).

## One command, then govern it

```bash
npm i -g aeonora
aeonora setup            # detects your brain, shows the path, asks which policy
```

`setup` finds an installed brain (Hermes, OpenClaw, NanoClaw, OpenHands, Claude
Code, Codex, Cursor) or takes a folder — `aeonora setup /path/to/notes`, or
`OBSIDIAN_VAULT=/path aeonora setup obsidian`. It encrypts what it finds, prints
the MCP config to paste, and applies a policy.

From then on every tool call that touches the brain is gated and receipted:

```bash
aeonora policy                  # read freely; writes and exports need approval
aeonora grant write-memory      # 1 use, expires in 15 minutes
aeonora receipts --verify       # exit 0 intact, exit 1 tampered
```

An agent that tries to write without approval is refused and told to ask you:

```
remember refused by Aeonora governance (require-human): policy preset "guarded"
requires owner approval for write-memory
This needs the owner's approval. Ask them to run:  aeonora grant write-memory
```

Full rules, precedence, and limits: [governance](docs/governance.md).

## Run the portable-agent flow

Turn any folder of Markdown into an encrypted portable brain:

```bash
aeonora-portable init ./my-agent-brain hermes:local .aeonora/my-agent
aeonora-portable verify .aeonora/my-agent
aeonora-portable migrate .aeonora/my-agent openclaw:local ./restored-brain
```

Hosted encrypted sync:

```bash
aeonora-portable push .aeonora/my-agent https://aeonora.net/api/vault
aeonora-portable pull .aeonora/my-agent ./restored-brain
```

Browser vault: [aeonora.net/app](https://aeonora.net/app/).

Migration preserves the agent ID, rotates the brain data key, records signed lineage, and restores the same Markdown through the new runtime profile. Runtime names are identifiers, not claims of shipped Hermes or OpenClaw adapters.

## What is real now

- canonical manifest validation and hashing
- Ed25519 controller binding and signed version lineage
- deterministic local agent identity
- allow/deny/require-human policy decisions
- brain governance at the MCP boundary: every read, write, import and export is gated and receipted
- open/guarded/readonly policy presets, `guarded` by default
- time-boxed, use-counted owner grants that lift `require-human` and never a `deny`
- hash-chained, tamper-evident receipt log (`aeonora receipts --verify`)
- runtime migration receipts and action receipts
- suspension
- minimal Solidity anchor with signed EVM client
- independent local and chain-anchor verification
- A2A discovery metadata example
- copy-paste coding-agent prompt and reusable skill
- encrypted Markdown brain capture, restore, and key-rotating runtime migration
- deterministic portability/security eval suite
- private hosted ciphertext sync with optimistic version checks
- 24-word browser recovery and WebAuthn PRF passkey unlock
- nine brain adapters: Hermes, OpenClaw, NanoClaw, OpenHands, Claude Code, Codex, Cursor, Obsidian, plain Markdown
- one-command setup that detects installed brains, shows the path it would encrypt, and asks which policy to apply
- authenticated self-hosted Kubo/IPFS mirroring of encrypted snapshots
- controller transfer and two-day delayed guardian recovery in `AeonoraRegistry`
- controller-gated on-chain encrypted-brain CID pointers
- browser-wallet Base Sepolia deployment and anchoring flow
- legacy encrypted storage, grants, compute, and workers retained as compatibility code

## What is not done

- independent professional security audit
- canonical public registry deployment
- ERC-8004 adapter
- on-chain revocation primitive (expiring grants are implemented off-chain, not on-chain)
- governance of plaintext once exported to disk: exports are gated and disclosed, but not enforceable after the write
- live Duckman A2A/MCP endpoints
- proof that an off-chain action was truthful

Do not market those items as shipped. See [implementation status](docs/status.md).

## Core commands

```text
aeonora setup | policy | grant | revoke | receipts
aeonora keygen | validate | register | resolve | verify | authorize | migrate | suspend
aeonora-chain register | resolve | verify-anchor | update | suspend | reactivate | commit-receipt
```

## Documentation

- [Release status and claim boundary](docs/release-status.md)
- [Investor demo guide](docs/demo-guide.md)
- [Current deployed system reference](docs/system-reference.md)
- [POC operations and release checklist](docs/operations.md)
- [Constitution](docs/constitution.md)
- [Thesis and positioning](docs/thesis.md)
- [Quickstart](docs/quickstart.md)
- [Protocol reference](docs/protocol.md)
- [Brain governance](docs/governance.md)
- [Implementation status](docs/status.md)
- [Contributing](CONTRIBUTING.md) and [security](SECURITY.md)
- [Copy-paste agent prompt](docs/agent-onboarding-prompt.md)
- [Historical prototype docs](docs/legacy/README.md)

## Verify the repository

```bash
npm run check
npm run eval
```

This runs Aeonora unit checks, legacy compatibility checks, end-to-end flows, and Solidity compilation.

## Deploy a development anchor

Start a local EVM node with an unlocked funded account:

```bash
npm run compile:contracts
RPC_URL=http://127.0.0.1:8545 DEPLOYER=0xUnlockedDevAccount npm run deploy:rpc
```

The on-chain workflow is documented in the [quickstart](docs/quickstart.md). Never use unlocked accounts in production.
