Kamp Solver Workbench

Proper Next.js UI for real data lookup, constraint editing, solve, and validate.

Server

Checking…

Quick flow

Real data lookup

Checking lookup config…

Constraint builder

No constraint applied yet.

Marketplace solve JSON

Matches current kamp-frontend architecture more closely: activities own calendars/listings, sessions cache RRULE, solver expands occurrences for the planning window.

{
  "requestId": "marketplace-week-1",
  "planningWindow": {
    "startsAt": "2026-07-06T00:00:00",
    "endsAt": "2026-07-12T23:59:59"
  },
  "children": [
    {
      "id": "child-ava",
      "name": "Ava",
      "birthYear": 2017
    },
    {
      "id": "child-ben",
      "name": "Ben",
      "birthYear": 2015
    }
  ],
  "desiredPrograms": [
    {
      "id": "ava-soccer",
      "childId": "child-ava",
      "activityId": "soccer-camp",
      "required": true,
      "priority": 30
    },
    {
      "id": "ava-art",
      "childId": "child-ava",
      "activityId": "art-camp",
      "required": false,
      "priority": 10
    },
    {
      "id": "ben-science",
      "childId": "child-ben",
      "activityId": "science-camp",
      "required": true,
      "priority": 25
    },
    {
      "id": "ben-swim",
      "childId": "child-ben",
      "activityId": "swim-lessons",
      "required": false,
      "priority": 8
    }
  ],
  "activities": [
    {
      "id": "soccer-camp",
      "title": "Soccer Camp",
      "category": "sports",
      "locationAddress": "North Oval, Vancouver",
      "ageGroupMin": 8,
      "ageGroupMax": 12,
      "status": "published",
      "sharetribeListingId": "listing-soccer",
      "sessions": [
        {
          "id": "soccer-series-a",
          "label": "Mon/Wed Afternoon",
          "status": "published",
          "startDate": "2026-07-06",
          "endDate": "2026-07-08",
          "daysOfWeek": [
            "MO",
            "WE"
          ],
          "startTime": "13:00",
          "endTime": "16:00",
          "totalSeats": 6,
          "seatsRemaining": 2,
          "priceSubUnits": 22000,
          "currency": "AUD",
          "rrule": "FREQ=WEEKLY;COUNT=2;BYDAY=MO,WE",
          "metadata": {
            "travelMinutes": 18
          }
        },
        {
          "id": "soccer-series-b",
          "label": "Tue/Thu Afternoon",
          "status": "published",
          "startDate": "2026-07-07",
          "endDate": "2026-07-09",
          "daysOfWeek": [
            "TU",
            "TH"
          ],
          "startTime": "13:30",
          "endTime": "16:30",
          "totalSeats": 6,
          "seatsRemaining": 4,
          "priceSubUnits": 20000,
          "currency": "AUD",
          "rrule": "FREQ=WEEKLY;COUNT=2;BYDAY=TU,TH",
          "metadata": {
            "travelMinutes": 22
          }
        }
      ]
    },
    {
      "id": "art-camp",
      "title": "Art Camp",
      "category": "arts",
      "locationAddress": "Studio East, Vancouver",
      "ageGroupMin": 6,
      "ageGroupMax": 10,
      "status": "published",
      "sharetribeListingId": "listing-art",
      "sessions": [
        {
          "id": "art-mon",
          "label": "Monday Morning Art",
          "status": "published",
          "startDate": "2026-07-06",
          "startTime": "09:30",
          "endTime": "11:30",
          "totalSeats": 8,
          "seatsRemaining": 6,
          "priceSubUnits": 12000,
          "currency": "AUD",
          "metadata": {
            "travelMinutes": 8
          }
        },
        {
          "id": "art-tue",
          "label": "Tuesday Art Lab",
          "status": "published",
          "startDate": "2026-07-07",
          "startTime": "13:00",
          "endTime": "15:00",
          "totalSeats": 8,
          "seatsRemaining": 6,
          "priceSubUnits": 14000,
          "currency": "AUD",
          "metadata": {
            "travelMinutes": 10
          }
        }
      ]
    },
    {
      "id": "science-camp",
      "title": "Science Camp",
      "category": "stem",
      "locationAddress": "Science Hub, Vancouver",
      "ageGroupMin": 9,
      "ageGroupMax": 13,
      "status": "published",
      "sharetribeListingId": "listing-science",
      "sessions": [
        {
          "id": "science-series-a",
          "label": "Mon-Wed Science Series",
          "status": "published",
          "startDate": "2026-07-06",
          "endDate": "2026-07-08",
          "startTime": "09:00",
          "endTime": "12:00",
          "totalSeats": 2,
          "seatsRemaining": 1,
          "priceSubUnits": 18000,
          "currency": "AUD",
          "rrule": "FREQ=DAILY;COUNT=3",
          "metadata": {
            "travelMinutes": 12
          }
        },
        {
          "id": "science-series-b",
          "label": "Tue-Wed Science Series",
          "status": "published",
          "startDate": "2026-07-07",
          "endDate": "2026-07-08",
          "startTime": "09:00",
          "endTime": "12:00",
          "totalSeats": 5,
          "seatsRemaining": 5,
          "priceSubUnits": 16000,
          "currency": "AUD",
          "rrule": "FREQ=DAILY;COUNT=2",
          "metadata": {
            "travelMinutes": 25
          }
        }
      ]
    },
    {
      "id": "swim-lessons",
      "title": "Swim Lessons",
      "category": "sports",
      "locationAddress": "Community Pool, Vancouver",
      "ageGroupMin": 8,
      "ageGroupMax": 12,
      "status": "published",
      "sharetribeListingId": "listing-swim",
      "sessions": [
        {
          "id": "swim-tue",
          "label": "Tuesday Swim",
          "status": "published",
          "startDate": "2026-07-07",
          "startTime": "11:00",
          "endTime": "12:30",
          "totalSeats": 10,
          "seatsRemaining": 8,
          "priceSubUnits": 5000,
          "currency": "AUD",
          "metadata": {
            "travelMinutes": 6
          }
        }
      ]
    }
  ],
  "existingEvents": [
    {
      "childId": "child-ava",
      "startsAt": "2026-07-08T09:00:00",
      "endsAt": "2026-07-08T10:00:00",
      "source": "caldav",
      "title": "Dentist"
    }
  ],
  "objectiveWeights": {
    "requiredPlacement": 120,
    "totalPlacement": 25,
    "travelPenalty": 2,
    "costPenalty": 1
  },
  "options": {
    "proposalCount": 3
  }
}

