Concord is a native iOS app, and it looks like a chat. You open one thread, ask for something in plain language, and set a budget. Your agent hires a counterparty; the two negotiate in the thread as messages; and the money moves inline the way Apple Cash moves inside iMessage — a live balance strip at the top, a card-capture bubble, an escrow-release bubble, each with a tap-through to the block explorer. Groceries come back as a catalogue of real products with photos; a pitch deck comes back as a document checked against the bytes that were delivered.
The only things the human does are say what they want and set the budget. Everything else is the agents, and every step streams into the thread live.
Two things that are easy to get wrong here, and that we got wrong first:
Category coverage is asymmetric, not a cosine. A task sentence ("Find a sustainable alternative to this backpack") and a product title ("Terra 30L Recycled Ripstop Backpack") structurally cannot share instruction verbs or brand tokens. Symmetric cosine punishes both sides for that, and our first implementation consequently ranked a fraudulent Daypack above a legitimate Rucksack, and rewarded a vendor who simply pasted the task text into its item title (0.76 vs 0.33 for an honest product). It now measures IDF-weighted coverage of the task's category-bearing terms by the delivered title, with an explicit guard against echoing the task back.
Required attributes are required. Above a category score of 0.8334 the weighted sum alone clears the threshold regardless of attributes — an item that is unmistakably a backpack but in no way sustainable would have settled against a contract asking for a sustainable one. So the pass condition carries a second gate. The composite is still reported in full, so a near miss reads as a near miss rather than a bare rejection.
The error direction is deliberate: a false fail refunds the buyer and lapses an authorization that was never captured, and the vendor can re-deliver. A false pass moves real money to a vendor who didn't meet the terms.
Reputation is a Beta(1,1) posterior — trust = (successes + 1) / (successes + failures + 2). A brand-new vendor sits at exactly 0.50: unproven, not trusted, and not punished either. Variance travels with the mean so 0.5-because-new is distinguishable from 0.5-because-unreliable. The buyer reads it before negotiating, which is what closes the loop between on-chain identity and the economic decision — without that read, the identity layer is decoration.
Built With
- monad
- openai
- rain
- swift
Log in or sign up for Devpost to join the conversation.