diff --git a/docs/trustshell-dev-draft/README.md b/docs/trustshell-dev-draft/README.md new file mode 100644 index 00000000..e8abff4e --- /dev/null +++ b/docs/trustshell-dev-draft/README.md @@ -0,0 +1,71 @@ +# trustshell.dev — "Receipts, not promises" draft section (D7) + +**Status: DRAFT. Not deployed. Not published.** This is a self-contained HTML draft of one +explainer section for trustshell.dev, built to be shown and reviewed, then ported into the live +site by the site owner if approved. Nothing here ships automatically, and no new public claim +goes live from this folder. + +## What it is + +`receipts-section.html` — a single, self-contained page that walks the owner's five-step +progression — **Enforce → Observe → Verify → Earn → Reuse** — with the real CLI at each step: +the owner policy that decides before a tool runs and pins it by path+sha256 (`guard` / `run`), the +hash-chained log checked offline (`inspect`), the one-receipt / six-claim non-collapsing verdict +(`verify-receipt`), the three-rung evidence ladder (owner-self-signed → issuer-attested → +RepID-eligible), and the signed carry where authority never travels (`bundle`). It ends with +"What a receipt does not prove" and a runnable, offline, no-account loop. + +## This revision (2026-11-07): IA aligned, commands made real, one label corrected + +- **IA now follows the owner's progression** Enforce → Observe → Verify → Earn → Reuse — a step rail + up top, one step per section. The six-claim verdict panel lives inside Verify; the ladder inside Earn. +- **Three fabricated commands removed.** The prior draft told a skeptic to run `trustshell demo`, + `npx … demo`, and `trustshell sign-receipt` — none of which exist in the CLI (`demo` is only a + `check --demo` flag; sealing lives in the `sandbox` / `run` path, which needs a container or the + engine). Every command shown now is one the CLI actually has and runs offline: `guard`, `run`, + `inspect`, `verify-receipt`, `bundle` (verified against `src/cli/index.ts` and L-E2E). +- **Rung 2 is "Issuer-attested", not "independently-verified"** — reconciled with #681's + `INDEPENDENTLY_VERIFIED → ISSUER_ATTESTED` rename: the engine's key is not independent of the + issuer, so the page says exactly that instead of claiming an independence it does not have. + +## How to view it + +``` +cd docs/trustshell-dev-draft +python -m http.server 8787 +# open http://127.0.0.1:8787/receipts-section.html +``` + +Opening the file directly (`file://`) works too; a server is only needed if a tool must drive it. + +## It inherits trustshell.dev's own world (extension, not a redesign) + +Captured from the live site and reused verbatim, so this drops in without a visual seam: + +- Ground `#0a0a0a`, foreground `#fafafa`, muted `#a1a1aa`, accent `#f6851b`, card `#18181b`, + border `#27272a`. +- State palette doing the semantic work: `--state-measured #2dd4bf` (VERIFIED), `--state-not-checked + #8b97a8` (NOT_CHECKED), `--state-failed #fb7185` (reserved for FAILED). +- Type: IBM Plex Serif display headings, Inter body, JetBrains Mono for receipts / commands / state. + +## Honesty rules honored (PRODUCT.md copy rules) + +- No "first / only / unique / unhackable" anywhere. +- NOT_CHECKED is shown, never rounded up to a pass; the six claims never collapse into one badge. +- The three evidence levels are kept distinct; an owner self-signature earns **no** production RepID. +- Framed as a developer preview; ends with explicit "what a pass does not prove". +- No accuracy number is quoted (none has a ruler to carry here). +- Every command shown exists in the CLI and runs offline — no fabricated `demo` / `sign-receipt`. +- "Independently-verified" is not claimed where the code only reaches `ISSUER_ATTESTED` (#681). + +## Design-detector result + +`impeccable detect` → **1 finding, accepted:** `overused-font: inter`. Inter is trustshell.dev's +own body face; this section inherits the established world, so the face is intentional, not a +default. All other findings (contrast, sub-11px micro-labels, flat type steps, italic-serif hero +tell, em-dash saturation) were fixed. Verified rendered at desktop and 375px mobile. + +## What this draft does NOT do + +It does not deploy, it does not touch the live trustshell.dev, and it introduces no claim the +engine cannot already back. Any new public copy here is a MAJOR change and is the owner's call. diff --git a/docs/trustshell-dev-draft/receipts-section.html b/docs/trustshell-dev-draft/receipts-section.html new file mode 100644 index 00000000..eb1372b6 --- /dev/null +++ b/docs/trustshell-dev-draft/receipts-section.html @@ -0,0 +1,315 @@ + + + + + +Receipts, not promises — trustshell.dev draft + + + + + + +
+ +
+

Receipts, not promises.

+

A TrustShell action is decided before it runs, recorded while it runs, and sealed into a receipt anyone can check offline — one that is strict about what it refuses to claim. Five steps, no single “valid” badge at the end of any of them.

+
    +
  1. 1 Enforce→
  2. +
  3. 2 Observe→
  4. +
  5. 3 Verify→
  6. +
  7. 4 Earn→
  8. +
  9. 5 Reuse→
  10. +
+
+ + +
+ Step 1Enforce +

The owner decides before the tool runs

+

