").Append(Html(workflow.Name)).Append("
\n"); sb.Append("").Append(Html(def.Description)).Append("
\n"); sb.Append("\n"); if (trigger != null) { sb.Append("").Append(Html(JsonSerializer.Serialize(trigger, Json))).Append("\nSuccess flow
\n"); if (chain.Count == 0) { sb.Append("No tasks defined.
\n"); } else { sb.Append("Error handling & compensation
\n"); if (errors.Count == 0) { sb.Append("No onError targets — the chain fails hard.
").Append(Html(task.Key)).Append("\n");
sb.Append("⟶ onError ⟶\n");
sb.Append("").Append(Html(target.Key)).Append("\n");
sb.Append("").Append(Html(target.Language)).Append("\n");
sb.Append("Task inventory
\n"); sb.Append("| # | Key | Mode | Language | Entry | Function | Parent | Next | On error | Env |
|---|---|---|---|---|---|---|---|---|---|
| ").Append(i).Append(" | "); sb.Append("").Append(Html(task.Key)).Append(" | ");
sb.Append("").Append(Html(task.Mode)).Append(" | "); sb.Append("").Append(Html(task.Language)).Append(" | "); sb.Append("").Append(Html(entry.File ?? "—")).Append(" | "); sb.Append("").Append(Html(string.IsNullOrWhiteSpace(entry.Function) ? "main" : entry.Function)).Append("() | "); sb.Append("").Append(Html(KeyById(task.ParentId, byId) ?? "—")).Append(" | "); sb.Append("").Append(Html(KeyById(task.NextId, byId) ?? "—")).Append(" | "); sb.Append("").Append(Html(KeyById(task.OnErrorId, byId) ?? "—")).Append(" | "); sb.Append("").Append(EnvSummary(task)).Append(" | "); sb.Append("