+ Red lines +
++ Hard constraints written as code predicates. A crossed red line + rejects an option outright. It is never negotiated away as soft + utility. +
+ preferences.py ++ ana → verdict: ok
+ cara → verdict: red-line
+ option A rejected +
diff --git a/examples/demo/index.html b/examples/demo/index.html index ec7d818..0884fe6 100644 --- a/examples/demo/index.html +++ b/examples/demo/index.html @@ -58,12 +58,13 @@ } *{box-sizing:border-box;margin:0} button,.toggle,.btn,.vbtn,.seg b{-webkit-tap-highlight-color:transparent;touch-action:manipulation;user-select:none} +a{-webkit-tap-highlight-color:transparent} :focus-visible{outline:2px solid var(--indigo);outline-offset:2px;border-radius:var(--r)} html{scroll-behavior:smooth} body{background:var(--bg);color:var(--ink);font-family:var(--sans);font-size:15px;line-height:1.55; -webkit-font-smoothing:antialiased;transition:background .25s var(--ease),color .25s var(--ease); overflow-x:hidden} -.wrap{position:relative;z-index:1;max-width:1080px;margin:0 auto;padding:44px 22px 78px} +.wrap{position:relative;z-index:1;max-width:1080px;margin:0 auto;padding:44px 24px 80px} header{display:flex;align-items:center;justify-content:space-between;gap:16px;flex-wrap:wrap} .brand{display:flex;flex-direction:column;gap:3px} .logo{display:inline-flex;align-items:center;margin:-8px 0;padding:8px 0;font-size:27px;font-weight:560;letter-spacing:-.025em;color:inherit;text-decoration:none}.logo .d{color:var(--red)} @@ -89,23 +90,23 @@ .situation{font-size:17px;color:var(--ink);font-weight:500;max-width:66ch;line-height:1.5;margin-bottom:4px} .situation.tech{font-size:15px;color:var(--muted);font-weight:400} h2{font-size:11.5px;font-weight:600;letter-spacing:.1em;text-transform:uppercase;color:var(--dim); - margin:42px 0 16px;display:flex;align-items:center;gap:10px} + margin:44px 0 16px;display:flex;align-items:center;gap:10px} h2::after{content:"";flex:1;height:1px;background:var(--hair)} .grid{display:grid;gap:14px}.cards{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))} .party{background:var(--surface-top);border:1px solid var(--hair); border-radius:var(--r-lg);padding:18px 19px;box-shadow:var(--ambient)} .party .who{font-weight:560;font-size:15.5px;display:flex;align-items:center;justify-content:space-between;gap:8px} .party .blurb{font-size:13.5px;color:var(--muted);margin-top:6px;line-height:1.45} -.party .sub{font-size:10.5px;color:var(--dim);text-transform:uppercase;letter-spacing:.09em;margin-top:13px} +.party .sub{font-size:10.5px;color:var(--dim);text-transform:uppercase;letter-spacing:.09em;margin-top:12px} .party ul{list-style:none;padding:0;margin:6px 0 0;font-size:13px;color:var(--muted)} .party li{padding:2.5px 0;display:flex;gap:9px;align-items:flex-start} .party li.red::before{content:"";width:15px;height:2px;background:var(--red);flex:none;border-radius:2px;margin-top:8px} .party li.none{color:var(--dim);font-style:italic} -.btn{border:none;border-radius:var(--r);padding:12px 24px;font:inherit;font-weight:560;font-size:14.5px;cursor:pointer; +.btn{border:none;border-radius:var(--r-full);padding:12px 24px;font:inherit;font-weight:560;font-size:14.5px;cursor:pointer; background:var(--indigo);color:#fff;transition:.2s var(--ease);box-shadow:inset 0 1px 0 rgba(255,255,255,.10)} .btn:hover{filter:brightness(1.08);transform:translateY(-1px)} .btn:active{transform:translateY(0) scale(.985);filter:brightness(1.02)} -.opt{background:var(--surface);border:1px solid var(--hair);border-radius:var(--r-lg);padding:15px 17px;margin:11px 0;transition:.25s var(--ease)} +.opt{background:var(--surface);border:1px solid var(--hair);border-radius:var(--r-lg);padding:15px 17px;margin:12px 0;transition:.25s var(--ease)} .opt:not(.blocked):not(.winner):hover{border-color:var(--hair2)} .opt .top{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap} .opt .name{font-weight:540;font-size:15px} @@ -113,15 +114,15 @@ .opt.blocked{border-color:var(--red-hair);background:var(--red-bg)} .opt.winner{border-color:var(--indigo);box-shadow:0 0 0 1px var(--indigo)} .chips{display:flex;gap:6px;flex-wrap:wrap} -.chip{font-family:var(--mono);font-size:11px;font-weight:500;border-radius:var(--r-full);padding:2.5px 10px; +.chip{font-family:var(--mono);font-size:11px;font-weight:500;border-radius:var(--r-full);padding:5px 12px; display:inline-flex;gap:5px;align-items:center;background:var(--sunken);color:var(--muted);border:1px solid var(--hair)} .chip.ok{background:var(--verify-bg);color:var(--verify);border-color:var(--verify-hair)} .chip.no{background:var(--red-bg);color:var(--red);border-color:var(--red-hair)} -.tagline-sm{font-size:12.5px;margin-top:9px;color:var(--dim)} +.tagline-sm{font-size:12.5px;margin-top:8px;color:var(--dim)} .tagline-sm.block{color:var(--red);font-weight:500} .tagline-sm.win{color:var(--indigo);font-weight:560} .muted{color:var(--muted);font-size:13px} -.bar{display:grid;grid-template-columns:170px 1fr 70px;align-items:center;gap:14px;margin:9px 0} +.bar{display:grid;grid-template-columns:170px 1fr 70px;align-items:center;gap:14px;margin:8px 0} .bar .lbl{font-size:13px;color:var(--muted)} .track{background:var(--sunken);border:1px solid var(--hair);border-radius:var(--r-full);height:14px;overflow:hidden} .fill{height:100%;background:var(--indigo);border-radius:var(--r-full);transition:width .6s var(--ease)} @@ -136,7 +137,7 @@ overflow-wrap:anywhere} .receipt .k{color:var(--dim)} .verify{margin-top:14px;display:flex;gap:14px;align-items:center;flex-wrap:wrap} -.vbtn{border:1px solid var(--hair2);background:var(--surface);color:var(--ink);border-radius:var(--r); +.vbtn{border:1px solid var(--hair2);background:var(--surface);color:var(--ink);border-radius:var(--r-full); padding:9px 16px;font:inherit;font-size:13px;cursor:pointer;transition:.2s var(--ease)} .vbtn:hover{border-color:var(--verify);color:var(--verify)} .vbtn:active{transform:scale(.97)} @@ -147,7 +148,7 @@ /* ─── candy layer: hero, cinematic reveal, celebration ─────────────────────────── */ /* hero */ -.hero{margin:26px 0 8px;position:relative} +.hero{margin:24px 0 8px;position:relative} .eyebrow{display:inline-flex;align-items:center;gap:8px;font-family:var(--mono);font-size:11.5px;font-weight:600; letter-spacing:.16em;text-transform:uppercase;color:var(--indigo); background:var(--indigo-bg); @@ -158,13 +159,13 @@ .hero h1 .g{color:var(--indigo)} .hero .sub{margin:18px 0 0;font-size:clamp(15px,2.4vw,18px);line-height:1.55;color:var(--muted);max-width:60ch} .hero .sub b{color:var(--ink);font-weight:600} -.hero-actions{display:flex;flex-wrap:wrap;gap:13px;align-items:center;margin-top:26px} -.cta{position:relative;overflow:hidden;border:none;border-radius:var(--r);padding:14px 26px;font:inherit;font-weight:640; +.hero-actions{display:flex;flex-wrap:wrap;gap:12px;align-items:center;margin-top:24px} +.cta{position:relative;overflow:hidden;border:none;border-radius:var(--r-full);padding:14px 26px;font:inherit;font-weight:640; font-size:15px;cursor:pointer;color:#fff;background:var(--indigo); box-shadow:inset 0 1px 0 rgba(255,255,255,.10);transition:.2s var(--ease)} .cta:hover{transform:translateY(-1px);filter:brightness(1.06)} .cta:active{transform:translateY(0) scale(.98)} -.trustrow{display:flex;flex-wrap:wrap;gap:8px;margin-top:22px} +.trustrow{display:flex;flex-wrap:wrap;gap:8px;margin-top:24px} .icp-hook{color:var(--dim);font-size:12.5px;margin-top:14px} .icp-hook a{color:var(--muted);text-decoration:underline;text-decoration-color:var(--hair2);text-underline-offset:2px} .icp-hook a:hover{color:var(--indigo)} @@ -219,13 +220,13 @@ .foot-links a:hover{color:var(--indigo)} .foot-links svg{width:15px;height:15px;flex:none} .foot-meta{color:var(--dim);font-size:12.5px} -.foot-wrap{max-width:1180px;margin:0 auto;padding:30px 22px 46px} +.foot-wrap{max-width:1180px;margin:0 auto;padding:32px 24px 48px} /* ─── the three enforced properties: bridge between hero and the live demo ────── */ .kicker{display:inline-flex;align-items:center;gap:8px;font-family:var(--mono);font-size:10.5px; font-weight:600;letter-spacing:.14em;text-transform:uppercase;color:var(--dim)} .props{border-bottom:1px solid var(--hair)} -.props-inner{max-width:1180px;margin:0 auto;padding:36px 22px 40px} +.props-inner{max-width:1180px;margin:0 auto;padding:36px 24px 40px} .props-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px;margin-top:18px} .prop{background:var(--surface-top);border:1px solid var(--hair);border-radius:var(--r-lg); padding:20px 21px;box-shadow:var(--ambient); @@ -252,13 +253,13 @@ /* ─── hero band: full-bleed, ambient wash, decorative live proof-in-motion ─────── */ .hero-band{position:relative;overflow:hidden;border-bottom:1px solid var(--hair)} -.hero-inner{position:relative;max-width:1180px;margin:0 auto;padding:40px 22px 46px; +.hero-inner{position:relative;max-width:1180px;margin:0 auto;padding:40px 24px 48px; display:grid;grid-template-columns:1fr;gap:8px} .hero-inner header{max-width:none} .hero-cols{display:grid;grid-template-columns:1.15fr .85fr;gap:44px;align-items:center;margin-top:8px} .hero-cols>*{min-width:0} @media (max-width:920px){.hero-cols{grid-template-columns:1fr}} -.hero-copy .hero{margin:22px 0 0} +.hero-copy .hero{margin:24px 0 0} .hero-copy .hero h1{max-width:none} /* decorative visualization — a silent, looping "3 verdicts → the fair pick" moment */ @@ -269,7 +270,7 @@ .proofviz .pv-live{display:inline-flex;align-items:center;gap:6px;font-family:var(--mono);font-size:10px;color:var(--verify)} .proofviz .pv-live i{width:5px;height:5px;border-radius:50%;background:var(--verify);animation:pvBlink 1.8s var(--ease) infinite} @keyframes pvBlink{0%,100%{opacity:1}50%{opacity:.35}} -.pv-row{display:grid;grid-template-columns:74px 1fr 34px;align-items:center;gap:11px;margin:9px 0} +.pv-row{display:grid;grid-template-columns:74px 1fr 34px;align-items:center;gap:12px;margin:8px 0} .pv-row .pv-who{font-size:12px;color:var(--muted);font-weight:540} .pv-row .pv-track{background:var(--sunken);border:1px solid var(--hair);border-radius:var(--r-full);height:10px;overflow:hidden} .pv-row .pv-fill{height:100%;border-radius:var(--r-full);background:var(--indigo-dim);width:0; @@ -379,7 +380,7 @@
Each chip is a masked verdict — the coordinator sees only who accepted, never which limit was crossed.
-- PROVABLE, NOT HOPED -
-- The trust layer for the agent economy. Agents with rival owners reach - consensus without exposing a single private preference. -
- -- Most agent tooling solves transport (A2A, MCP), 1:1 agentic commerce, - or cooperative debate between agents of the same owner. -
-- Parley solves the gap: delegates of different, conflicting, private - owners reaching a decision none of them can rig — and proving it. -
-+ Provable, not hoped + +
++ Personal AI agents negotiate for owners with conflicting, private + interests. Parley makes it provable that none of them was + betrayed, without any owner exposing a single private preference. +
+ ++ Five delegates, five private sheets. One shared decision, + verified, none of the + sheets revealed. +
+- {step.desc} -
-- The tape on the left isn't decoration — it's the real transcript format the engine produces, - The tape below isn't decoration — it's the real transcript format the engine produces,{" "} - replayed from a sample run.{" "} - Run your own{" "} - and every verdict is recorded masked, hashed, and replayable by each - owner against their own private sheet. -
-+ Most agent tooling solves transport (A2A, MCP), one-to-one agentic + commerce, or cooperative debate between agents that already share + one owner. +
++ Parley solves a different gap: delegates of different, conflicting, + private owners reaching a decision + none of them can rig, and proving it. +
++ Hard constraints written as code predicates. A crossed red line + rejects an option outright. It is never negotiated away as soft + utility. +
+ preferences.py ++ The coordinator sees only an acceptable or red-line verdict and + a soft score. Never the private sheet, and never which + constraint was crossed. +
+ agent.py ++ Among options feasible for everyone, lift the least-happy + participant, tie-broken by total welfare. No feasible option + means an honest deadlock, never a forced decision. +
+ consensus.py ++ A SHA-256 hash over the canonical, masked record. Each owner + replays their own private sheet locally to confirm no red line + was crossed, without revealing it. +
+ transcript.py ++ The tape below is the real transcript format the engine produces, + replayed from a sample run. Every verdict is recorded masked, + hashed, and independently replayable by each owner against their + own private sheet. +
++ sample transcript · replayed from meeting-042 · hover to + pause +
+
- Multilateral (N>2) · no-crypto · self-hosted · auditable — not
- single-owner orchestration (AutoGen/CrewAI), not on-chain bilateral
- commerce (Fetch.ai/Olas).
+
+
+ Multilateral (more than two owners),
+ no cryptocurrency,
+ self-hosted,
+ auditable. Not single-owner
+ orchestration like AutoGen or CrewAI. Not bilateral on-chain commerce
+ like Fetch.ai or Olas.
Positioning
+