What is a TAP?
A Thumbprint Affinity Snapshot (TAP) is a radial plot that encodes the pairwise agreement between any two entities across a set of policy or governance dimensions. It is the visualization layer of the Populist Protocol. The geometry is proprietary to Co-Mission.The encoding
Each dimensionk maps to an angular position θₖ on a unit circle (evenly distributed,
starting at top). The voter’s (or entity’s) position on each dimension is encoded as:
θₖ— spoke angle for dimension k (evenly distributed, 0 at top)aₖ ∈ [0, 1]— agreement coefficient (1 = full agreement, 0 = full disagreement)φₖ— actual plotted angle (displaced π/2 from θₖ on disagreement)- Magnitude = vote certainty or cohort majority strength
aₖ = 1): point plots at θₖ — sits on the spoke.
Disagreement (aₖ = 0): point plots at θₖ − π/2 — displaced clockwise by a quarter turn.
Scallop-shell geometry
The characteristic shape — where a voter who agrees on all dimensions fills the full radial area between spokes, and disagreements collapse to the clockwise adjacent sector — is the TAP’s visual fingerprint. Two voters with identical positions produce identical shapes.Entity-agnostic
The encoding is identical regardless of entity type:- voter vs. politician (ideological alignment by expertise)
- voter vs. cohort (how your views compare to a demographic group)
- delegate vs. governance category (DAO accountability track record)
- any two entities that have voted on common dimensions
context.domain and the dimension labels change between deployments.
TAP modes
| Mode | Description |
|---|---|
1_to_many | One subject (voter or delegate) plotted against N comparison entities |
1_to_1_subscoped | One subject vs. one comparison entity, with parallel dimension panels |
Rendering
TAPs are rendered as SVG using the template intaps/templates/tap.svg.tpl.
The React component useTap.js computes SVG-ready coordinates from a TAP JSON payload.
See Vote Methods for how aₖ is computed from different ballot types.
Reserved tap_types
Twotap_type values are reserved Co-Mission products. If your config uses either,
checkReservedConfig(config) returns a notice with a link to the respective product —
it’s a pointer, not a block.
tap_type | Product | Contact |
|---|---|---|
"election" | sedahaqq.com — Seda Haqq | Licensing conversation |
"referendum" | youinpolitics.com — Pop-u-list | Licensing conversation |
"legislation", "ballot_measure", "advisory", or any custom string)
are freely usable under an SDK license with no notice triggered.
See taps/DISCLOSURE.md
for the full notice and business model explanation.