Skip to content

Commit 09250e4

Browse files
committed
docs: refresh README and add front-end derived banner
README had drifted 23 commits behind develop. Bring it back to the shipped surface and give it the product's own nav panel as a banner. Documentation corrections: - Add packages/brand to the repository layout and describe apps/api's MCP endpoint and personal-credential role. - Replace the retired four-tab console and "Tools" section with the five cabinet sections that exist today, and document the /docs/mcp route. - Add the user-wallet, MCP, and profile-credential routes to the API table, and note that the transport and operator routes sit outside the frozen v1 contract pack. - Describe the non-custodial MCP payment flow and digest-stored personal bearers in a new Agent access section. - Record that a browser caller's workspace is derived from its verified Privy subject, and that every committed settlement captures Graph evidence through a durable outbox job with a backfill for older settlements. - Repair a duplicated sentence fragment in Project status and add the user-wallet and MCP rows to the status table. The banner is not hand-drawn. scripts/render-nav-panel.mjs reads the palette from packages/brand/src/tokens.css, the mark geometry from CommitRing.tsx, and the nav labels from apps/web/src/App.tsx, then emits one SVG per theme. GitHub strips CSS from Markdown, so the README selects between them with a <picture> element. tokens.css remains the only source of a brand colour.
1 parent 65200cc commit 09250e4

5 files changed

Lines changed: 412 additions & 41 deletions

File tree

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# README refresh and front-end derived banner — active context
2+
3+
## Date/time
4+
5+
- UTC: 2026-09-13T16:00:00Z
6+
7+
## User goal
8+
9+
Audit the repository, bring `README.md` back in line with the current code, and
10+
put the product's own `.top-nav` panel ("OneShot / SETTLEMENT ENGINE") into the
11+
README, derived from the front-end source rather than from a screenshot.
12+
13+
## Acceptance criteria
14+
15+
- README reflects the routes, workspace sections, API surface, repository
16+
layout, and delivery status that exist on `develop` today.
17+
- The README banner is generated from `packages/brand/src/tokens.css`,
18+
`packages/brand/src/CommitRing.tsx`, and `apps/web/src/App.tsx`; no colour,
19+
mark geometry, or nav label is retyped by hand.
20+
- `markdownlint`, `prettier --check`, `eslint`, and `tsc -b` stay green.
21+
- No behaviour, contract, or configuration change.
22+
23+
## Assumptions
24+
25+
- GitHub strips CSS from Markdown, so the panel ships as two static SVGs (one
26+
per theme) chosen by a `<picture>` element rather than as live markup.
27+
- Advance widths in the renderer are estimates; Rubik cannot be measured
28+
without a font engine, and sub-pixel slack inside a pill is not visible.
29+
30+
## Non-goals
31+
32+
- No change to `apps/web`, the API, or any adapter.
33+
- No sponsor-qualification claim beyond what `docs/settlement/LIVE_EVIDENCE.md`
34+
and the C06 report already support.
35+
36+
## Branch state
37+
38+
- Branch: `feature/readme-refresh`
39+
- Base: `origin/develop` at `65200cc2dfcf22912e532a157232e439d623044f`
40+
- Untracked `packages/brand/test/slice-styles.test.ts` is unrelated user work
41+
and stays out of this change.
42+
43+
## Drift corrected in README
44+
45+
- `packages/brand` and the MCP/agent role of `apps/api` were missing from the
46+
repository layout.
47+
- The `/docs/mcp` route, the five cabinet sections, and the Profile MCP bearer
48+
flow were undocumented; the old copy still described the legacy four-tab
49+
console and a "Tools" section that no longer exists.
50+
- The API table was missing `/v1/jobs/user-wallet/prepare`,
51+
`/v1/jobs/{jobId}/user-wallet/submit`, `/mcp`, and the
52+
`/v1/profile/mcp-token` routes.
53+
- Workspace identity is now derived from the verified Privy subject, not from
54+
the configured workspace id.
55+
- Graph evidence is captured for every committed settlement, with a backfill.
56+
- A duplicated sentence fragment in Project status was repaired.
57+
58+
## Commands and results
59+
60+
- `node scripts/render-nav-panel.mjs` — wrote both SVGs.
61+
- `npx markdownlint-cli2 README.md` — 0 errors.
62+
- `pnpm format:check` — all matched files use Prettier style.
63+
- `pnpm lint` — clean.
64+
- `pnpm typecheck` — clean.
65+
66+
## Gate state
67+
68+
The user explicitly waived FreePi Gate A and Gate B for this documentation-only
69+
change and asked for a draft pull request instead. No gate verdict exists, so
70+
the PR stays in draft until a human decides how to proceed.
71+
72+
## Remaining risk
73+
74+
- Local `pnpm test` / `pnpm test:browser` were not re-run; the change touches
75+
no source consumed by either suite.
76+
- No independent review evidence backs this tree.

