A node's chain key is now its tapkey: its NIP-06 npub with the BIP-86 tweak, so one secret signs its nostr events and its chain spends, and its address follows from its npub. Its leaves hang off the same tree, byte for byte as on lineage's key tree page: an agent's ssh, git, dkim and wg keys from its nostr secret, an org's ssh-ca, mtls and noise keys from its seed. Inspect shows the tapkey, npub, derivation and leaves, with the public lines to paste. Labs keyed by v1.1 keep their separate m/86' chain keys until they are reset. PROVENANCE.md and public/licenses now carry @scure/base, bip32 and bip39, which came in with v1.1. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01H4upF5LVwmPDDqrhdUfnXh
70 lines
4.4 KiB
Markdown
70 lines
4.4 KiB
Markdown
# Orgchain
|
|
|
|
Lineage's app for creating and operating lineage holdings: https://lineage.yolopreneur.lol/orgchain/
|
|
|
|
Lineage gives an org its structure, a key tree with a place for every org and agent. Orgchain adds time. Every act is an
|
|
inscription on a private toy chain in your browser, and its parent inscription is the node that authorizes it, so the
|
|
chain itself records who did what, and when.
|
|
|
|
- **Found** a holding (a root: the LLC). **Birth** orgs and agents under any org. **Award** a belt (one skill, one
|
|
seat). **Decide** (a decision on a node's record). **Graduate** an org (its edge flips from derived to adopted).
|
|
**Close** a node (derived children close with it; graduated ones hold their own roots and stay open).
|
|
- **Time.** A beat is a block. At the default tempo each act is its own beat; at 10, 30 or 60 seconds, acts are cued and
|
|
land together on the next beat; on manual they wait for *Beat now*. The slider and *Replay* show a holding as it
|
|
stood at any beat.
|
|
- **One interpretation.** `src/orgchain/lineage.js` folds `lineage/v0` events into trees, and vets every act before
|
|
anything is signed. Events it rejects stay on the chain and show as rejected; they just don't change the tree.
|
|
- **Keys.** Each holding gets its own 24-word lab root, and every node has lineage's keys at its place in the tree
|
|
(`src/orgchain/keys.js`): an org's seed is BIP-85 from its parent's, or its own root once it graduates; agents are
|
|
accounts 1..n of their org's seed. A node's **tapkey** is its NIP-06 npub with the BIP-86 tweak: one secret signs its
|
|
nostr events and its chain spends, and anyone with the npub can find what it holds. Its **leaves** hang off the same
|
|
tree, byte for byte as on lineage's key tree page (`src/orgchain/leaves.js`): an agent's ssh, git, dkim and wg keys
|
|
from its nostr secret, an org's ssh-ca, mtls and noise keys from its seed, each with the public line to paste. Every
|
|
act is signed by the tapkey that holds the authorizing inscription, and a birth hands the child its own. Graduation is
|
|
a claim by the org's fresh root, countersigned by its derived key, and the derived subtree re-keys under the new
|
|
root, so the parent's line can no longer sign for it. Labs keyed by v1.1 keep their separate m/86' chain keys until
|
|
they are reset.
|
|
|
|
Test coins and test keys only: a local chain, the lab wallet (the faucet that funds every key) and each holding's lab
|
|
root, kept in this browser (`localStorage`, key `orgchain:lab:v1`). Nothing here is a real key; minting a real root is
|
|
the operator's call.
|
|
|
|
## Events
|
|
|
|
`lineage/v0` is the ord metaprotocol (tag 7); the fields are CBOR metadata (tag 5); the body is a short text label.
|
|
|
|
| op | parent inscription (spent to authorize) | metadata |
|
|
| --- | --- | --- |
|
|
| `found` | none | `name` |
|
|
| `birth` | the parent | `name`, `kind` (`org` or `agent`) |
|
|
| `award` | the issuing org or holding | `to`, `skill`, `belt` (`white`, `green`, `black`) |
|
|
| `decide` | the deciding node | `title`, `why` |
|
|
| `graduate` | the child's parent (then the handoff to the child's fresh root) | `of` |
|
|
| `close` | the node itself | none |
|
|
|
|
Names are domain labels (lowercase letters, digits, hyphens). Org and agent indices count separately and are never
|
|
reused.
|
|
|
|
## Build and test
|
|
|
|
```
|
|
npm ci
|
|
npm test # engine, reducer and lab (node --test)
|
|
npm run build # dist/ is the site; relative paths, so it works at any sub-path
|
|
npm run test:e2e # Playwright on vite preview; PW_CHANNEL=chrome uses installed Chrome
|
|
```
|
|
|
|
`ORGCHAIN_URL` (plus `PW_ARGS`, a JSON array of browser flags) points the same end-to-end spec at a deployed copy.
|
|
|
|
Deploy: copy `dist/` to `ventures/lineage/orgchain/` on `teahubxyz/time` `gh-pages`. Its headers (a strict CSP with
|
|
`connect-src 'none'`: the app makes no network requests) come from `ventures/lineage/_headers`.
|
|
|
|
## Built on Super Testnet
|
|
|
|
The chain, wallet, inscriptions, metadata and index (`src/adapters`, `src/upstream`, with `src/storage.js` and
|
|
`src/miner.js`) are [Super Testnet](https://supertestnet.lol)'s, unchanged and with their tests
|
|
(`tests/adapters.test.js`). See `PROVENANCE.md` and `public/licenses/`. Lineage's key derivation and the claim and
|
|
countersign handoff (`src/adapters/lineage-keys.js`, `src/adapters/handoff.js`, with their spec vectors in
|
|
`tests/keys.test.js`) come from the `tree` branch. The full lab (explorer, delegates, recursion and
|
|
the Inscriboor extension) lives at supertestnet.lol.
|