# Choice Grid > A weighted decision matrix for personal and household choices - a flat or house, a school or course, a car, a laptop or phone, a holiday, a job offer, an insurance plan. Options are cards (a name, a price, a few facts); criteria are 0-10 weight sliders. The browser computes the matrix, the ranks and a sensitivity analysis live, free, before sign-in. A metered model then reads what each option's facts imply for each criterion, challenges missing criteria and lopsided weights, names deal-breakers and bias risks - and the page checks every claim against the browser's own numbers. Live at https://choice-grid.skillsafe.ai/ · API tutorial at https://choice-grid.skillsafe.ai/api.html · Tokens at https://choice-grid.skillsafe.ai/tokens.html ## What it does One work object: one decision, with 2-6 options and 3-8 criteria. The free lane (no account, no model, all in the browser): - Scores are 0-10 per cell, typed by the person. Weights are 0-10 per criterion; each weight's share is weight / sum of weights. - A criterion of kind "cost" scores itself from the option prices: cheapest 10, dearest 0, linear between (equal prices all score 10; an option with no price counts as 5 and is reported). - An unrated cell counts as 5 (neutral) and is reported. Totals are out of 100: total = 10 x sum(share x score). A cell's weighted points are its part of that total. - Ranks use competition ranking: equal totals share a rank and the next rank is skipped (1, 1, 3). A tie at the top is reported as a tie, never silently broken. - Floors: a criterion may carry a minimum acceptable score; any option below it is badged. - Sensitivity, per criterion with the other weights held fixed: the weight at which the leader is drawn level (the leader's margin over a challenger is linear in that weight's numerator, so the crossing point is exact), the smallest such move across all criteria, a tornado chart of the leader's margin over the next-best option at weight 0 and weight 10, the criteria whose removal changes the leader, and the single criterion that contributes most of the lead. In a tie it says which tied option raising each weight favours. - The matrix is a heatmap (diverging from amber for a poor score through paper to deep indigo), with sticky headers and row totals as bars; it scrolls inside its own frame on a phone. - Free exports: the matrix as CSV and as Markdown. Two metered lanes over one system prompt (gpt-terra), routed by the `task` field: - `assess` - the first reading: an evidence line for every option x criterion cell (what the facts imply, a suggested 0-10 score - none for cost cells or where the facts are silent - a confidence and a basis: fact, inference or missing), 0-3 missing criteria with a suggested weight, 0-3 weight challenges (raise, lower, split, merge), deal-breakers (hard or soft; every failed floor must appear), 1-3 bias checks from a fixed checklist (FOMO, sunk cost, authority, social proof, commitment, optimism, recency, confirmation, shiny object, loss aversion, anchoring), the option the evidence leans to, questions to ask and next steps. - `reassess` - after the grid changed (an option added or edited, a criterion added or renamed, weights moved, the brief edited): the browser sends the list of changes and the exact cells whose evidence is stale; the model re-reads only those cells and re-checks the lists; the browser merges the new cells into the earlier reading. The model never does the arithmetic. The page reconciles each reply against the matrix: cells that came back without evidence, ids that are not in the decision, a leaning that differs from the computed leader (and whether the reply admitted it), what the leader would be with the suggested scores, readings 4 or more points away from the person's own score, "fact" claimed for an option with no facts, failed floors not listed as deal-breakers, a hard deal-breaker on the matrix leader, weight challenges naming unknown criteria, and "missing" criteria that already exist. Exports: the matrix with the evidence as CSV, the whole decision as JSON, a Markdown report. History is saved to the person's SkillSafe account (a declared collection, one record per decision, updated on each re-assessment) and mirrored in the browser. ## The contract Run body, all strings: `{ "task": "assess" | "reassess", "decision": string, "context": string, "options": JSON string, "criteria": JSON string, "matrix": JSON string, "changes": JSON string (reassess), "previous": JSON string (reassess) }`. `options` is `[{id, name, price?, facts[]}]`; `criteria` is `[{id, name, kind: "rate" | "cost", weight, weight_share, floor?}]`; `matrix` carries the browser's scores, totals, ranks, leader, tie, margin, failed floors and sensitivity lines. The reply is one JSON object: `task`, `title`, `headline`, `cells[] {option, criterion, evidence, suggested_score, confidence, basis}`, `missing_criteria[]`, `weight_challenges[]`, `deal_breakers[]`, `bias_checks[]`, `leaning {option, why, agrees_with_matrix}`, `questions[]`, `next_steps[]`, `notes[]`, `changed`. ## Sources Derived from the agent skill @glebis/decision-toolkit (https://skillsafe.ai/skill/@glebis/decision-toolkit/), from the glebis/claude-skills repository: its principles (guide, don't decide; one dimension at a time; make biases visible; end with concrete next steps) and its bias checklist. Not affiliated with the skill's author. The weighted-sum matrix is the standard simple additive weighting method; the tornado chart is the usual one-at-a-time sensitivity display.