Solve request JSON

{
  "requestId": "demo-summer-week-1",
  "children": [
    {
      "id": "child-ava",
      "name": "Ava",
      "birthYear": 2017
    },
    {
      "id": "child-ben",
      "name": "Ben",
      "birthYear": 2015
    }
  ],
  "desiredPrograms": [
    {
      "id": "ava-soccer",
      "childId": "child-ava",
      "activityId": "soccer-camp",
      "required": true,
      "priority": 30
    },
    {
      "id": "ava-art",
      "childId": "child-ava",
      "activityId": "art-camp",
      "required": false,
      "priority": 10
    },
    {
      "id": "ben-science",
      "childId": "child-ben",
      "activityId": "science-camp",
      "required": true,
      "priority": 25
    },
    {
      "id": "ben-swim",
      "childId": "child-ben",
      "activityId": "swim-lessons",
      "required": false,
      "priority": 8
    }
  ],
  "candidateAssignments": [
    {
      "assignmentKey": "ava-soccer-a",
      "desiredProgramId": "ava-soccer",
      "childId": "child-ava",
      "activityId": "soccer-camp",
      "sessionId": "soccer-mon-am",
      "startsAt": "2026-07-06T09:00:00Z",
      "endsAt": "2026-07-06T12:00:00Z",
      "seatsRemaining": 4,
      "costCents": 22000,
      "travelMinutes": 15,
      "status": "available"
    },
    {
      "assignmentKey": "ava-soccer-b",
      "desiredProgramId": "ava-soccer",
      "childId": "child-ava",
      "activityId": "soccer-camp",
      "sessionId": "soccer-mon-pm",
      "startsAt": "2026-07-06T13:00:00Z",
      "endsAt": "2026-07-06T16:00:00Z",
      "seatsRemaining": 2,
      "costCents": 20000,
      "travelMinutes": 20,
      "status": "available"
    },
    {
      "assignmentKey": "ava-art-a",
      "desiredProgramId": "ava-art",
      "childId": "child-ava",
      "activityId": "art-camp",
      "sessionId": "art-mon-am",
      "startsAt": "2026-07-06T09:30:00Z",
      "endsAt": "2026-07-06T11:30:00Z",
      "seatsRemaining": 6,
      "costCents": 12000,
      "travelMinutes": 8,
      "status": "available"
    },
    {
      "assignmentKey": "ava-art-b",
      "desiredProgramId": "ava-art",
      "childId": "child-ava",
      "activityId": "art-camp",
      "sessionId": "art-tue-pm",
      "startsAt": "2026-07-07T13:00:00Z",
      "endsAt": "2026-07-07T15:00:00Z",
      "seatsRemaining": 6,
      "costCents": 14000,
      "travelMinutes": 10,
      "status": "available"
    },
    {
      "assignmentKey": "ben-science-a",
      "desiredProgramId": "ben-science",
      "childId": "child-ben",
      "activityId": "science-camp",
      "sessionId": "science-mon-am",
      "startsAt": "2026-07-06T09:00:00Z",
      "endsAt": "2026-07-06T12:00:00Z",
      "seatsRemaining": 1,
      "costCents": 18000,
      "travelMinutes": 12,
      "status": "available"
    },
    {
      "assignmentKey": "ben-science-b",
      "desiredProgramId": "ben-science",
      "childId": "child-ben",
      "activityId": "science-camp",
      "sessionId": "science-tue-am",
      "startsAt": "2026-07-07T09:00:00Z",
      "endsAt": "2026-07-07T12:00:00Z",
      "seatsRemaining": 5,
      "costCents": 16000,
      "travelMinutes": 25,
      "status": "available"
    },
    {
      "assignmentKey": "ben-swim-a",
      "desiredProgramId": "ben-swim",
      "childId": "child-ben",
      "activityId": "swim-lessons",
      "sessionId": "swim-mon-pm",
      "startsAt": "2026-07-06T13:30:00Z",
      "endsAt": "2026-07-06T14:30:00Z",
      "seatsRemaining": 8,
      "costCents": 7000,
      "travelMinutes": 5,
      "status": "available"
    },
    {
      "assignmentKey": "ben-swim-b",
      "desiredProgramId": "ben-swim",
      "childId": "child-ben",
      "activityId": "swim-lessons",
      "sessionId": "swim-tue-am-overlap",
      "startsAt": "2026-07-07T11:00:00Z",
      "endsAt": "2026-07-07T12:30:00Z",
      "seatsRemaining": 8,
      "costCents": 5000,
      "travelMinutes": 6,
      "status": "available"
    }
  ],
  "objectiveWeights": {
    "requiredPlacement": 120,
    "totalPlacement": 25,
    "travelPenalty": 2,
    "costPenalty": 1
  },
  "options": {
    "proposalCount": 3
  }
}

