Skip to main content
dabke reports schedule quality through instruction-level feedback. Feedback is designed for API clients, MCP tools, and LLM consumption. It answers whether scheduling instructions were followed without exposing solver implementation details such as internal constraint buckets.

Compilation feedback

ModelBuilder.compile() returns feedback alongside the solver request:
const { request, canSolve, feedback } = builder.compile();

if (!canSolve) {
  console.error(
    feedback.details
      .flatMap((detail) => detail.checks)
      .filter((check) => check.outcome === "error"),
  );
}
The canSolve flag is false when structural errors make solving impossible, for example coverage requirements that reference roles no team member has.

Solve feedback

schedule(...).solve(...) returns the same feedback shape after analyzing the solver result:
const result = await schedule({
  // ...
}).solve(client, { dateRange: { start: "2026-02-02", end: "2026-02-08" } });

console.log(result.feedback.status);
console.log(result.feedback.details);

Feedback structure

A FeedbackReport contains:
  • status: "pass", "has_failures", or "has_errors"
  • summary: check counts by pass, fail, and error
  • details: grouped feedback for one instruction or report-level concern
  • checks: factual checks inside each detail
for (const detail of result.feedback.details) {
  for (const check of detail.checks) {
    console.log(`${detail.title}: ${check.outcome}: ${check.message}`);
  }
}

Outcomes

  • pass: the instruction was followed
  • fail: a soft instruction was evaluated and not fully followed
  • error: compilation or solving found a blocking issue
When an instruction fully passes, dabke emits a concise check for the whole instruction:
{
  "id": "instr:1",
  "title": "1x staff during office_hours",
  "checks": [{ "outcome": "pass", "message": "Passed." }]
}
When an instruction has failures, dabke groups facts by outcome and merges adjacent dates and time ranges where possible:
{
  "id": "instr:2",
  "title": "Time off for alice on 2024-02-01, 2024-02-02",
  "checks": [
    {
      "outcome": "fail",
      "message": "Failed on 2024-02-01.",
      "data": {
        "dateRanges": [{ "start": "2024-02-01", "end": "2024-02-01" }],
        "memberIds": ["alice"],
        "overflow": { "min": 1, "max": 1 }
      }
    }
  ]
}

Custom rule feedback

Custom rule descriptors should prefer solver artifacts with context for solve-time checks and compile findings for phase errors. Prefer factual messages that describe what happened. Do not include remediation instructions unless your API surface explicitly needs them.