‎README.md‎

Lines changed: 95 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,17 @@
1+
<!-- Rendered from apps/web's own `.top-nav` by `scripts/render-nav-panel.mjs`;
2+
re-run that script after a brand token, mark, or nav label change. -->
3+
<picture>
4+
<source
5+
media="(prefers-color-scheme: dark)"
6+
srcset="docs/assets/nav-panel-dark.svg"
7+
/>
8+
<img
9+
src="docs/assets/nav-panel-light.svg"
10+
alt="OneShot settlement engine — Arc Testnet, USDC, open workspace"
11+
width="1000"
12+
/>
13+
</picture>
14+
115
# OneShot
216

317
**One job. Many retries. One settlement.**
@@ -8,10 +22,10 @@ parallel workers, and multiple agent instances.
822

923
Product direction: **resumable paid tools for business agents** — resume the
1024
job, not the payment. The settlement engine includes one team-operated testnet
11-
report supplier, task-bound order/result delivery, and separate public (`/`)
12-
and authenticated cabinet (`/app`) routes. Resumable external work requires
13-
supplier support; this is not a guarantee of exactly-once execution for
14-
arbitrary tools.
25+
report supplier, task-bound order/result delivery, a one-tool MCP endpoint for
26+
agents, and separate public (`/`), agent-docs (`/docs/mcp`), and authenticated
27+
cabinet (`/app`) routes. Resumable external work requires supplier support; this
28+
is not a guarantee of exactly-once execution for arbitrary tools.
1529

1630
The cardinality it protects is:
1731

@@ -137,9 +151,10 @@ lock: OneShot's durable state is.
137151
## Repository layout
138152

139153
```text
140-
apps/api HTTP seam
141-
apps/web composed operator UI (intent, settlement, recovery)
154+
apps/api HTTP seam, MCP endpoint, personal MCP credentials
155+
apps/web landing, agent docs, and operator workspace
142156
apps/worker settlement and reconciliation workers
157+
packages/brand brand tokens, commit-ring mark, hero geometry
143158
packages/supplier-adapter idempotent team-operated testnet report connector
144159
packages/contracts frozen v1 contract pack, OpenAPI, fixtures
145160
packages/domain intent, attempt, and settlement state
@@ -166,26 +181,36 @@ pnpm build:frontend
166181
pnpm --filter @oneshot/web dev
167182
```
168183

169-
Open `http://localhost:3000/`. The app shell composes create/replay,
170-
authoritative status, settlement evidence, and recovery evidence tabs. The
171-
settlement tab reads the configured OneShot API; the recovery tab projects the
172-
frozen `recovery-view` API into the C05 timeline model, with labelled
173-
fail-closed fallbacks for legacy or unavailable evidence. The P5 browser
174-
acceptance suite runs with Playwright/Chromium in CI.
184+
Open `http://localhost:3000/` for the public landing page, `/docs/mcp` for the
185+
agent connection guide, and `/app` for the authenticated workspace. The
186+
workspace composes five sections — Overview, Payment services, Requests,
187+
Payment proof, and Profile. Payment proof reads the configured OneShot API and
188+
projects the frozen `recovery-view` API into the C05 timeline model, with
189+
labelled fail-closed fallbacks for legacy or unavailable evidence, and
190+
distinguishes a Graph observation that is still pending from proof that no
191+
payment happened. Profile issues and rotates the personal MCP bearer. The P5
192+
browser acceptance suite runs with Playwright/Chromium in CI.
175193

176194
Authenticated wallet activity is read-only: the API records bounded Graph
177-
observations, links indexed transfers to settlements in the configured
178-
workspace, and surfaces unmatched transfers. Graph absence or lag never changes
195+
observations, links indexed transfers to settlements in the caller's workspace,
196+
and surfaces unmatched transfers. Every committed settlement captures Graph
197+
evidence through a durable, idempotent outbox job, including a backfill for
198+
settlements that predate that capture. Graph absence or lag never changes
179199
payment authority.
180200

201+
A browser caller's workspace is derived from its verified Privy subject, so
202+
jobs, results, and activity are scoped to the signed-in operator rather than to
203+
a caller-supplied identifier.
204+
181205
Integration tests need a database:
182206

