Implement trust page and extend store/status API contract docs

This commit is contained in:
Joshua 2026-02-17 12:03:21 -08:00
parent ffb8ce0ead
commit df0788fb43
7 changed files with 193 additions and 1 deletions

View File

@ -8,6 +8,7 @@ Public-facing EDUT web surfaces and deployment specs.
public/ public/
index.html index.html
store/index.html store/index.html
trust/index.html
privacy/index.html privacy/index.html
terms/index.html terms/index.html
translations/ translations/

View File

@ -180,3 +180,28 @@ Error (`422` invalid email):
"message": "Email format is invalid." "message": "Email format is invalid."
} }
``` ```
## 6) `GET /secret/membership/status`
Request by wallet:
`GET /secret/membership/status?wallet=0x3ea6cbf98d23e2cf7b6f4f9bb1fb4f50b710f2d5`
Success (`200`):
```json
{
"status": "active",
"wallet": "0x3ea6cbf98d23e2cf7b6f4f9bb1fb4f50b710f2d5",
"designation_code": "0217073045482"
}
```
Error (`400` missing selectors):
```json
{
"error": "missing_selector",
"message": "Provide wallet or designation_code."
}
```

View File

@ -70,6 +70,28 @@ paths:
application/json: application/json:
schema: schema:
$ref: '#/components/schemas/MembershipConfirmResponse' $ref: '#/components/schemas/MembershipConfirmResponse'
/secret/membership/status:
get:
summary: Resolve membership status by wallet or designation code
parameters:
- in: query
name: wallet
required: false
schema:
type: string
pattern: '^0x[a-fA-F0-9]{40}$'
- in: query
name: designation_code
required: false
schema:
type: string
responses:
'200':
description: Membership status resolved
content:
application/json:
schema:
$ref: '#/components/schemas/MembershipStatusResponse'
/secret/notify: /secret/notify:
post: post:
summary: Save optional notification email summary: Save optional notification email
@ -232,6 +254,17 @@ components:
activated_at: activated_at:
type: string type: string
format: date-time format: date-time
MembershipStatusResponse:
type: object
required: [status]
properties:
status:
type: string
enum: [active, none, suspended, revoked, unknown]
wallet:
type: string
designation_code:
type: string
NotifyRequest: NotifyRequest:
type: object type: object
required: [email, designation_code, wallet, locale] required: [email, designation_code, wallet, locale]

View File

@ -4,6 +4,8 @@
Provide transparent operational facts without exposing private internals. Provide transparent operational facts without exposing private internals.
Current implementation target: `/public/trust/index.html` (deployment placeholders included).
## Required Sections ## Required Sections
1. Active chain and chain ID. 1. Active chain and chain ID.

View File

@ -38,6 +38,7 @@ Implemented now:
11. Conformance vectors + failure matrix + release gate + security checklist. 11. Conformance vectors + failure matrix + release gate + security checklist.
12. Deployment templates + invariants + chain operations runbook. 12. Deployment templates + invariants + chain operations runbook.
13. Issuer onboarding pack, migration policy, trust page spec, and integration mapping docs. 13. Issuer onboarding pack, migration policy, trust page spec, and integration mapping docs.
14. Public `/trust` page scaffold aligned with trust-page spec.
Remaining in this repo: Remaining in this repo:

View File

@ -181,7 +181,7 @@
</section> </section>
</div> </div>
<p class="foot">This page is intentionally deterministic: if membership cannot be confirmed, purchase remains blocked.</p> <p class="foot">This page is intentionally deterministic: if membership cannot be confirmed, purchase remains blocked. <a href="/trust">Trust page</a>.</p>
</div> </div>
<script> <script>

130
public/trust/index.html Normal file
View File

@ -0,0 +1,130 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>EDUT Trust</title>
<meta name="description" content="Operational trust facts for EDUT membership and marketplace infrastructure.">
<meta name="theme-color" content="#f0f4f8">
<style>
@import url('https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:wght@300;400;500&display=swap');
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
body {
background: #f0f4f8;
color: #2c2c2c;
font-family: 'IBM Plex Mono', 'Courier New', monospace;
min-height: 100vh;
padding: 48px 20px;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.container { max-width: 980px; margin: 0 auto; }
a { color: #2c2c2c; text-underline-offset: 2px; }
.back {
display: inline-block;
margin-bottom: 24px;
font-size: 12px;
letter-spacing: 0.12em;
text-transform: uppercase;
}
h1 {
font-size: 18px;
letter-spacing: 0.16em;
text-transform: uppercase;
font-weight: 400;
margin-bottom: 8px;
}
.sub {
color: #5a5f67;
font-size: 12px;
letter-spacing: 0.08em;
margin-bottom: 26px;
}
.grid {
display: grid;
gap: 14px;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
margin-bottom: 14px;
}
.card {
border: 1px solid #d0d5db;
background: #f8fafc;
padding: 14px;
}
.label {
font-size: 11px;
letter-spacing: 0.1em;
text-transform: uppercase;
color: #6a7179;
margin-bottom: 10px;
}
.line {
font-size: 12px;
line-height: 1.7;
color: #454b54;
}
.mono { word-break: break-all; }
.status {
display: inline-block;
margin-top: 8px;
padding: 3px 8px;
font-size: 10px;
letter-spacing: 0.1em;
text-transform: uppercase;
border: 1px solid #c2c8d0;
color: #5a616a;
}
.ok { border-color: #6f8d72; color: #3f6545; }
.warn { border-color: #99834b; color: #6d5b30; }
.log {
margin-top: 14px;
border-top: 1px solid #d0d5db;
padding-top: 12px;
font-size: 11px;
color: #616870;
line-height: 1.6;
}
</style>
</head>
<body>
<div class="container">
<a href="/" class="back">← Back</a>
<h1>EDUT Trust</h1>
<p class="sub">Public operational facts. No hidden control plane claims.</p>
<div class="grid">
<section class="card">
<p class="label">Chain</p>
<p class="line">Network: <span class="mono">Base Mainnet</span></p>
<p class="line">Chain ID: <span class="mono">8453</span></p>
<span class="status ok">active</span>
</section>
<section class="card">
<p class="label">Contracts</p>
<p class="line">Membership: <span class="mono">pending deployment</span></p>
<p class="line">Offer Registry: <span class="mono">pending deployment</span></p>
<p class="line">Entitlement: <span class="mono">pending deployment</span></p>
<span class="status warn">addresses pending</span>
</section>
<section class="card">
<p class="label">Policy Snapshot</p>
<p class="line">Membership floor: <span class="mono">USD 5.00 equivalent</span></p>
<p class="line">Policy hash: <span class="mono">pending publication</span></p>
<p class="line">Updated: <span class="mono">pending deployment</span></p>
</section>
<section class="card">
<p class="label">API Health Targets</p>
<p class="line">/secret/wallet/intent</p>
<p class="line">/secret/wallet/verify</p>
<p class="line">/secret/membership/quote</p>
<p class="line">/secret/membership/confirm</p>
</section>
</div>
<p class="log">This trust page is deployment-bound. Replace placeholders with signed release values from <span class="mono">docs/deployment/*.json</span> before go-live.</p>
</div>
</body>
</html>