[Canonical page](<https://docs.dhtmlx.com/planning-engine/net/api/core/results/note/>)
[Full documentation index](<https://docs.dhtmlx.com/planning-engine/llms.txt>)


# Note

A non-fatal note about the input of a scheduling call: a task, link or assignment that was left out of the plan, or a field that repair validation changed. Notes are listed in [`ScheduleResult.Notes`](<https://docs.dhtmlx.com/planning-engine/net/api/core/results/schedule-result.md>). Nothing is thrown for them.

`Note` is a closed union: an abstract record with one sealed record per variant. Read it with `switch` pattern matching on the nested types. The records are immutable and compare by value.

## Declaration

```csharp
namespace Plen;

public abstract record Note
{
    public sealed record DroppedLink(Id Link, string Reason) : Note;
    public sealed record DroppedTask(Id Task, string Reason) : Note;
    public sealed record DroppedAssignment(Id Assignment, string Reason) : Note;
    public sealed record Repaired(string Path, string Message) : Note;
}
```

The constructor of `Note` is private, so these four records are the only variants.

## Variants

| Variant | When it occurs |
|---|---|
| [`DroppedLink`](<https://docs.dhtmlx.com/planning-engine/net/api/core/results/note.md#droppedlink>) | A link isn't part of the plan, for example because one of its tasks is unscheduled. |
| [`DroppedTask`](<https://docs.dhtmlx.com/planning-engine/net/api/core/results/note.md#droppedtask>) | A task isn't part of the plan because it's unscheduled. |
| [`DroppedAssignment`](<https://docs.dhtmlx.com/planning-engine/net/api/core/results/note.md#droppedassignment>) | An assignment isn't part of the plan because its task is unscheduled. |
| [`Repaired`](<https://docs.dhtmlx.com/planning-engine/net/api/core/results/note.md#repaired>) | [`Validation.Repair`](<https://docs.dhtmlx.com/planning-engine/net/api/core/project/validation.md>) changed an input field. |

### DroppedLink

```csharp
public sealed record DroppedLink(Id Link, string Reason) : Note;
```

| Property | Type | Description |
|---|---|---|
| `Link` | [`Id`](<https://docs.dhtmlx.com/planning-engine/net/api/core/data/id.md>) | Id of the dropped link. |
| `Reason` | `string` | Human-readable reason, e.g. `target task "3" is unscheduled`. |

### DroppedTask

```csharp
public sealed record DroppedTask(Id Task, string Reason) : Note;
```

| Property | Type | Description |
|---|---|---|
| `Task` | [`Id`](<https://docs.dhtmlx.com/planning-engine/net/api/core/data/id.md>) | Id of the dropped task. |
| `Reason` | `string` | Human-readable reason: `unscheduled`. |

A task is unscheduled when [`TaskData.Unscheduled`](<https://docs.dhtmlx.com/planning-engine/net/api/core/data/task-data.md>) is `true`.

### DroppedAssignment

```csharp
public sealed record DroppedAssignment(Id Assignment, string Reason) : Note;
```

| Property | Type | Description |
|---|---|---|
| `Assignment` | [`Id`](<https://docs.dhtmlx.com/planning-engine/net/api/core/data/id.md>) | Id of the dropped assignment. |
| `Reason` | `string` | Human-readable reason, e.g. `task "3" is unscheduled`. |

### Repaired

```csharp
public sealed record Repaired(string Path, string Message) : Note;
```

| Property | Type | Description |
|---|---|---|
| `Path` | `string` | Input path of the changed field, in wire spelling, e.g. `tasks[1].start_date`. |
| `Message` | `string` | What was wrong and how it was fixed. |

Only a project created with `Validation.Repair` reports `Repaired` notes. The list of fixes and their paths is on [`Validation`](<https://docs.dhtmlx.com/planning-engine/net/api/core/project/validation.md#what-repair-changes>).

## Example

```csharp
using Plen;

var monday = Moment.FromYmdHm(2026, 8, 10, 8, 0) ?? throw new InvalidOperationException("invalid date");

var data = new ProjectData
{
    Tasks =
    [
        new TaskData(1) { StartDate = monday, Duration = 1.0 },
        new TaskData(2) { StartDate = monday, Duration = 1.0, Unscheduled = true },
    ],
    Links =
    [
        new LinkData { Id = 10, Source = 1, Target = 2 },
    ],
};

var result = Engine.Schedule(data, new SolveOptions());

foreach (var note in result.Notes)
{
    var line = note switch
    {
        Note.DroppedLink n => $"link {n.Link} dropped: {n.Reason}",
        Note.DroppedTask n => $"task {n.Task} dropped: {n.Reason}",
        Note.DroppedAssignment n => $"assignment {n.Assignment} dropped: {n.Reason}",
        Note.Repaired n => $"repaired {n.Path}: {n.Message}",
        _ => note.ToString(),
    };
    Console.WriteLine(line);
}
// task 2 dropped: unscheduled
// link 10 dropped: target task "2" is unscheduled
```

## Related

- [`ScheduleResult`](<https://docs.dhtmlx.com/planning-engine/net/api/core/results/schedule-result.md#notes>) - the result whose `Notes` list carries them
- [`Validation`](<https://docs.dhtmlx.com/planning-engine/net/api/core/project/validation.md#what-repair-changes>) - the repair mode that reports `Repaired` notes
- [`Engine.Schedule`](<https://docs.dhtmlx.com/planning-engine/net/api/engine-schedule.md>) - a scheduling call that returns notes
- [Reading results](<https://docs.dhtmlx.com/planning-engine/net/scheduling/reading-results.md>) - handling each diagnostic of a result
- [Project data](<https://docs.dhtmlx.com/planning-engine/net/scheduling/project-data.md>) - unscheduled tasks and the input rules
