Commit Diff


commit - d944684a06594ea8d990811812d3c032ffc8d05c
commit + 773fafee9c76dc23f6c9e50c6e1059ebc499f30f
blob - 33460cae6229af937a227be083fa490c839e56a3
blob + 352429ad1607307324ad53246b074b6a77f046b7
--- shortcut_sdk.rs
+++ shortcut_sdk.rs
@@ -428,7 +428,13 @@ json_struct! {
         pub milestone_id: Option<i64>,
         pub group_id: Option<String>,
         pub group_ids: Vec<String>,
-        pub project_ids: Vec<i64>,
+        // Shortcut leaves orphan refs (deleted projects) in this array as
+        // bare `null` entries — `[11519, null, 90, ...]`.  Modeled as
+        // Vec<Option<i64>> so the decoder accepts those nulls and the type
+        // honestly says "an entry may be a dead reference".  Consumers that
+        // only want live IDs can `.iter().flatten()`.  EpicSlim below
+        // mirrors this.
+        pub project_ids: Vec<Option<i64>>,
         pub objective_ids: Vec<i64>,
         pub label_ids: Vec<i64>,
         pub labels: Vec<LabelSlim>,
@@ -484,7 +490,7 @@ json_struct! {
         pub milestone_id: Option<i64>,
         pub group_id: Option<String>,
         pub group_ids: Vec<String>,
-        pub project_ids: Vec<i64>,
+        pub project_ids: Vec<Option<i64>>,
         pub objective_ids: Vec<i64>,
         pub label_ids: Vec<i64>,
         pub labels: Vec<LabelSlim>,