183207
```bash
184208
pnpm test:integration
185209
```
186210

187-
Copy `.env.example` to `.env` and fill in placeholders. Never commit a real
188-
secret; see `docs/settlement/SETTLEMENT_CONFIG_V1.md` for how each variable is
211+
Copy `.env.example` to `.env` and `apps/web/.env.example` to
212+
`apps/web/.env.local`, then fill in placeholders. Never commit a real secret;
213+
see `docs/settlement/SETTLEMENT_CONFIG_V1.md` for how each variable is
189214
classified.
190215

191216
### Operator sign-in
@@ -237,12 +262,10 @@ Cloudflare Workers Build checkout.
237262
### Arc Testnet transfer demo
238263

239264
The resumable job flow uses a deliberately labelled team-operated supplier
240-
until an external supplier is selected. In Tools, enter the exact Arc Testnet
241-
recipient and USDC amount for the purchase. The amount must be within the
242-
settlement cap. The existing worker authorizes and submits the exact quote
243-
through Privy on Arc Testnet. A committed job's settlement and ArcScan
244-
evidence remain authoritative; delivery resume never submits a replacement
245-
payment.
265+
until an external supplier is selected. In Payment services, enter the exact Arc
266+
Testnet recipient and USDC amount for the purchase. The amount must be within
267+
the settlement cap. A committed job's settlement and ArcScan evidence remain
268+
authoritative; delivery resume never submits a replacement payment.
246269

247270
`pnpm demo:r4` runs the response-loss drill offline by default. The live mode
248271
requires an explicit Arc Testnet confirmation and the reviewed worker hook;
@@ -261,26 +284,54 @@ shown for retries; users do not need to invent one. After settlement, the job
261284
list links directly to ArcScan and keeps the supplier result separate from
262285
payment evidence.
263286

264-
| Method | Path | Purpose |
265-
| ------ | -------------------------------- | ------------------------------------------------------------- |
266-
| `POST` | `/v1/intents` | Create an intent; an identical replay returns the same result |
267-
| `GET` | `/v1/intents/{id}` | Authoritative intent, attempts, settlement, evidence |
268-
| `POST` | `/v1/intents/{id}/reconcile` | Trigger read-only reconciliation; never submits |
269-
| `GET` | `/v1/intents/{id}/recovery-view` | Local authority plus labelled provider observations |
270-
| `POST` | `/v1/jobs` | Start/replay one workspace-scoped team report task |
271-
| `POST` | `/v1/jobs/quote` | Return a non-chargeable quote before explicit approval |
272-
| `GET` | `/v1/jobs` | List workspace jobs and delivery state |
273-
| `GET` | `/v1/jobs/{jobId}` | Read a workspace-owned job |
274-
| `POST` | `/v1/jobs/{jobId}/resume` | Resume original supplier delivery; never submits payment |
275-
| `GET` | `/v1/jobs/{jobId}/result` | Retrieve an existing supplier result; never submits payment |
276-
| `GET` | `/v1/activity` | Last bounded Graph activity observation and local comparison |
277-
| `POST` | `/v1/activity/refresh` | Manually refresh Graph activity; no settlement action |
278-
| `GET` | `/v1/metrics` | Operational metrics |
279-
| `GET` | `/health/live` | Process liveness |
280-
| `GET` | `/health/ready` | Configuration and Arc identity readiness |
287+
| Method | Path | Purpose |
288+
| ------ | ------------------------------------- | -------------------------------------------------------------- |
289+
| `POST` | `/v1/intents` | Create an intent; an identical replay returns the same result |
290+
| `GET` | `/v1/intents/{id}` | Authoritative intent, attempts, settlement, evidence |
291+
| `POST` | `/v1/intents/{id}/reconcile` | Trigger read-only reconciliation; never submits |
292+
| `GET` | `/v1/intents/{id}/recovery-view` | Local authority plus labelled provider observations |
293+
| `POST` | `/v1/jobs` | Start/replay one workspace-scoped team report task |
294+
| `POST` | `/v1/jobs/quote` | Return a non-chargeable quote before explicit approval |
295+
| `POST` | `/v1/jobs/user-wallet/prepare` | Bind a payer wallet and return the exact transfer to sign |
296+
| `GET` | `/v1/jobs` | List workspace jobs and delivery state |
297+
| `GET` | `/v1/jobs/{jobId}` | Read a workspace-owned job |
298+
| `POST` | `/v1/jobs/{jobId}/user-wallet/submit` | Bind a signed transaction hash and verify its receipt |
299+
| `POST` | `/v1/jobs/{jobId}/resume` | Resume original supplier delivery; never submits payment |
300+
| `GET` | `/v1/jobs/{jobId}/result` | Retrieve an existing supplier result; never submits payment |
301+
| `GET` | `/v1/activity` | Last bounded Graph activity observation and local comparison |
302+
| `POST` | `/v1/activity/refresh` | Manually refresh Graph activity; no settlement action |
303+
| `GET` | `/v1/metrics` | Operational metrics |
304+
| `GET` | `/health/live` | Process liveness |
305+
| `GET` | `/health/ready` | Configuration and Arc identity readiness |
281306

