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.

Read about the system

WEIGHTS

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.

URGENCY

IMPACT

DEADLINE BUCKETS

STALE / STUCK

RANKED BY SCORE · TOP MRD-SEASON AT 80 · 0 MOVED AGAINST THE SHIPPED DEFAULTS

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

Seven synthetic projects ranked by priority score. Select a project to see the factors that produced its score.
RANKPROJECTSTATUSDEADLINEFACTORSSCORE
1building2026-08-30in 2dUrgency +40, Impact +20, Due within 3 days +2080
2blocked2026-08-1414d pastUrgency +40, Impact +15, Overdue +30, Stale +5, Blocked −1575
3waitingRatna (ops)2026-08-271d pastUrgency +30, Impact +20, Overdue +30, Waiting on someone −1565
4testing2026-09-03in 6dUrgency +20, Impact +15, Due within a week +10, Stale +550
5shipped—noneUrgency +30, Impact +1040
6NO NEXT ACTIONidea2026-10-02in 35dUrgency +20, Impact +5, Stale +530
7scoped2026-09-10in 13dUrgency +10, Impact +10, Due within 2 weeks +525

SCROLL THE BOARD SIDEWAYS FOR FACTORS AND SCORE →

THE COUNTER-EXAMPLE THE REPOSITORY HAS A TEST FOR

MRD-INTAKE · BLOCKED · RANK 2

Wholesale order intake form

75

+40 +15 +30 +5 −15

SN-ATTEND · SCOPED · RANK 7

Attendance recap sheet rebuild

25

+10 +10 +5

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.

MRD-SEASON · MERIDIAN KNITWEAR · SCORED WITH SHIPPED DEFAULTS

Season changeover checklist

FACTORWEIGHT READPOINTS
Urgencycriticalurgency.critical+40
Impactcriticalimpact.critical+20
Due within 3 days2ddeadlineWithin3+20
TOTAL80

+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.

NEXT ACTION

Write the rollback step for the price update

explainPriority() — THE SAME TEXT THE STATUS REPORT PRINTS

+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