Solve result

No solve run yet.

Validation inputs

Previous items
[]
Current truth items
[
  {
    "assignmentKey": "ava-art-a",
    "desiredProgramId": "ava-art",
    "childId": "child-ava",
    "activityId": "art-camp",
    "sessionId": "art-mon-am",
    "startsAt": "2026-07-06T09:30:00Z",
    "endsAt": "2026-07-06T11:30:00Z",
    "seatsRemaining": 6,
    "status": "available",
    "costCents": 12000,
    "travelMinutes": 8
  },
  {
    "assignmentKey": "ava-soccer-b",
    "desiredProgramId": "ava-soccer",
    "childId": "child-ava",
    "activityId": "soccer-camp",
    "sessionId": "soccer-mon-pm",
    "startsAt": "2026-07-06T13:15:00Z",
    "endsAt": "2026-07-06T16:15:00Z",
    "seatsRemaining": 2,
    "status": "available",
    "costCents": 20000,
    "travelMinutes": 20
  },
  {
    "assignmentKey": "ben-science-a",
    "desiredProgramId": "ben-science",
    "childId": "child-ben",
    "activityId": "science-camp",
    "sessionId": "science-mon-am",
    "startsAt": "2026-07-06T09:00:00Z",
    "endsAt": "2026-07-06T12:00:00Z",
    "seatsRemaining": 0,
    "status": "sold_out",
    "costCents": 18000,
    "travelMinutes": 12
  },
  {
    "assignmentKey": "ben-swim-a",
    "desiredProgramId": "ben-swim",
    "childId": "child-ben",
    "activityId": "swim-lessons",
    "sessionId": "swim-mon-pm",
    "startsAt": "2026-07-06T13:30:00Z",
    "endsAt": "2026-07-06T14:30:00Z",
    "seatsRemaining": 8,
    "status": "available",
    "costCents": 7000,
    "travelMinutes": 5
  }
]

Validation result

No validation run yet.