282307
The contract is defined in `packages/contracts/openapi/openapi.v1.json`.
283308

309+
### Agent access (MCP)
310+
311+
Agents reach the same durable job path through one Streamable HTTP MCP
312+
endpoint. The flow is non-custodial: `arc_payment` creates or replays a
313+
payer-bound job and returns the exact Arc Testnet USDC transaction request, the
314+
user's own wallet signs and broadcasts it, and `arc_payment_submit` hands back
315+
the transaction hash so OneShot can bind it and verify the receipt and its
316+
single matching `Transfer` log.
317+
318+
The MCP bearer authenticates a workspace. It does not authorize a server payer
319+
and cannot sign or broadcast anything. Personal bearers are issued from the
320+
authenticated Profile and stored only as SHA-256 digests; the legacy
321+
operator-controlled `ONESHOT_MCP_BEARER_TOKEN` remains optional.
322+
323+
| Method | Path | Purpose |
324+
| ------ | ------------------------------ | -------------------------------------------------------------- |
325+
| `ALL` | `/mcp` | MCP endpoint exposing `arc_payment` and `arc_payment_submit` |
326+
| `GET` | `/v1/profile/mcp-token` | Report whether this workspace holds a personal MCP bearer |
327+
| `POST` | `/v1/profile/mcp-token` | Issue a personal MCP bearer; only its digest is stored |
328+
| `POST` | `/v1/profile/mcp-token/rotate` | Replace the personal MCP bearer |
329+
330+
These operator and agent-transport routes sit outside the frozen v1 contract
331+
pack. See [`docs/MCP_ARC_PAYMENT.md`](docs/MCP_ARC_PAYMENT.md) for deployment,
332+
client configuration, and the live walkthrough, or open `/docs/mcp` in the
333+
running web app.
334+
284335
## Project status
285336

286337
Under active development. **Testnet only.**
@@ -292,15 +343,18 @@ Under active development. **Testnet only.**
292343
| Recovery evidence and safety core | Live Graph/Vertex path implemented; deterministic core remains authoritative |
293344
| Graph discovery and LLM recovery agent | Studio GraphQL path implemented; fresh sponsor trace pending; deterministic core remains final |
294345
| Resumable team report job | Local code: task/order/intent binding, separate delivery and result retrieval |
295-
| Public landing and cabinet | Local code at `/` and `/app`; live R4 demonstration evidence remains pending |
346+
| User-wallet payments (browser and MCP) | Local code: payer binding, wallet-side signing, receipt and `Transfer` verification |
347+
| Agent MCP endpoint | Deployed; bearer authentication and tool discovery verified, no live MCP payment trace yet |
348+
| Public landing, agent docs, cabinet | Local code at `/`, `/docs/mcp`, and `/app`; live R4 demonstration evidence remains pending |
296349

297350
**One live testnet settlement has been executed.** A Privy-controlled execution
298351
wallet and scoped policy authorized one 1.00 USDC Arc Testnet transfer; live
299352
wrong-recipient and above-cap denials produced zero broadcasts. A lost-response
300353
drill entered `UNKNOWN` and reconciled to that original settlement without a
301354
replacement payment. Privy and Arc are `QUALIFIED` for the documented testnet
302355
claim; see `docs/settlement/LIVE_EVIDENCE.md` and
303-
`packages/reconciliation/docs/c06/QUALIFICATION_REPORT.md`. The Graph live
356+
`packages/reconciliation/docs/c06/QUALIFICATION_REPORT.md`.
357+
304358
The Graph recovery path is currently `NOT VERIFIED` for sponsor qualification:
305359
Studio GraphQL is implemented, but a fresh live trace showing its material
306360
effect on the model and deterministic core is still required.

‎docs/assets/nav-panel-dark.svg‎

Lines changed: 27 additions & 0 deletions
Loading

0 commit comments

Comments
 (0)