Interactive demo · synthetic dataEvery record on this page is fabricated.
Bridge Priority Scorer
Seven projects ranked by a score that prints its own arithmetic, with weights you can change.
The production code behind this demo is my own work — design, implementation, directing Claude Code for its September 2026 additions.
Both sets are ordinary PriorityWeights objects passed as an argument — the function never reaches for a constant. Switching between the two shipped sets moves every score on this board without changing the order; edit a number below and it reorders.
NOW PINNED TO 2026-08-28 12:00 UTC — THE SCORER’S DATES ARE LOCAL BY DESIGN, SO THE CLOCK IS FIXED AND THE BOARD READS THE SAME FOR EVERY VISITOR
| RANK | PROJECT | STATUS | DEADLINE | FACTORS | SCORE |
|---|---|---|---|---|---|
| building | 2026-08-30 | Urgency +40, Impact +20, Due within 3 days +20 | 80 | ||
| blocked | 2026-08-14 | Urgency +40, Impact +15, Overdue +30, Stale +5, Blocked −15 | 75 | ||
| waiting | 2026-08-27 | Urgency +30, Impact +20, Overdue +30, Waiting on someone −15 | 65 | ||
| testing | 2026-09-03 | Urgency +20, Impact +15, Due within a week +10, Stale +5 | 50 | ||
| shipped | — | Urgency +30, Impact +10 | 40 | ||
| NO NEXT ACTION | idea | 2026-10-02 | Urgency +20, Impact +5, Stale +5 | 30 | |
| scoped | 2026-09-10 | Urgency +10, Impact +10, Due within 2 weeks +5 | 25 |
THE COUNTER-EXAMPLE THE REPOSITORY HAS A TEST FOR
MRD-INTAKE · BLOCKED · RANK 2
Wholesale order intake form
75
SN-ATTEND · SCOPED · RANK 7
Attendance recap sheet rebuild
25
MRD-INTAKE pays the full −15 stuck penalty and still finishes #2 against #7, 50 points clear. The penalty is a nudge, not a disappearing act — and in the real app the Today view then sorts blocked work by days-blocked rather than by score, so the thing you actually forget cannot sink.
Season changeover checklist
| FACTOR | WEIGHT READ | POINTS |
|---|---|---|
| Urgencycritical | urgency.critical | +40 |
| Impactcritical | impact.critical | +20 |
| Due within 3 days2d | deadlineWithin3 | +20 |
| TOTAL | 80 |
+40 +20 +20 = 80
The highest score on the board, and the plainest arithmetic: critical urgency, critical impact, due in two days. No penalty, no staleness — worked on this morning. This is what an uncomplicated top-of-list looks like.
Write the rollback step for the price update
+40 Urgency (critical) +20 Impact (critical) +20 Due within 3 days (2d) = 80
What is real, and what is simulated
Runs in your browser
- priority.ts — priorityScore() and explainPriority(), ported verbatim: the weights object, the four exclusive deadline buckets, the branch order and every label string
- dates.ts — toDateKey, fromDateKey, daysBetween and daysUntil, the local-calendar arithmetic the deadline buckets are measured with
- enums.ts — ACTIVE_STATUSES and STUCK_STATUSES, the membership tests that decide whether staleness applies and whether the penalty fires
- Every factor row on this page is the engine's own `factors` array — label, points and observed detail exactly as returned, in the order it emitted them
- The settings override path: the weight controls hand priorityScore a different PriorityWeights argument, which is precisely how the real settings page overrides the defaults
priority.parity.test.ts rebuilds a 24,192-case matrix — every urgency × impact × status × deadline offset × idle distance, under both weight sets — and compares a SHA-256 of every output field against a digest generated by running the original priority.ts inside the Bridge repository. It pins TZ=UTC, because the date module works in local time by design. Retune a weight, move a bucket edge or reword one label and the digest changes and the build fails.
Simulated
- SQLite, the project records, the activity log and every write path
- The Zod gates that refuse a blocked project without a reason, and the inline person creation behind `waiting on`
- The Today view's section assignment and its days-blocked sort — the guardrail described in the tour lives outside the scorer
- The handover checklist and the status report generator, which is what explainPriority() feeds in the real app
- Every project, client, person, deadline and note here — both companies are invented