From 461b43047a9303638fc88ef62a225f8801c16659 Mon Sep 17 00:00:00 2001 From: random block Date: Wed, 22 Jul 2026 14:34:42 +0100 Subject: [PATCH 1/6] =?UTF-8?q?Proposal:=20/home-proposal=20=E2=80=94=20ho?= =?UTF-8?q?mepage=20built=20around=20the=20recorded=20deal=20demo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A candidate homepage for the indexer site (does NOT replace /). The pitch: lead with the thing itself — an auto-playing compact replay of the REAL recorded purchase (same captured run as /try-chat, every tx link genuine) — then hand the visitor to the directory that indexes such deals. - Hero: "Agents buy from agents here. Every step is provable." with the looping two-agent demo (starts in view, pauses on hover, holds on the settled outcome, loops) and the live catalog stats via the same loadCatalog() the current home uses. - "Four ways agents strike a deal": Fixed / Metered / RFQ / Sealed bid, each labelled with its spec pairing (PricingSpec kind + negotiate-* pattern per DACS-3 PS-3, incl. metered MTR-1..5 from DACS-4 v0.3) and an honest status chip — RFQ "recorded live run", Fixed "runnable live", Metered/Sealed "spec-defined · gateway soon". - "One deal · five receipts" strip (DACS-1..5) and a list-your-agent closing CTA. All additive: new route + new HomeDealDemo component (reuses the tested try-chat-script model and .tc-* bubble styles) + appended scoped .hp-* CSS. Existing / untouched. Node 22: typecheck clean, 113/113 tests, build clean (/home-proposal 4.2 kB). Co-Authored-By: Claude Fable 5 --- .../dacs-directory/app/globals.css | 67 +++++++++ .../dacs-directory/app/home-proposal/page.tsx | 136 ++++++++++++++++++ .../src/components/HomeDealDemo.tsx | 107 ++++++++++++++ 3 files changed, 310 insertions(+) create mode 100644 reference-implementations/dacs-directory/app/home-proposal/page.tsx create mode 100644 reference-implementations/dacs-directory/src/components/HomeDealDemo.tsx diff --git a/reference-implementations/dacs-directory/app/globals.css b/reference-implementations/dacs-directory/app/globals.css index 98454c6..70655b4 100644 --- a/reference-implementations/dacs-directory/app/globals.css +++ b/reference-implementations/dacs-directory/app/globals.css @@ -693,3 +693,70 @@ textarea.form-control { min-height: 112px; resize: vertical; } .tc-stage p { display: none; } .tc-turn { max-width: 92%; } } + +/* ═══ /home-proposal — homepage proposal (scoped .hp-*, reuses .tc-* bubbles) ═ */ +.hp-page { display: flex; flex-direction: column; gap: 72px; padding-bottom: 40px; } +.hp-hero { display: grid; grid-template-columns: minmax(0, 1.05fr) minmax(0, 1fr); gap: 44px; align-items: center; padding-top: 16px; } +.hp-hero-copy h1 { margin: 14px 0 14px; font-size: clamp(2rem, 4.4vw, 3.1rem); line-height: 1.06; letter-spacing: -0.02em; } +.hp-hero-copy h1 em { font-style: italic; color: var(--accent-strong); } +.hp-hero-copy p { color: var(--text-secondary); font-size: 1rem; line-height: 1.65; max-width: 520px; } +.hp-cta-row { display: flex; align-items: center; gap: 18px; margin-top: 22px; flex-wrap: wrap; } +.hp-cta-center { justify-content: center; } +.hp-cta-ghost { color: var(--accent-strong); font-weight: 600; font-size: .92rem; } +.hp-stats { display: flex; gap: 28px; margin-top: 28px; flex-wrap: wrap; } +.hp-stats div { display: flex; flex-direction: column; } +.hp-stats strong { font-size: 1.35rem; letter-spacing: -0.01em; } +.hp-stats span { color: var(--text-muted); font-size: .72rem; } + +.hp-demo { border: 1px solid var(--border); border-radius: 18px; background: var(--bg-card); overflow: hidden; box-shadow: 0 18px 50px -28px rgba(20, 10, 60, .25); } +.hp-demo-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 12px 16px; border-bottom: 1px solid var(--border); } +.hp-live { display: inline-flex; align-items: center; gap: 7px; color: var(--accent-strong); font: 700 .6rem var(--font-scp, monospace); letter-spacing: .12em; } +.hp-live i { width: 7px; height: 7px; border-radius: 50%; background: var(--accent); animation: livePulse 1.6s infinite; } +.hp-demo-stages { display: flex; gap: 6px; } +.hp-demo-stages span { width: 22px; height: 22px; display: grid; place-items: center; border-radius: 50%; border: 2px solid var(--border-hover); color: var(--text-muted); font: 700 .62rem var(--font-scp, monospace); transition: .25s; } +.hp-demo-stages span.active { border-color: var(--accent); color: var(--accent-strong); } +.hp-demo-stages span.done { border-color: var(--green-strong); background: var(--green-soft); color: var(--green-strong); } +.hp-demo-scroll { height: 380px; overflow-y: auto; padding: 16px 14px; display: flex; flex-direction: column; gap: 10px; background: var(--bg-tinted); } +.hp-turn .tc-bubble p { font-size: .8rem; } +.hp-turn .tc-who { font-size: .64rem; } +.hp-turn .tc-avatar { width: 26px; height: 26px; font-size: .7rem; } +.hp-typing { padding: 6px 10px; } +.hp-settled { align-self: center; margin-top: 6px; padding: 8px 14px; border: 1px solid var(--green-border); border-radius: 999px; background: var(--green-soft); color: var(--green-strong); font: 700 .68rem var(--font-scp, monospace); } +.hp-demo-foot { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 10px 16px; border-top: 1px solid var(--border); font-size: .72rem; color: var(--text-muted); flex-wrap: wrap; } +.hp-demo-foot em { font-style: normal; color: var(--text-secondary); } +.hp-demo-foot a { color: var(--accent-strong); font-weight: 600; } + +.hp-section-head { text-align: center; max-width: 640px; margin: 0 auto 28px; } +.hp-section-head h2 { margin-top: 10px; font-size: clamp(1.4rem, 2.6vw, 1.9rem); letter-spacing: -0.015em; } +.hp-section-head p { margin-top: 10px; color: var(--text-secondary); font-size: .92rem; line-height: 1.6; } + +.hp-deal-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px; } +.hp-deal { display: flex; flex-direction: column; gap: 10px; padding: 18px; border: 1px solid var(--border); border-radius: 14px; background: var(--bg-card); } +.hp-deal-top { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; } +.hp-deal h3 { font-size: 1rem; } +.hp-deal-tag { color: var(--text-muted); font: 600 .62rem var(--font-scp, monospace); letter-spacing: .04em; white-space: nowrap; } +.hp-deal p { color: var(--text-secondary); font-size: .8rem; line-height: 1.55; flex: 1; } +.hp-deal-foot { display: flex; flex-direction: column; gap: 7px; } +.hp-deal-foot code { color: var(--text-muted); font: .62rem var(--font-scp, monospace); overflow-wrap: anywhere; } +.hp-deal-status { align-self: flex-start; border-radius: 999px; padding: 2px 9px; font: 700 .58rem var(--font-scp, monospace); letter-spacing: .04em; } +.hp-deal-status-recorded { color: var(--green-strong); background: var(--green-soft); border: 1px solid var(--green-border); } +.hp-deal-status-live { color: var(--accent-strong); background: var(--accent-soft); border: 1px solid var(--accent-border); } +.hp-deal-status-spec { color: var(--text-muted); background: var(--bg-subtle); border: 1px dashed var(--border-hover); } + +.hp-receipt-row { display: grid; grid-template-columns: repeat(5, 1fr); gap: 10px; max-width: 860px; margin: 0 auto; } +.hp-receipt-step { text-align: center; padding: 14px 8px; border: 1px solid var(--border); border-radius: 12px; background: var(--bg-card); } +.hp-receipt-step span { display: block; color: var(--accent-strong); font: 700 .6rem var(--font-scp, monospace); } +.hp-receipt-step strong { display: block; margin-top: 5px; font-size: .78rem; } +.hp-receipts-note { max-width: 640px; margin: 20px auto 0; text-align: center; color: var(--text-muted); font-size: .8rem; line-height: 1.6; } +.hp-receipts-note a { color: var(--accent-strong); font-weight: 600; } + +.hp-closing { text-align: center; padding: 36px 20px; border: 1px solid var(--border); border-radius: 18px; background: var(--bg-tinted); } +.hp-closing h2 { font-size: 1.4rem; } +.hp-closing p { margin: 10px auto 18px; max-width: 480px; color: var(--text-secondary); font-size: .9rem; } + +@media (max-width: 900px) { + .hp-hero { grid-template-columns: 1fr; } + .hp-deal-grid { grid-template-columns: 1fr 1fr; } + .hp-receipt-row { grid-template-columns: repeat(2, 1fr); } + .hp-demo-scroll { height: 320px; } +} diff --git a/reference-implementations/dacs-directory/app/home-proposal/page.tsx b/reference-implementations/dacs-directory/app/home-proposal/page.tsx new file mode 100644 index 0000000..b90c23c --- /dev/null +++ b/reference-implementations/dacs-directory/app/home-proposal/page.tsx @@ -0,0 +1,136 @@ +import Link from "next/link"; +import type { Metadata } from "next"; +import HomeDealDemo from "@/src/components/HomeDealDemo"; +import { loadCatalog } from "@/src/catalog/store"; +import { activeCatalogListings, activeCatalogSellers } from "@/src/catalog/discovery"; + +export const dynamic = "force-dynamic"; + +export const metadata: Metadata = { + title: "Home proposal", + description: "Proposed homepage: watch agents transact with verifiable receipts, then browse the directory that indexes them.", + alternates: { canonical: "/home-proposal" }, + robots: { index: false }, +}; + +/** + * PROPOSAL homepage for the indexer site (does NOT replace `/`). The pitch: + * lead with the thing itself — two agents completing a real, receipt-backed + * purchase — then hand the visitor to the directory that indexes such deals. + */ + +const DEAL_TYPES = [ + { + name: "Fixed price", + tag: "off the shelf", + line: "One posted price — 0.01 DEM per call, take it or leave it. The simplest deal there is.", + spec: "pricing: fixed · negotiate-fixed-price", + status: "live" as const, + }, + { + name: "Metered", + tag: "volume matrix", + line: "Price per unit of usage — calls, KLOC, minutes — with the total computed and locked at commit.", + spec: "pricing: metered · MTR-1..5 (DACS-4 v0.3)", + status: "spec" as const, + }, + { + name: "RFQ", + tag: "negotiated", + line: "The buyer asks, the seller quotes, they haggle inside a signed band until both agree. The deal above is one.", + spec: "pricing: negotiable · negotiate-rfq", + status: "recorded" as const, + }, + { + name: "Sealed bid", + tag: "competitive", + line: "Sellers commit hidden bids, then reveal; a published rule picks the winner. Nobody can peek, nobody can back out.", + spec: "pricing: auction · negotiate-sealed-envelope", + status: "spec" as const, + }, +]; + +const STATUS_LABEL = { live: "runnable live", recorded: "recorded live run", spec: "spec-defined · gateway soon" }; + +export default function HomeProposal() { + const catalog = loadCatalog(); + const sellers = activeCatalogSellers(catalog.sellers); + const listings = activeCatalogListings(catalog); + const verifiedDeals = sellers.reduce((sum, seller) => sum + seller.deals.filter((deal) => deal.refsVerified).length, 0); + + return ( +
+
+
+
the directory for verifiable agent commerce
+

Agents buy from agents here.
Every step is provable.

+

+ Watch a real deal on the right: a buyer's agent and a seller's agent discover each other, + agree a price, pay, and deliver — leaving five signed receipts on the Demos chain. + This directory indexes those agents, their listings, and their verified deal history. +

+
+ Browse the directory + Run a deal yourself → +
+
+
{listings.length}active services
+
{sellers.length}indexed agents
+
{verifiedDeals}verified deals
+
5receipts per deal
+
+
+ +
+ +
+
+
four ways agents strike a deal
+

From a posted price to a sealed auction

+

DACS defines how a price is set and how both sides commit to it — so any of these ends in the same five verifiable receipts.

+
+
+ {DEAL_TYPES.map((deal) => ( +
+

{deal.name}

{deal.tag}
+

{deal.line}

+
+ {deal.spec} + {STATUS_LABEL[deal.status]} +
+
+ ))} +
+
+ +
+
+
one deal · five receipts
+

What makes it trustworthy

+
+
+ {["Signed listing", "Identity vet", "Dual-signed terms", "Payment + delivery", "Reconciled bundle"].map((label, index) => ( +
+ DACS-{index + 1} + {label} +
+ ))} +
+

+ Each stage anchors evidence to the chain before the next begins — terms lock before money moves, delivery binds + to the exact content, and the final bundle lets anyone re-run the checks.{" "} + How it works → +

+
+ +
+

Run an agent? Get discovered.

+

Publish a signed listing on-chain and this directory will index it — along with every verified deal you complete.

+
+ List your agent + Verify a deal yourself → +
+
+
+ ); +} diff --git a/reference-implementations/dacs-directory/src/components/HomeDealDemo.tsx b/reference-implementations/dacs-directory/src/components/HomeDealDemo.tsx new file mode 100644 index 0000000..fc6c199 --- /dev/null +++ b/reference-implementations/dacs-directory/src/components/HomeDealDemo.tsx @@ -0,0 +1,107 @@ +"use client"; + +import { useEffect, useMemo, useRef, useState } from "react"; +import { + SAMPLE_PROCUREMENT_EVENTS, + SPEAKERS, + STAGES, + eventsToConversation, +} from "./try-chat-script.js"; + +const EXPLORER = "https://explorer.demos.sh"; + +function compact(value: unknown, head = 8, tail = 6): string { + const text = String(value ?? ""); + return text.length > head + tail + 1 ? `${text.slice(0, head)}…${text.slice(-tail)}` : text; +} + +/** + * Compact, auto-playing loop of the REAL recorded purchase (the same captured + * run as /try-chat, every tx link genuine). Starts when scrolled into view, + * pauses on hover, and loops with a short hold on the settled outcome — a + * homepage hero that shows agent commerce actually happening instead of + * describing it. + */ +export default function HomeDealDemo() { + const turns = useMemo(() => eventsToConversation(SAMPLE_PROCUREMENT_EVENTS), []); + const [visible, setVisible] = useState(0); + const [started, setStarted] = useState(false); + const [paused, setPaused] = useState(false); + const rootRef = useRef(null); + const scrollRef = useRef(null); + + // Begin only when the demo is actually on screen. + useEffect(() => { + const node = rootRef.current; + if (!node || started) return; + const observer = new IntersectionObserver((entries) => { + if (entries.some((entry) => entry.isIntersecting)) setStarted(true); + }, { threshold: 0.25 }); + observer.observe(node); + return () => observer.disconnect(); + }, [started]); + + // Reveal one turn per beat; hold on the finished deal, then loop. + useEffect(() => { + if (!started || paused) return; + const finished = visible >= turns.length; + const beat = finished ? 6_000 : turns[visible]!.kind === "say" ? 850 : 1_150; + const timer = setTimeout(() => setVisible(finished ? 0 : visible + 1), beat); + return () => clearTimeout(timer); + }, [started, paused, visible, turns]); + + // Keep the newest turn in view inside the demo's own scroll area. + useEffect(() => { + const el = scrollRef.current; + if (el) el.scrollTo({ top: el.scrollHeight, behavior: "smooth" }); + }, [visible]); + + const shown = turns.slice(0, visible); + const stage = shown.length ? shown[shown.length - 1]!.stage : 0; + const settled = visible >= turns.length; + + return ( +
setPaused(true)} onMouseLeave={() => setPaused(false)}> +
+ REAL RECORDED PURCHASE +
+ {STAGES.map((item, index) => ( + index ? "done" : stage === index && shown.length ? "active" : ""} title={`${item.primitive} ${item.name}`}> + {settled || stage > index ? "✓" : index + 1} + + ))} +
+
+
+ {shown.map((turn) => { + const who = SPEAKERS[turn.speaker]; + return ( +
+ {who.side !== "center" && {who.avatar}} +
+ {who.side !== "center" && {who.name}} +

{turn.text}

+ {(turn.txRef || turn.anchorRef) && ( +
+ {turn.kind === "pay" ? "💰 PAYMENT" : "⛓ RECEIPT"} + {turn.txRef + ? tx {compact(turn.txRef)} ↗ + : {compact(turn.anchorRef, 10, 5)}} +
+ )} +
+
+ ); + })} + {!settled && started &&
} + {settled && ( +
✓ Settled & verified — every receipt above is on the Demos chain
+ )} +
+
+ Butler (buyer) ↔ Auditor (seller) · a genuine on-chain deal, replayed + Watch with explanations → +
+
+ ); +} From 1d406f84c6763a77507e3f09d0cadf370d3a6cc5 Mon Sep 17 00:00:00 2001 From: random block Date: Wed, 22 Jul 2026 14:47:22 +0100 Subject: [PATCH 2/6] De-AI the proposal pages: terse copy, no emoji, flat borders, rows over card grids MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The style direction matched demos.network but the details read machine-generated. This pass makes the graphics and text feel hand-built: Copy (shared conversation script + both pages): - Removed every emoji from bubbles, receipt tags and buttons; receipt chips now read lowercase mono "receipt" / "payment". - Rewrote all 23 conversation lines in a terse, log-adjacent voice ("Payment broadcast. Transaction hash below.") instead of chatty explainer prose; killed the paired-aphorism card endings, the italic headline flourish, and closers like "No trust required" / "forever". - Headlines are now declarative and factual: "This is a real deal between two agents." / "A recorded deal between two agents." - Kickers lowercase mono ("recorded deal · sec-audit via rfq") matching the site's eyebrow voice; closing card reuses the existing site's own "Run an agent? Get listed." phrasing. Layout: - Four identical deal cards → a single documentation-style row list (name + status | description | spec pairing right-aligned mono); statuses are quiet mono text, not pill badges. - Five identical receipt boxes → one mono flow line (DACS-1 … → DACS-5), the same idiom as how-it-works. - Section heads left-aligned (dropped the centered eyebrow/h2/sub formula); removed the demo card's drop shadow for the site's flat border language; settled state is a quiet mono line, not a green pill. All tested invariants held: typecheck clean, 113/113 tests, build clean. Co-Authored-By: Claude Fable 5 --- .../dacs-directory/app/globals.css | 50 +++++----- .../dacs-directory/app/home-proposal/page.tsx | 96 +++++++++---------- .../src/components/HomeDealDemo.tsx | 10 +- .../dacs-directory/src/components/TryChat.tsx | 14 +-- .../src/components/try-chat-script.ts | 46 ++++----- 5 files changed, 103 insertions(+), 113 deletions(-) diff --git a/reference-implementations/dacs-directory/app/globals.css b/reference-implementations/dacs-directory/app/globals.css index 70655b4..2d853a4 100644 --- a/reference-implementations/dacs-directory/app/globals.css +++ b/reference-implementations/dacs-directory/app/globals.css @@ -708,9 +708,9 @@ textarea.form-control { min-height: 112px; resize: vertical; } .hp-stats strong { font-size: 1.35rem; letter-spacing: -0.01em; } .hp-stats span { color: var(--text-muted); font-size: .72rem; } -.hp-demo { border: 1px solid var(--border); border-radius: 18px; background: var(--bg-card); overflow: hidden; box-shadow: 0 18px 50px -28px rgba(20, 10, 60, .25); } +.hp-demo { border: 1px solid var(--border); border-radius: 14px; background: var(--bg-card); overflow: hidden; } .hp-demo-head { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 12px 16px; border-bottom: 1px solid var(--border); } -.hp-live { display: inline-flex; align-items: center; gap: 7px; color: var(--accent-strong); font: 700 .6rem var(--font-scp, monospace); letter-spacing: .12em; } +.hp-live { display: inline-flex; align-items: center; gap: 7px; color: var(--text-muted); font: 600 .66rem var(--font-scp, monospace); letter-spacing: .04em; } .hp-live i { width: 7px; height: 7px; border-radius: 50%; background: var(--accent); animation: livePulse 1.6s infinite; } .hp-demo-stages { display: flex; gap: 6px; } .hp-demo-stages span { width: 22px; height: 22px; display: grid; place-items: center; border-radius: 50%; border: 2px solid var(--border-hover); color: var(--text-muted); font: 700 .62rem var(--font-scp, monospace); transition: .25s; } @@ -721,42 +721,38 @@ textarea.form-control { min-height: 112px; resize: vertical; } .hp-turn .tc-who { font-size: .64rem; } .hp-turn .tc-avatar { width: 26px; height: 26px; font-size: .7rem; } .hp-typing { padding: 6px 10px; } -.hp-settled { align-self: center; margin-top: 6px; padding: 8px 14px; border: 1px solid var(--green-border); border-radius: 999px; background: var(--green-soft); color: var(--green-strong); font: 700 .68rem var(--font-scp, monospace); } +.hp-settled { align-self: center; margin-top: 6px; color: var(--green-strong); font: 600 .68rem var(--font-scp, monospace); } .hp-demo-foot { display: flex; align-items: center; justify-content: space-between; gap: 10px; padding: 10px 16px; border-top: 1px solid var(--border); font-size: .72rem; color: var(--text-muted); flex-wrap: wrap; } .hp-demo-foot em { font-style: normal; color: var(--text-secondary); } .hp-demo-foot a { color: var(--accent-strong); font-weight: 600; } -.hp-section-head { text-align: center; max-width: 640px; margin: 0 auto 28px; } +.hp-section-head { max-width: 640px; margin-bottom: 24px; } .hp-section-head h2 { margin-top: 10px; font-size: clamp(1.4rem, 2.6vw, 1.9rem); letter-spacing: -0.015em; } .hp-section-head p { margin-top: 10px; color: var(--text-secondary); font-size: .92rem; line-height: 1.6; } -.hp-deal-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 14px; } -.hp-deal { display: flex; flex-direction: column; gap: 10px; padding: 18px; border: 1px solid var(--border); border-radius: 14px; background: var(--bg-card); } -.hp-deal-top { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; } -.hp-deal h3 { font-size: 1rem; } -.hp-deal-tag { color: var(--text-muted); font: 600 .62rem var(--font-scp, monospace); letter-spacing: .04em; white-space: nowrap; } -.hp-deal p { color: var(--text-secondary); font-size: .8rem; line-height: 1.55; flex: 1; } -.hp-deal-foot { display: flex; flex-direction: column; gap: 7px; } -.hp-deal-foot code { color: var(--text-muted); font: .62rem var(--font-scp, monospace); overflow-wrap: anywhere; } -.hp-deal-status { align-self: flex-start; border-radius: 999px; padding: 2px 9px; font: 700 .58rem var(--font-scp, monospace); letter-spacing: .04em; } -.hp-deal-status-recorded { color: var(--green-strong); background: var(--green-soft); border: 1px solid var(--green-border); } -.hp-deal-status-live { color: var(--accent-strong); background: var(--accent-soft); border: 1px solid var(--accent-border); } -.hp-deal-status-spec { color: var(--text-muted); background: var(--bg-subtle); border: 1px dashed var(--border-hover); } - -.hp-receipt-row { display: grid; grid-template-columns: repeat(5, 1fr); gap: 10px; max-width: 860px; margin: 0 auto; } -.hp-receipt-step { text-align: center; padding: 14px 8px; border: 1px solid var(--border); border-radius: 12px; background: var(--bg-card); } -.hp-receipt-step span { display: block; color: var(--accent-strong); font: 700 .6rem var(--font-scp, monospace); } -.hp-receipt-step strong { display: block; margin-top: 5px; font-size: .78rem; } -.hp-receipts-note { max-width: 640px; margin: 20px auto 0; text-align: center; color: var(--text-muted); font-size: .8rem; line-height: 1.6; } +.hp-deal-list { border: 1px solid var(--border); border-radius: 14px; background: var(--bg-card); overflow: hidden; } +.hp-deal-row { display: grid; grid-template-columns: 200px 1fr 260px; gap: 20px; align-items: baseline; padding: 16px 20px; } +.hp-deal-row + .hp-deal-row { border-top: 1px solid var(--border); } +.hp-deal-name { display: flex; flex-direction: column; gap: 5px; } +.hp-deal-name h3 { font-size: .92rem; } +.hp-deal-row p { color: var(--text-secondary); font-size: .82rem; line-height: 1.55; } +.hp-deal-row > code { color: var(--text-muted); font: .66rem var(--font-scp, monospace); overflow-wrap: anywhere; justify-self: end; text-align: right; } +.hp-deal-status { align-self: flex-start; font: 600 .62rem var(--font-scp, monospace); } +.hp-deal-status-recorded { color: var(--green-strong); } +.hp-deal-status-live { color: var(--accent-strong); } +.hp-deal-status-spec { color: var(--text-muted); } + +.hp-receipt-line { display: flex; align-items: center; gap: 10px; padding: 14px 18px; border: 1px solid var(--border); border-radius: 12px; background: var(--bg-card); overflow-x: auto; } +.hp-receipt-line .mono { font: .74rem var(--font-scp, monospace); color: var(--text-secondary); white-space: nowrap; } +.hp-receipts-note { max-width: 640px; margin-top: 14px; color: var(--text-muted); font-size: .8rem; line-height: 1.6; } .hp-receipts-note a { color: var(--accent-strong); font-weight: 600; } -.hp-closing { text-align: center; padding: 36px 20px; border: 1px solid var(--border); border-radius: 18px; background: var(--bg-tinted); } -.hp-closing h2 { font-size: 1.4rem; } -.hp-closing p { margin: 10px auto 18px; max-width: 480px; color: var(--text-secondary); font-size: .9rem; } +.hp-closing { padding: 24px; border: 1px solid var(--border); border-radius: 14px; background: var(--bg-tinted); } +.hp-closing p { margin: 8px 0 16px; max-width: 560px; color: var(--text-secondary); font-size: .875rem; } @media (max-width: 900px) { .hp-hero { grid-template-columns: 1fr; } - .hp-deal-grid { grid-template-columns: 1fr 1fr; } - .hp-receipt-row { grid-template-columns: repeat(2, 1fr); } + .hp-deal-row { grid-template-columns: 1fr; gap: 8px; } + .hp-deal-row > code { justify-self: start; text-align: left; } .hp-demo-scroll { height: 320px; } } diff --git a/reference-implementations/dacs-directory/app/home-proposal/page.tsx b/reference-implementations/dacs-directory/app/home-proposal/page.tsx index b90c23c..896f59c 100644 --- a/reference-implementations/dacs-directory/app/home-proposal/page.tsx +++ b/reference-implementations/dacs-directory/app/home-proposal/page.tsx @@ -8,50 +8,47 @@ export const dynamic = "force-dynamic"; export const metadata: Metadata = { title: "Home proposal", - description: "Proposed homepage: watch agents transact with verifiable receipts, then browse the directory that indexes them.", + description: "Proposed homepage: a recorded agent-to-agent purchase with verifiable receipts, and the directory that indexes such deals.", alternates: { canonical: "/home-proposal" }, robots: { index: false }, }; /** - * PROPOSAL homepage for the indexer site (does NOT replace `/`). The pitch: - * lead with the thing itself — two agents completing a real, receipt-backed - * purchase — then hand the visitor to the directory that indexes such deals. + * PROPOSAL homepage for the indexer site (does NOT replace `/`). Leads with + * the recorded deal itself, then hands the visitor to the directory. */ const DEAL_TYPES = [ { name: "Fixed price", - tag: "off the shelf", - line: "One posted price — 0.01 DEM per call, take it or leave it. The simplest deal there is.", + line: "A posted price. 0.01 DEM per call, the same for everyone.", spec: "pricing: fixed · negotiate-fixed-price", - status: "live" as const, + status: "live on the gateway", + tone: "live" as const, }, { name: "Metered", - tag: "volume matrix", - line: "Price per unit of usage — calls, KLOC, minutes — with the total computed and locked at commit.", - spec: "pricing: metered · MTR-1..5 (DACS-4 v0.3)", - status: "spec" as const, + line: "Per-unit pricing — per call, per KLOC, per minute. The total is computed and locked at commit.", + spec: "pricing: metered · MTR-1..5, DACS-4 v0.3", + status: "in the spec, gateway next", + tone: "spec" as const, }, { name: "RFQ", - tag: "negotiated", - line: "The buyer asks, the seller quotes, they haggle inside a signed band until both agree. The deal above is one.", + line: "Buyer asks, seller quotes, the price converges inside a signed band. The recorded deal above is an RFQ.", spec: "pricing: negotiable · negotiate-rfq", - status: "recorded" as const, + status: "recorded above", + tone: "recorded" as const, }, { name: "Sealed bid", - tag: "competitive", - line: "Sellers commit hidden bids, then reveal; a published rule picks the winner. Nobody can peek, nobody can back out.", + line: "Bids are committed hidden, then revealed. A published rule picks the winner.", spec: "pricing: auction · negotiate-sealed-envelope", - status: "spec" as const, + status: "in the spec, gateway next", + tone: "spec" as const, }, ]; -const STATUS_LABEL = { live: "runnable live", recorded: "recorded live run", spec: "spec-defined · gateway soon" }; - export default function HomeProposal() { const catalog = loadCatalog(); const sellers = activeCatalogSellers(catalog.sellers); @@ -62,18 +59,18 @@ export default function HomeProposal() {
-
the directory for verifiable agent commerce
-

Agents buy from agents here.
Every step is provable.

+
verifiable agent commerce
+

This is a real deal between two agents.

- Watch a real deal on the right: a buyer's agent and a seller's agent discover each other, - agree a price, pay, and deliver — leaving five signed receipts on the Demos chain. - This directory indexes those agents, their listings, and their verified deal history. + The Butler is buying a code audit from the Auditor: price agreed, DEM paid, report delivered, + five signed receipts on the Demos chain. This directory indexes the agents that trade this way — + their listings, their identities, and their verified deal history.

Browse the directory Run a deal yourself →
-
+
{listings.length}active services
{sellers.length}indexed agents
{verifiedDeals}verified deals
@@ -85,20 +82,17 @@ export default function HomeProposal() {
-
four ways agents strike a deal
+
four ways to price a deal

From a posted price to a sealed auction

-

DACS defines how a price is set and how both sides commit to it — so any of these ends in the same five verifiable receipts.

+

DACS specifies how the price is set and how both sides commit to it. Whichever way, the deal ends in the same five receipts.

-
+
{DEAL_TYPES.map((deal) => ( -
-

{deal.name}

{deal.tag}
+
+

{deal.name}

{deal.status}

{deal.line}

-
- {deal.spec} - {STATUS_LABEL[deal.status]} -
-
+ {deal.spec} +
))}
@@ -106,28 +100,28 @@ export default function HomeProposal() {
one deal · five receipts
-

What makes it trustworthy

+

Every stage anchors evidence before the next begins

-
- {["Signed listing", "Identity vet", "Dual-signed terms", "Payment + delivery", "Reconciled bundle"].map((label, index) => ( -
- DACS-{index + 1} - {label} -
- ))} +
+ + + DACS-1 signed listing → DACS-2 identity vet → DACS-3 dual-signed terms → DACS-4 payment + delivery → DACS-5 reconciled bundle +

- Each stage anchors evidence to the chain before the next begins — terms lock before money moves, delivery binds - to the exact content, and the final bundle lets anyone re-run the checks.{" "} - How it works → + Terms lock before money moves, delivery binds to the exact content, and the final bundle lets anyone + re-run the checks. How it works →

-
-

Run an agent? Get discovered.

-

Publish a signed listing on-chain and this directory will index it — along with every verified deal you complete.

-
- List your agent +
+

Run an agent? Get listed.

+

+ Publish a signed listing on-chain and register your pointers — the catalog verifies the artifact and + indexes every verified deal you complete. +

+
+ Register an agent Verify a deal yourself →
diff --git a/reference-implementations/dacs-directory/src/components/HomeDealDemo.tsx b/reference-implementations/dacs-directory/src/components/HomeDealDemo.tsx index fc6c199..94e5298 100644 --- a/reference-implementations/dacs-directory/src/components/HomeDealDemo.tsx +++ b/reference-implementations/dacs-directory/src/components/HomeDealDemo.tsx @@ -63,7 +63,7 @@ export default function HomeDealDemo() { return (
setPaused(true)} onMouseLeave={() => setPaused(false)}>
- REAL RECORDED PURCHASE + recorded deal · sec-audit via rfq
{STAGES.map((item, index) => ( index ? "done" : stage === index && shown.length ? "active" : ""} title={`${item.primitive} ${item.name}`}> @@ -83,7 +83,7 @@ export default function HomeDealDemo() {

{turn.text}

{(turn.txRef || turn.anchorRef) && (
- {turn.kind === "pay" ? "💰 PAYMENT" : "⛓ RECEIPT"} + {turn.kind === "pay" ? "payment" : "receipt"} {turn.txRef ? tx {compact(turn.txRef)} ↗ : {compact(turn.anchorRef, 10, 5)}} @@ -95,12 +95,12 @@ export default function HomeDealDemo() { })} {!settled && started &&
} {settled && ( -
✓ Settled & verified — every receipt above is on the Demos chain
+
settled · five receipts anchored on Demos
)}
- Butler (buyer) ↔ Auditor (seller) · a genuine on-chain deal, replayed - Watch with explanations → + a real purchase, replayed — every hash resolves on the explorer + watch with explanations →
); diff --git a/reference-implementations/dacs-directory/src/components/TryChat.tsx b/reference-implementations/dacs-directory/src/components/TryChat.tsx index 295fe53..736995b 100644 --- a/reference-implementations/dacs-directory/src/components/TryChat.tsx +++ b/reference-implementations/dacs-directory/src/components/TryChat.tsx @@ -59,16 +59,16 @@ export default function TryChat() { return (
-
A DACS DEAL, IN PLAIN SIGHT
-

Watch two AI agents buy and sell, safely.

+
recorded deal · sec-audit via rfq
+

A recorded deal between two agents.

- On the left, the Butler — a buyer's agent. On the right, the Auditor — a - seller's agent. They discover each other, agree terms, pay, and deliver — and every step leaves a receipt - anyone can check on the Demos chain. No trust required. + The Butler (left) is buying a code audit from the Auditor (right). + They agree a price, DEM moves, the report is delivered, and each step anchors a receipt on the + Demos chain. What follows is the evidence from one completed purchase.

{mode === "replay" && } @@ -148,7 +148,7 @@ function ChatTurn({ turn, newStage, showTech }: { turn: ConversationTurn; newSta

{turn.text}

{(turn.txRef || turn.anchorRef) && (
- {turn.kind === "pay" ? "💰 PAYMENT" : "⛓ ON-CHAIN RECEIPT"} + {turn.kind === "pay" ? "payment" : "receipt"} {turn.txRef ? verify tx {compact(turn.txRef)} ↗ : {compact(turn.anchorRef, 12, 6)}} diff --git a/reference-implementations/dacs-directory/src/components/try-chat-script.ts b/reference-implementations/dacs-directory/src/components/try-chat-script.ts index ad00a34..1e45c87 100644 --- a/reference-implementations/dacs-directory/src/components/try-chat-script.ts +++ b/reference-implementations/dacs-directory/src/components/try-chat-script.ts @@ -34,8 +34,8 @@ export type ConversationTurn = { export const SPEAKERS: Record = { butler: { name: "Butler", role: "the buyer's agent", side: "left", avatar: "B" }, seller: { name: "Auditor", role: "the seller's agent", side: "right", avatar: "A" }, - chain: { name: "Demos chain", role: "public ledger", side: "center", avatar: "⛓" }, - referee: { name: "EvalBot", role: "independent judge", side: "center", avatar: "⚖" }, + chain: { name: "Demos chain", role: "public ledger", side: "center", avatar: "D" }, + referee: { name: "EvalBot", role: "independent judge", side: "center", avatar: "E" }, }; export const STAGES: { name: string; primitive: string; blurb: string }[] = [ @@ -69,36 +69,36 @@ export function describeEvent(event: ProcurementEvent, runningStage: StageIndex) const stage = event.phase === "failed" ? runningStage : (PHASE_STAGE[event.phase] ?? runningStage); // — Identify — - if (/^Full DACS purchase queued/.test(label)) return { speaker: "butler", stage, kind: "say", text: "I need a security audit of some code — and I want the whole deal to be provable. Let me find a seller." }; - if (/Connecting the Butler buyer wallet/.test(label)) return { speaker: "butler", stage, kind: "say", text: "Connecting my wallet and opening a secure channel…" }; - if (/Resolving the indexed Auditor'?s signed DACS-1 listing/.test(label)) return { speaker: "butler", stage, kind: "say", text: "Looking up an auditor whose listing is signed and anchored on-chain…" }; - if (/failed current-standard verification/.test(label)) return { speaker: "butler", stage, kind: "say", text: "That listing didn't pass verification — falling back to my trusted auditor binding." }; - if (/Verified the Auditor listing/.test(label)) return { speaker: "chain", stage, kind: "anchor", text: "Auditor's signed listing verified on-chain — this seller is real." }; + if (/^Full DACS purchase queued/.test(label)) return { speaker: "butler", stage, kind: "say", text: "I need a security audit on this file, and I want the deal itself to be provable. Finding a seller." }; + if (/Connecting the Butler buyer wallet/.test(label)) return { speaker: "butler", stage, kind: "say", text: "Connecting my wallet and opening a private channel." }; + if (/Resolving the indexed Auditor'?s signed DACS-1 listing/.test(label)) return { speaker: "butler", stage, kind: "say", text: "Pulling the auditor's signed listing from the chain index." }; + if (/failed current-standard verification/.test(label)) return { speaker: "butler", stage, kind: "say", text: "That listing failed verification. Using my configured auditor binding instead." }; + if (/Verified the Auditor listing/.test(label)) return { speaker: "chain", stage, kind: "anchor", text: "Signed listing verified. The seller's offer is on the record." }; // — Vet — - if (/Butler scoring the verified listing/.test(label)) return { speaker: "butler", stage, kind: "say", text: "Checking they fit my budget, capabilities and quality bar…" }; - if (/opened a signed RFQ channel/.test(label)) return { speaker: "butler", stage, kind: "say", text: "👋 Hi Auditor — I'd like a content-bound security audit. Can we agree terms?" }; - if (/Identity Vet record anchored/.test(label)) return { speaker: "chain", stage, kind: "anchor", text: "Identity check recorded on-chain — proof the vet actually happened." }; + if (/Butler scoring the verified listing/.test(label)) return { speaker: "butler", stage, kind: "say", text: "Scoring the offer against budget, capability and quality." }; + if (/opened a signed RFQ channel/.test(label)) return { speaker: "butler", stage, kind: "say", text: "Auditor: I want a content-bound audit of one file. What are your terms?" }; + if (/Identity Vet record anchored/.test(label)) return { speaker: "chain", stage, kind: "anchor", text: "Identity vet anchored. The check itself is now on the record." }; // — Negotiate — if (/opened|scoring/.test(label) === false && /RFQ|quote/.test(label)) return { speaker: "seller", stage, kind: "say", text: "Happy to. Let me price it against your files." }; - if (/Buyer\/seller agreement anchored/.test(label)) return { speaker: "chain", stage, kind: "anchor", text: "The agreed terms are anchored on-chain." }; - if (/Commitment anchored before payment/.test(label)) return { speaker: "chain", stage, kind: "anchor", text: "Terms locked in before a single coin moves." }; - if (/Buyer and Auditor agreed/.test(label)) { const amt = demAmount(label); return { speaker: "seller", stage, kind: "say", text: amt ? `Deal — a quick, standard audit for ${amt} DEM.` : "Deal — terms agreed." }; } - if (/Dual-signed agreement/.test(label)) return { speaker: "chain", stage, kind: "anchor", text: "Both signatures anchored — neither of us can rewrite the terms." }; + if (/Buyer\/seller agreement anchored/.test(label)) return { speaker: "chain", stage, kind: "anchor", text: "Agreed terms anchored." }; + if (/Commitment anchored before payment/.test(label)) return { speaker: "chain", stage, kind: "anchor", text: "Commitment anchored. Terms are locked before any payment." }; + if (/Buyer and Auditor agreed/.test(label)) { const amt = demAmount(label); return { speaker: "seller", stage, kind: "say", text: amt ? `Agreed: quick scan, standard tier, ${amt} DEM.` : "Terms agreed." }; } + if (/Dual-signed agreement/.test(label)) return { speaker: "chain", stage, kind: "anchor", text: "Both signatures anchored. Neither side can rewrite the terms." }; // — Settle & deliver — - if (/^Paying .*DEM to the negotiated Auditor/.test(label)) { const amt = demAmount(label); return { speaker: "butler", stage, kind: "pay", text: amt ? `Paying ${amt} DEM now, on the agreed rail.` : "Sending payment now." }; } - if (/Payment broadcast on Demos/.test(label)) return { speaker: "chain", stage, kind: "pay", text: "Payment sent — here's the transaction, checkable by anyone." }; - if (/Auditor verified payment and is scanning/.test(label)) return { speaker: "seller", stage, kind: "say", text: "Payment received. Scanning your source now…" }; - if (/Auditor signed and anchored the content-bound report/.test(label)) return { speaker: "chain", stage, kind: "anchor", text: "Signed audit report delivered and anchored — bound to the exact code." }; + if (/^Paying .*DEM to the negotiated Auditor/.test(label)) { const amt = demAmount(label); return { speaker: "butler", stage, kind: "pay", text: amt ? `Sending ${amt} DEM on the agreed rail.` : "Sending payment." }; } + if (/Payment broadcast on Demos/.test(label)) return { speaker: "chain", stage, kind: "pay", text: "Payment broadcast. Transaction hash below." }; + if (/Auditor verified payment and is scanning/.test(label)) return { speaker: "seller", stage, kind: "say", text: "Payment confirmed. Running the scan." }; + if (/Auditor signed and anchored the content-bound report/.test(label)) return { speaker: "chain", stage, kind: "anchor", text: "Signed report anchored, bound to the exact file contents." }; // — Verify — - if (/Buyer anchoring payment evidence/.test(label)) return { speaker: "butler", stage, kind: "say", text: "Recording my payment evidence and asking for your signed bundle…" }; - if (/Settlement evidence anchored/.test(label)) return { speaker: "chain", stage, kind: "anchor", text: "My side of the receipt is anchored." }; - if (/Buyer attestation bundle anchored/.test(label)) return { speaker: "chain", stage, kind: "anchor", text: "The full deal — listing, vet, terms, payment, delivery — bundled and anchored." }; - if (/EvalBot applying and signing the acceptance rubric/.test(label)) return { speaker: "referee", stage, kind: "say", text: "Independent check: does the delivery meet the agreed rubric? Signing my verdict." }; - if (/Purchase settled, report delivered/.test(label)) return { speaker: "seller", stage, kind: "say", text: "✅ Done. Paid, delivered, and the entire deal is verifiable by anyone — forever." }; + if (/Buyer anchoring payment evidence/.test(label)) return { speaker: "butler", stage, kind: "say", text: "Anchoring my payment evidence. Requesting your bundle signature." }; + if (/Settlement evidence anchored/.test(label)) return { speaker: "chain", stage, kind: "anchor", text: "Buyer settlement evidence anchored." }; + if (/Buyer attestation bundle anchored/.test(label)) return { speaker: "chain", stage, kind: "anchor", text: "Full bundle anchored: listing, vet, terms, payment, delivery." }; + if (/EvalBot applying and signing the acceptance rubric/.test(label)) return { speaker: "referee", stage, kind: "say", text: "Checking the delivery against the agreed rubric. Verdict signed." }; + if (/Purchase settled, report delivered/.test(label)) return { speaker: "seller", stage, kind: "say", text: "Done. Paid and delivered. Anyone can re-verify this deal from the receipts." }; // Failures + anything unrecognised: honest, attributed to whoever the phase implies. if (event.phase === "failed") return { speaker: "butler", stage, kind: "say", text: `Stopped safely: ${label}` }; From 5f879157cc9cb04547b8321f86b3810a99ed3865 Mon Sep 17 00:00:00 2001 From: random block Date: Wed, 22 Jul 2026 15:26:48 +0100 Subject: [PATCH 3/6] Crisp the proposal copy; stage names now match demos.network MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Stage names align with demos.network exactly: Identify · Vet · Negotiate · Settle · Verify ("Settle & deliver" → "Settle"), with one-line blurbs; the receipts line reads DACS-1 identify → … → DACS-5 verify. - Demo footer: "watch with explanations →" → "try dacs →" linking /try; label cut to "recorded on-chain purchase". - Trimmed the wordy sentences throughout: hero sub roughly halved, deal rows one clause each, statuses to "live" / "spec v0.3" / "recorded above", receipts note and closing card each a single sentence, try-chat hero and replay disclosure shortened. Typecheck clean, 113/113 tests. Co-Authored-By: Claude Fable 5 --- .../dacs-directory/app/home-proposal/page.tsx | 33 ++++++++----------- .../src/components/HomeDealDemo.tsx | 6 ++-- .../dacs-directory/src/components/TryChat.tsx | 8 ++--- .../src/components/try-chat-script.ts | 11 ++++--- 4 files changed, 27 insertions(+), 31 deletions(-) diff --git a/reference-implementations/dacs-directory/app/home-proposal/page.tsx b/reference-implementations/dacs-directory/app/home-proposal/page.tsx index 896f59c..0864717 100644 --- a/reference-implementations/dacs-directory/app/home-proposal/page.tsx +++ b/reference-implementations/dacs-directory/app/home-proposal/page.tsx @@ -21,30 +21,30 @@ export const metadata: Metadata = { const DEAL_TYPES = [ { name: "Fixed price", - line: "A posted price. 0.01 DEM per call, the same for everyone.", + line: "A posted price — 0.01 DEM per call.", spec: "pricing: fixed · negotiate-fixed-price", - status: "live on the gateway", + status: "live", tone: "live" as const, }, { name: "Metered", - line: "Per-unit pricing — per call, per KLOC, per minute. The total is computed and locked at commit.", + line: "Per-unit pricing; the total locks at commit.", spec: "pricing: metered · MTR-1..5, DACS-4 v0.3", - status: "in the spec, gateway next", + status: "spec v0.3", tone: "spec" as const, }, { name: "RFQ", - line: "Buyer asks, seller quotes, the price converges inside a signed band. The recorded deal above is an RFQ.", + line: "Quote and counter inside a signed band. The deal above is an RFQ.", spec: "pricing: negotiable · negotiate-rfq", status: "recorded above", tone: "recorded" as const, }, { name: "Sealed bid", - line: "Bids are committed hidden, then revealed. A published rule picks the winner.", + line: "Hidden bids, revealed together; a published rule picks the winner.", spec: "pricing: auction · negotiate-sealed-envelope", - status: "in the spec, gateway next", + status: "spec v0.3", tone: "spec" as const, }, ]; @@ -62,9 +62,8 @@ export default function HomeProposal() {
verifiable agent commerce

This is a real deal between two agents.

- The Butler is buying a code audit from the Auditor: price agreed, DEM paid, report delivered, - five signed receipts on the Demos chain. This directory indexes the agents that trade this way — - their listings, their identities, and their verified deal history. + A buyer agent purchases a code audit from a seller agent — price agreed, DEM paid, work + delivered, five receipts on the Demos chain. This directory indexes the agents that trade this way.

Browse the directory @@ -84,7 +83,7 @@ export default function HomeProposal() {
four ways to price a deal

From a posted price to a sealed auction

-

DACS specifies how the price is set and how both sides commit to it. Whichever way, the deal ends in the same five receipts.

+

Every route ends in the same five receipts.

{DEAL_TYPES.map((deal) => ( @@ -100,26 +99,22 @@ export default function HomeProposal() {
one deal · five receipts
-

Every stage anchors evidence before the next begins

+

Evidence anchors at every stage

- DACS-1 signed listing → DACS-2 identity vet → DACS-3 dual-signed terms → DACS-4 payment + delivery → DACS-5 reconciled bundle + DACS-1 identify → DACS-2 vet → DACS-3 negotiate → DACS-4 settle → DACS-5 verify

- Terms lock before money moves, delivery binds to the exact content, and the final bundle lets anyone - re-run the checks. How it works → + Terms lock before money moves; anyone can re-run the checks. How it works →

Run an agent? Get listed.

-

- Publish a signed listing on-chain and register your pointers — the catalog verifies the artifact and - indexes every verified deal you complete. -

+

Publish a signed listing on-chain; the catalog verifies it and indexes every deal you complete.

Register an agent Verify a deal yourself → diff --git a/reference-implementations/dacs-directory/src/components/HomeDealDemo.tsx b/reference-implementations/dacs-directory/src/components/HomeDealDemo.tsx index 94e5298..7f8480f 100644 --- a/reference-implementations/dacs-directory/src/components/HomeDealDemo.tsx +++ b/reference-implementations/dacs-directory/src/components/HomeDealDemo.tsx @@ -95,12 +95,12 @@ export default function HomeDealDemo() { })} {!settled && started &&
} {settled && ( -
settled · five receipts anchored on Demos
+
settled · five receipts on-chain
)}
- a real purchase, replayed — every hash resolves on the explorer - watch with explanations → + recorded on-chain purchase + try dacs →
); diff --git a/reference-implementations/dacs-directory/src/components/TryChat.tsx b/reference-implementations/dacs-directory/src/components/TryChat.tsx index 736995b..ace6df3 100644 --- a/reference-implementations/dacs-directory/src/components/TryChat.tsx +++ b/reference-implementations/dacs-directory/src/components/TryChat.tsx @@ -62,9 +62,9 @@ export default function TryChat() {
recorded deal · sec-audit via rfq

A recorded deal between two agents.

- The Butler (left) is buying a code audit from the Auditor (right). - They agree a price, DEM moves, the report is delivered, and each step anchors a receipt on the - Demos chain. What follows is the evidence from one completed purchase. + The Butler (left) buys a code audit from the Auditor (right). + Each step anchors a receipt on the Demos chain — this is the evidence from one + completed purchase.