A workshop instrument. Put a set of researched options in front of a room, make each person choose a small number of them and name the assumption that would kill one, and read the answers back on the projector while everyone is still there.
One HTML file, one config file, and a Google Apps Script that writes to a Sheet. No build step, no dependencies, no accounts for participants.
→ METHOD.md is the part worth reading. The code is small; the
design decisions are the reusable thing.
a page → a Google Sheet → the same page with #present
- Participants open a link on their phone, back up to three cards, flag up to three with the assumption that could kill them, and write a sentence on each.
- The projector runs the same URL with
#presentappended. It polls every eight seconds. - You close by putting the responses on screen and asking an AI what the room just said, live.
A one-axis instrument measures enthusiasm. Rooms have plenty of it, everyone leaves agreeing, and the thing fails later on a risk somebody in that room could have named on the day.
Asking for the risk at the same time as the appetite, from the same person, about the same card, is the whole point. It also gives the sceptic in the room a sanctioned way to be sceptical, so the objection arrives as data instead of as friction.
cp cards.example.js cards.js
cp config.example.js config.js
open index.htmlWith an empty endpoint the page runs as a full preview: every interaction works and nothing is saved. That is deliberate — you should be able to hand someone the file and have them understand the instrument without deploying anything.
- A Sheet. Make one. Copy its id out of the URL.
- The collector.
script.google.com→ new project → pastecollector/Code.gs→ setSHEET_ID→ Deploy → New deployment → Web app, Execute as: Me, Who has access: Anyone. Copy the/execURL. - Connect them. Put that URL in
config.js. - Host the page. Anywhere static.
- Test on a phone before the day. Back one, flag one, Send, and check a row
lands in the Sheet. Then open the URL with
#present.
node smoke.jsRuns the page's script against a minimal DOM stub and exercises what a participant actually does: open a group, open a card, back it, hit the cap, back and flag the same card.
Delete const MAX and smoke.js fails four tests by name. That is the test.
cards.example.js has the schema and nine example cards. Four fields per card
and each is load-bearing:
name |
the job, in the words of the person who has it |
who |
who actually has it. "Everyone" means you have not found them yet |
today |
what they do about it right now. There is always something |
bet |
the assumption that has to hold for this to be worth doing |
bet is the field people skip, and it is the one the second axis is built on.
One row per pick, with the participant's own sentence in the why column.
The why column is the output. Counts tell you what was popular; the
sentences tell you what was meant, and they are the only part that survives
contact with a decision.
=, +, - or @ are escaped before they reach the
Sheet, so nothing a participant types lands in a cell as a live formula.
MIT.
The thinking behind this is at aguedaschwartz.com/practice.