Rank

Interactive feature prioritization tool for rank.friborg.uk.

Product definition

Rank is a fast intake and prioritization board for product ideas from Jimmi and agents.

Core loop:

Capture idea → score impact/effort/confidence/urgency → drag into milestone → revisit top-ranked work

Chosen subdomain: rank.friborg.uk — short, memorable, and honest about the job.

UX principles

  • One-screen capture, no modal ceremony.
  • Keyboard-first: / focuses capture, Enter saves.
  • Plain sharp visual system: zero rounded corners, dark space/glass, high contrast.
  • Milestones are customizable lanes, not a rigid roadmap prison.
  • Agents can post ideas through the same API endpoint as the UI.

Architecture

  • Node/Express app on port 3045
  • Static SPA in public/
  • Appwrite TablesDB persistence
  • Docker deploy on Unraid
  • Gitea remote repo
  • Nginx Proxy Manager routes rank.friborg.uk192.168.30.100:3045

Appwrite schema

Database: priority_rank

Tables:

  • ideas — title, description, source, sourceName, milestoneId, impact, effort, confidence, urgency, score, rank, labels, notes, archived
  • milestones — name, description, horizon, color, position, active
  • activity — small append-only UX feed

Scattermind → Ranker bridge

Ranker's continuation job is narrow:

Snapshot / Concept Map → candidate feature/action set → Rank-ready build order

POST /api/rank-feedback accepts a prioritix-feature-set-v1-style payload from Scattermind and returns ranked items plus buildOrder.doFirst / validateNext / defer / park. Keep this contract action-first; do not use it as a reason to add generic dashboard, auth, billing, or workspace layers before the bridge has proof.

Feature items may include optional 110 rankerHints (value, effort, confidence, urgency, revenue, novelty, risk). Ranker blends those explicit Scattermind hints with text heuristics; effort is inverted into feasibility. Hints improve the defended order, but recommendedLane: "defer" or "park" remains a safety rail so dashboard-swamp items do not get promoted by flashy wording.

Recommended payload shape:

{
  "schema": "prioritix-feature-set-v1",
  "sourceName": "Scattermind",
  "artifactId": "snapshot_or_concept_map_id",
  "snapshotTitle": "Plain idea title",
  "conceptMapId": "optional_concept_map_id",
  "originalPrompt": "The user's starting prompt, trimmed for provenance",
  "idea": "What Scattermind clarified",
  "context": "Important constraints: solo builder, non-AI-native user, avoid dashboard swamp, etc.",
  "mode": "mvp",
  "featureSet": {
    "features": [
      {
        "id": "build-order-preview",
        "title": "Build order preview",
        "description": "Show do first, validate next, defer, and park with reasons.",
        "userValue": "A tired builder sees the next move without opening a dashboard.",
        "evidenceNeeded": "Can 3 non-AI-native users understand the first recommended action?",
        "proofSteps": ["Show a static result screen to 3 people"],
        "rankerHints": {
          "value": 8,
          "effort": 3,
          "confidence": 7,
          "urgency": 6,
          "revenue": 4,
          "novelty": 5,
          "risk": 3
        },
        "dependencies": [],
        "risk": "May become generic roadmap UI if the source context is lost.",
        "recommendedLane": "validate-next",
        "sourceSection": "concept-map.nextMoves"
      }
    ]
  }
}

Commands

npm run setup:appwrite
npm run check
PORT=3045 node server.js
npm run smoke

Agent idea post:

curl -X POST https://rank.friborg.uk/api/ideas \
  -H 'Content-Type: application/json' \
  -H "Authorization: Bearer $RANK_AGENT_TOKEN" \
  -d '{"title":"Add public roadmap export","source":"agent","sourceName":"Rook","impact":8,"effort":3,"confidence":7,"urgency":5}'
S
Description
Rank feature prioritization tool for humans and agents
Readme 830 KiB
Languages
JavaScript 98.1%
HTML 1.9%