A policy you own lists what may run and pins each tool to one executable by path and sha256. The decision and its record come before the command starts — a command that is not listed, or whose binary was swapped, never starts.

+
+
$ trustshell guard init                                 # write the owner policy; every limit 0
+$ trustshell guard allow tool:git --exe "$(command -v git)"   # list it AND pin it by path+sha256
+$ trustshell run --tool git -- "$(command -v git)" --version  # decided+recorded, then runs
+$ trustshell run --tool git -- ./not-the-pinned-git --version # REFUSED before it starts (exit 5)
+
+
With a policy in place, anything unlisted is denied, and no policy at all means nothing runs (exit 2) — never a silent allow. This is where the receipt’s authorization and containment claims come from.
+
+ + +
+ Step 2Observe +

What happened is recorded — and so is what no one watched

+

The run records the plain facts it has: the exit code, the signal, the duration. It does not claim to have watched the work. The card says so in those words, and the record goes into a local, hash-chained log you can check offline.

+
+
$ trustshell inspect                     # verify the local tool-call log — opens NO socket
+INTACT  .trustshell/session.jsonl      # exit 0 · BROKEN (1) / UNCHAINED (3) / NO_LOG (3)
+
+
The run card reads independently observed — nothing: no outside party watched this command. “Exited 0” is recorded as an exit code, never promoted to “succeeded”, “correct”, or “verified”.
+
+ + +
+ Step 3Verify +

One receipt, six separate claims

+

There is no single “valid” badge. verify-receipt recomputes the hash and the signature locally — no network, no engine — and reports each claim on its own, with its own gaps.

+ +
+
+ $ trustshell verify-receipt r.json --root 0x8e8c…7222 + exit 0 +
+
Offline verdict — sealer ✓ trusted under the pinned key. No network was used.
+
    +
  • IntegrityVERIFIEDThe bytes are whole: the hash matches the contents, and a pinned Ed25519 key sealed them.
  • +
  • AuthenticityNOT_CHECKEDNo six-claim envelope was supplied, and this cannot be derived from the receipt alone.
  • +
  • ObservationNOT_CHECKEDNo outcome (e.g. a payment settling on chain) was observed and attested.
  • +
  • CorrectnessNOT_CHECKEDThe content was not verified against its source.
  • +
  • AuthorizationNOT_CHECKEDWhether the kernel permitted this action under its policy is not established here.
  • +
  • ContainmentNOT_CHECKEDThat the tool ran only under an ALLOW decision is not established here.
  • +
+
NOT_CHECKED is never a pass. Offline verification proves two things by cryptography: the bytes are whole, and a pinned key sealed them. Every other claim is read from an authenticated envelope or stays NOT_CHECKED — so exit is keyed to integrity: 0 VERIFIED, 1 FAILED, 2 NOT_CHECKED.
+
+
+ + +
+ Step 4Earn +

Three levels of evidence, never collapsed

+

A signature says who sealed a receipt — not that an action was permitted, and not that it earned a reputation. The levels do not blur together, and you can only reach the first one by yourself.

+ +
+
+

Owner-self-signed you can do this now

+

Sealed with your install’s own key. Integrity verifies under the key you pin, offline.

+

Proves authorship and wholeness, nothing more. Not independent verification, and it earns no production RepID.

+
+
+

Issuer-attested the engine’s key

+

An engine key sealed the receipt and an authenticated six-claim envelope backs it, so a claim beyond Integrity reads VERIFIED.

+

The engine’s key is not independent of the issuer, so this is not yet independent verification — and still not reputation. Verification and reputation are separate gates.

+
+
+

RepID-eligible the engine decides

+

Whether a receipt earns portable reputation is the engine’s call, against its own pinned key.

+

Never an offline verdict, and never self-declared. An owner cannot promote their own receipt here.

+
+
+
+ + +
+ Step 5Reuse +

Carry what was earned — authority stays home

+

A bundle is one Ed25519-signed file: your profile, the policy by hash, the notes you choose, and evidence pointers by sha256. Never credentials, keys, or spending authority. What travels is evidence a stranger can check; what does not travel is the power to act.

+
+
$ trustshell bundle export carry.sig --notes released   # sign a carry; the key never goes in it
+$ trustshell bundle import carry.sig                    # verify its signature, then write it here
+
+
On import, authority does not come with it: notes land untrusted and quarantined, and a policy is enforced only if its owner signature verifies with a key you trust and its nonce is higher than the one in force. The same receipt and the same RepID carry across contexts without carrying the right to act.
+
+ + +
+

What a receipt does not prove

+ + +
+

Run the enforced path and check its log yourself — no account, no network, no container:

+
$ npx @hyperdag/trustshell@latest guard init
+$ npx @hyperdag/trustshell@latest guard allow tool:git --exe "$(command -v git)"
+$ npx @hyperdag/trustshell@latest run --tool git -- "$(command -v git)" --version
+$ npx @hyperdag/trustshell@latest inspect                 # INTACT — the local log holds
+

And verify any receipt you are handed, offline:

+
$ npx @hyperdag/trustshell@latest verify-receipt r.json --root 0x…
+
+ +

Developer preview·Apache-2.0·free, no account·offline verification, no engine required

+
+ +
+ + +