trueppm-api 0.4.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (799) hide show
  1. trueppm_api/__init__.py +27 -0
  2. trueppm_api/apps/access/__init__.py +0 -0
  3. trueppm_api/apps/access/apps.py +19 -0
  4. trueppm_api/apps/access/groups.py +518 -0
  5. trueppm_api/apps/access/management/__init__.py +0 -0
  6. trueppm_api/apps/access/management/commands/__init__.py +0 -0
  7. trueppm_api/apps/access/management/commands/create_admin.py +346 -0
  8. trueppm_api/apps/access/management/commands/migrate_locked.py +96 -0
  9. trueppm_api/apps/access/management/commands/revoke_api_tokens.py +483 -0
  10. trueppm_api/apps/access/migrations/0001_initial.py +61 -0
  11. trueppm_api/apps/access/migrations/0001_squashed_0012_programmembership_role_title.py +184 -0
  12. trueppm_api/apps/access/migrations/0002_alter_projectmembership_id.py +29 -0
  13. trueppm_api/apps/access/migrations/0003_projectmembership_soft_delete.py +24 -0
  14. trueppm_api/apps/access/migrations/0004_alter_projectmembership_role.py +34 -0
  15. trueppm_api/apps/access/migrations/0005_program_entity_and_membership.py +76 -0
  16. trueppm_api/apps/access/migrations/0006_role_ordinal_spacing.py +113 -0
  17. trueppm_api/apps/access/migrations/0007_projectmembership_joined_at_and_more.py +35 -0
  18. trueppm_api/apps/access/migrations/0008_projectmembership_source_group.py +25 -0
  19. trueppm_api/apps/access/migrations/0009_projectmembership_pm_proj_serverver_idx.py +20 -0
  20. trueppm_api/apps/access/migrations/0010_programmembership_joined_at_and_more.py +38 -0
  21. trueppm_api/apps/access/migrations/0011_alter_programmembership_unique_together_and_more.py +36 -0
  22. trueppm_api/apps/access/migrations/0012_programmembership_role_title.py +17 -0
  23. trueppm_api/apps/access/migrations/0013_squashed_0019_release_0_4.py +302 -0
  24. trueppm_api/apps/access/migrations/0013_userdefinedmentiongroup.py +82 -0
  25. trueppm_api/apps/access/migrations/0014_programmembership_progm_serverver_idx.py +19 -0
  26. trueppm_api/apps/access/migrations/0015_programuserdefinedmentiongroup.py +86 -0
  27. trueppm_api/apps/access/migrations/0016_externalstakeholder.py +67 -0
  28. trueppm_api/apps/access/migrations/0017_viewer_ordinal_one.py +143 -0
  29. trueppm_api/apps/access/migrations/0018_programmembership_sync_seq_and_more.py +52 -0
  30. trueppm_api/apps/access/migrations/0019_programmembership_reinstated_at_and_more.py +22 -0
  31. trueppm_api/apps/access/migrations/__init__.py +0 -0
  32. trueppm_api/apps/access/minter_role.py +38 -0
  33. trueppm_api/apps/access/models.py +588 -0
  34. trueppm_api/apps/access/permissions.py +3263 -0
  35. trueppm_api/apps/access/serializers.py +1007 -0
  36. trueppm_api/apps/access/services.py +878 -0
  37. trueppm_api/apps/access/signals.py +171 -0
  38. trueppm_api/apps/access/tasks.py +50 -0
  39. trueppm_api/apps/access/throttles.py +96 -0
  40. trueppm_api/apps/access/urls.py +191 -0
  41. trueppm_api/apps/access/views.py +1965 -0
  42. trueppm_api/apps/agents/__init__.py +6 -0
  43. trueppm_api/apps/agents/apps.py +11 -0
  44. trueppm_api/apps/agents/canonical.py +73 -0
  45. trueppm_api/apps/agents/deferred.py +108 -0
  46. trueppm_api/apps/agents/management/__init__.py +0 -0
  47. trueppm_api/apps/agents/management/commands/__init__.py +0 -0
  48. trueppm_api/apps/agents/management/commands/audit_prune.py +137 -0
  49. trueppm_api/apps/agents/management/commands/audit_verify.py +101 -0
  50. trueppm_api/apps/agents/middleware.py +44 -0
  51. trueppm_api/apps/agents/migrations/0001_initial.py +231 -0
  52. trueppm_api/apps/agents/migrations/0001_squashed_0003_release_0_4.py +344 -0
  53. trueppm_api/apps/agents/migrations/0002_agentactioncheckpoint.py +71 -0
  54. trueppm_api/apps/agents/migrations/0003_agentactionrefusaldetail.py +58 -0
  55. trueppm_api/apps/agents/migrations/__init__.py +0 -0
  56. trueppm_api/apps/agents/models.py +371 -0
  57. trueppm_api/apps/agents/refusal.py +103 -0
  58. trueppm_api/apps/agents/serializers.py +85 -0
  59. trueppm_api/apps/agents/services.py +397 -0
  60. trueppm_api/apps/agents/signals.py +30 -0
  61. trueppm_api/apps/agents/urls.py +15 -0
  62. trueppm_api/apps/agents/views.py +109 -0
  63. trueppm_api/apps/csvimport/__init__.py +12 -0
  64. trueppm_api/apps/csvimport/apps.py +11 -0
  65. trueppm_api/apps/csvimport/mapping.py +363 -0
  66. trueppm_api/apps/csvimport/migrations/0001_initial.py +74 -0
  67. trueppm_api/apps/csvimport/migrations/0001_squashed_0003_release_0_4.py +90 -0
  68. trueppm_api/apps/csvimport/migrations/0002_schedule_outline_batch_operations.py +37 -0
  69. trueppm_api/apps/csvimport/migrations/0003_csvimportrequest_date_order_and_more.py +26 -0
  70. trueppm_api/apps/csvimport/migrations/__init__.py +0 -0
  71. trueppm_api/apps/csvimport/models.py +111 -0
  72. trueppm_api/apps/csvimport/parser.py +1825 -0
  73. trueppm_api/apps/csvimport/services.py +48 -0
  74. trueppm_api/apps/csvimport/tasks.py +459 -0
  75. trueppm_api/apps/csvimport/template.py +37 -0
  76. trueppm_api/apps/csvimport/urls.py +50 -0
  77. trueppm_api/apps/csvimport/views.py +793 -0
  78. trueppm_api/apps/history/__init__.py +0 -0
  79. trueppm_api/apps/history/apps.py +12 -0
  80. trueppm_api/apps/history/changelog.py +359 -0
  81. trueppm_api/apps/history/diff_policy.py +178 -0
  82. trueppm_api/apps/history/serializers.py +104 -0
  83. trueppm_api/apps/history/signals.py +82 -0
  84. trueppm_api/apps/history/tasks.py +105 -0
  85. trueppm_api/apps/history/urls.py +38 -0
  86. trueppm_api/apps/history/views.py +443 -0
  87. trueppm_api/apps/idempotency/__init__.py +0 -0
  88. trueppm_api/apps/idempotency/apps.py +11 -0
  89. trueppm_api/apps/idempotency/migrations/0001_initial.py +71 -0
  90. trueppm_api/apps/idempotency/migrations/__init__.py +0 -0
  91. trueppm_api/apps/idempotency/mixins.py +226 -0
  92. trueppm_api/apps/idempotency/models.py +75 -0
  93. trueppm_api/apps/idempotency/tasks.py +61 -0
  94. trueppm_api/apps/integrations/__init__.py +13 -0
  95. trueppm_api/apps/integrations/apps.py +59 -0
  96. trueppm_api/apps/integrations/connections.py +806 -0
  97. trueppm_api/apps/integrations/encryption.py +92 -0
  98. trueppm_api/apps/integrations/external_sources.py +863 -0
  99. trueppm_api/apps/integrations/git_automation_services.py +231 -0
  100. trueppm_api/apps/integrations/git_webhook_auth.py +243 -0
  101. trueppm_api/apps/integrations/http.py +597 -0
  102. trueppm_api/apps/integrations/me_work.py +218 -0
  103. trueppm_api/apps/integrations/migrations/0001_initial.py +64 -0
  104. trueppm_api/apps/integrations/migrations/0001_squashed_0006_tasklink_description_tasklink_preview_type_and_more.py +187 -0
  105. trueppm_api/apps/integrations/migrations/0002_tasklink.py +67 -0
  106. trueppm_api/apps/integrations/migrations/0003_tasklink_tasklink_serverver_idx.py +17 -0
  107. trueppm_api/apps/integrations/migrations/0004_tasklink_custom_title_tasklink_labels.py +25 -0
  108. trueppm_api/apps/integrations/migrations/0005_boardautomation.py +56 -0
  109. trueppm_api/apps/integrations/migrations/0006_tasklink_description_tasklink_preview_type_and_more.py +40 -0
  110. trueppm_api/apps/integrations/migrations/0007_squashed_0014_release_0_4.py +225 -0
  111. trueppm_api/apps/integrations/migrations/0007_tasklink_created_at.py +23 -0
  112. trueppm_api/apps/integrations/migrations/0008_integrationcredential_config_externalworkitem.py +66 -0
  113. trueppm_api/apps/integrations/migrations/0009_externalsyncrequest_and_more.py +96 -0
  114. trueppm_api/apps/integrations/migrations/0010_externalworkitem_due_date.py +17 -0
  115. trueppm_api/apps/integrations/migrations/0011_tasklink_sync_seq_tasklink_tasklink_syncseq_idx.py +22 -0
  116. trueppm_api/apps/integrations/migrations/0012_boardautomation_last_delivery_at_and_more.py +42 -0
  117. trueppm_api/apps/integrations/migrations/0013_externalsyncrequest_attempt_count_and_more.py +26 -0
  118. trueppm_api/apps/integrations/migrations/0014_tasklink_created_by.py +27 -0
  119. trueppm_api/apps/integrations/migrations/__init__.py +0 -0
  120. trueppm_api/apps/integrations/models.py +635 -0
  121. trueppm_api/apps/integrations/notification_channels.py +57 -0
  122. trueppm_api/apps/integrations/opengraph.py +229 -0
  123. trueppm_api/apps/integrations/outgoing.py +201 -0
  124. trueppm_api/apps/integrations/providers.py +528 -0
  125. trueppm_api/apps/integrations/registry.py +345 -0
  126. trueppm_api/apps/integrations/serializers.py +453 -0
  127. trueppm_api/apps/integrations/services.py +171 -0
  128. trueppm_api/apps/integrations/tasks.py +734 -0
  129. trueppm_api/apps/integrations/throttles.py +165 -0
  130. trueppm_api/apps/integrations/urls.py +77 -0
  131. trueppm_api/apps/integrations/views.py +1158 -0
  132. trueppm_api/apps/jiraimport/__init__.py +8 -0
  133. trueppm_api/apps/jiraimport/apps.py +11 -0
  134. trueppm_api/apps/jiraimport/migrations/0001_initial.py +72 -0
  135. trueppm_api/apps/jiraimport/migrations/__init__.py +0 -0
  136. trueppm_api/apps/jiraimport/models.py +70 -0
  137. trueppm_api/apps/jiraimport/parser.py +350 -0
  138. trueppm_api/apps/jiraimport/services.py +46 -0
  139. trueppm_api/apps/jiraimport/tasks.py +280 -0
  140. trueppm_api/apps/jiraimport/urls.py +15 -0
  141. trueppm_api/apps/jiraimport/views.py +153 -0
  142. trueppm_api/apps/msproject/__init__.py +0 -0
  143. trueppm_api/apps/msproject/apps.py +11 -0
  144. trueppm_api/apps/msproject/dataclasses.py +153 -0
  145. trueppm_api/apps/msproject/exporter.py +551 -0
  146. trueppm_api/apps/msproject/extended_attributes.py +77 -0
  147. trueppm_api/apps/msproject/importer.py +1095 -0
  148. trueppm_api/apps/msproject/migrations/0001_import_request.py +77 -0
  149. trueppm_api/apps/msproject/migrations/0001_squashed_0002_importrequest_creates_project.py +80 -0
  150. trueppm_api/apps/msproject/migrations/0002_importrequest_creates_project.py +15 -0
  151. trueppm_api/apps/msproject/migrations/__init__.py +0 -0
  152. trueppm_api/apps/msproject/models.py +81 -0
  153. trueppm_api/apps/msproject/parser.py +1276 -0
  154. trueppm_api/apps/msproject/serializers.py +136 -0
  155. trueppm_api/apps/msproject/services.py +58 -0
  156. trueppm_api/apps/msproject/tasks.py +439 -0
  157. trueppm_api/apps/msproject/urls.py +39 -0
  158. trueppm_api/apps/msproject/views.py +531 -0
  159. trueppm_api/apps/notifications/__init__.py +7 -0
  160. trueppm_api/apps/notifications/apps.py +15 -0
  161. trueppm_api/apps/notifications/backfill.py +79 -0
  162. trueppm_api/apps/notifications/categories.py +112 -0
  163. trueppm_api/apps/notifications/delivery_limits.py +258 -0
  164. trueppm_api/apps/notifications/digests.py +462 -0
  165. trueppm_api/apps/notifications/email_backend.py +350 -0
  166. trueppm_api/apps/notifications/email_health.py +128 -0
  167. trueppm_api/apps/notifications/migrations/0001_initial.py +207 -0
  168. trueppm_api/apps/notifications/migrations/0001_squashed_0006_notification_task.py +299 -0
  169. trueppm_api/apps/notifications/migrations/0002_project_notification_preference.py +67 -0
  170. trueppm_api/apps/notifications/migrations/0003_projectnotificationpreference_paused.py +17 -0
  171. trueppm_api/apps/notifications/migrations/0004_clean_unknown_matrix_keys.py +30 -0
  172. trueppm_api/apps/notifications/migrations/0005_notification_body_notification_event_type_and_more.py +27 -0
  173. trueppm_api/apps/notifications/migrations/0006_notification_task.py +25 -0
  174. trueppm_api/apps/notifications/migrations/0007_squashed_0011_release_0_4.py +204 -0
  175. trueppm_api/apps/notifications/migrations/0007_workspaceemailsettings.py +80 -0
  176. trueppm_api/apps/notifications/migrations/0008_notification_snoozed_until.py +17 -0
  177. trueppm_api/apps/notifications/migrations/0009_usernotificationsettings.py +43 -0
  178. trueppm_api/apps/notifications/migrations/0010_projectnotificationpreference_schema_version.py +20 -0
  179. trueppm_api/apps/notifications/migrations/0011_usernotificationsettings_digest_hour_and_more.py +96 -0
  180. trueppm_api/apps/notifications/migrations/__init__.py +0 -0
  181. trueppm_api/apps/notifications/models.py +1148 -0
  182. trueppm_api/apps/notifications/receivers.py +155 -0
  183. trueppm_api/apps/notifications/schema_migrations.py +56 -0
  184. trueppm_api/apps/notifications/serializers.py +1094 -0
  185. trueppm_api/apps/notifications/services.py +1489 -0
  186. trueppm_api/apps/notifications/tasks.py +762 -0
  187. trueppm_api/apps/notifications/throttles.py +98 -0
  188. trueppm_api/apps/notifications/urls.py +97 -0
  189. trueppm_api/apps/notifications/views.py +919 -0
  190. trueppm_api/apps/observability/__init__.py +0 -0
  191. trueppm_api/apps/observability/apps.py +31 -0
  192. trueppm_api/apps/observability/logging.py +213 -0
  193. trueppm_api/apps/observability/migrations/0001_initial.py +35 -0
  194. trueppm_api/apps/observability/migrations/0001_squashed_0003_alter_purgerun_trigger.py +154 -0
  195. trueppm_api/apps/observability/migrations/0002_purgerun_retentionpolicy_retentionschedule.py +131 -0
  196. trueppm_api/apps/observability/migrations/0003_alter_purgerun_trigger.py +21 -0
  197. trueppm_api/apps/observability/migrations/0004_alter_retentionpolicy_key.py +28 -0
  198. trueppm_api/apps/observability/migrations/__init__.py +0 -0
  199. trueppm_api/apps/observability/models.py +141 -0
  200. trueppm_api/apps/observability/otel/__init__.py +45 -0
  201. trueppm_api/apps/observability/otel/attributes.py +247 -0
  202. trueppm_api/apps/observability/otel/export_health.py +533 -0
  203. trueppm_api/apps/observability/otel/instrumentation.py +351 -0
  204. trueppm_api/apps/observability/otel/metrics.py +566 -0
  205. trueppm_api/apps/observability/otel/provider.py +511 -0
  206. trueppm_api/apps/observability/otel/request_attributes.py +204 -0
  207. trueppm_api/apps/observability/purge_registry.py +124 -0
  208. trueppm_api/apps/observability/retention.py +139 -0
  209. trueppm_api/apps/observability/selectors.py +993 -0
  210. trueppm_api/apps/observability/serializers.py +142 -0
  211. trueppm_api/apps/observability/services.py +407 -0
  212. trueppm_api/apps/observability/tasks.py +266 -0
  213. trueppm_api/apps/observability/urls.py +27 -0
  214. trueppm_api/apps/observability/views.py +537 -0
  215. trueppm_api/apps/profiles/__init__.py +0 -0
  216. trueppm_api/apps/profiles/apps.py +15 -0
  217. trueppm_api/apps/profiles/constants.py +54 -0
  218. trueppm_api/apps/profiles/migrations/0001_initial.py +55 -0
  219. trueppm_api/apps/profiles/migrations/0001_squashed_0004_userprofile_role_context.py +125 -0
  220. trueppm_api/apps/profiles/migrations/0002_userprofile_hidden_views.py +17 -0
  221. trueppm_api/apps/profiles/migrations/0003_projectvisit.py +63 -0
  222. trueppm_api/apps/profiles/migrations/0004_userprofile_role_context.py +26 -0
  223. trueppm_api/apps/profiles/migrations/0005_squashed_0009_release_0_4.py +128 -0
  224. trueppm_api/apps/profiles/migrations/0005_userprofile_schedule_in_deliver.py +20 -0
  225. trueppm_api/apps/profiles/migrations/0006_userprofile_date_format_userprofile_timezone.py +36 -0
  226. trueppm_api/apps/profiles/migrations/0007_userpin.py +91 -0
  227. trueppm_api/apps/profiles/migrations/0008_remove_userprofile_schedule_in_deliver.py +71 -0
  228. trueppm_api/apps/profiles/migrations/0009_auth_user_email_upper_idx.py +81 -0
  229. trueppm_api/apps/profiles/migrations/__init__.py +0 -0
  230. trueppm_api/apps/profiles/models.py +276 -0
  231. trueppm_api/apps/profiles/serializers.py +199 -0
  232. trueppm_api/apps/profiles/services.py +541 -0
  233. trueppm_api/apps/profiles/views.py +124 -0
  234. trueppm_api/apps/projects/__init__.py +0 -0
  235. trueppm_api/apps/projects/actual_date_rules.py +163 -0
  236. trueppm_api/apps/projects/amend.py +133 -0
  237. trueppm_api/apps/projects/apps.py +38 -0
  238. trueppm_api/apps/projects/asset_feed.py +459 -0
  239. trueppm_api/apps/projects/asset_views.py +317 -0
  240. trueppm_api/apps/projects/attachment_policy.py +278 -0
  241. trueppm_api/apps/projects/authentication.py +458 -0
  242. trueppm_api/apps/projects/backfill.py +459 -0
  243. trueppm_api/apps/projects/backlog_services.py +324 -0
  244. trueppm_api/apps/projects/backlog_views.py +302 -0
  245. trueppm_api/apps/projects/batch_operation_views.py +264 -0
  246. trueppm_api/apps/projects/blocker_services.py +510 -0
  247. trueppm_api/apps/projects/board_activity.py +462 -0
  248. trueppm_api/apps/projects/board_activity_views.py +186 -0
  249. trueppm_api/apps/projects/board_lanes.py +134 -0
  250. trueppm_api/apps/projects/bulk_settings.py +194 -0
  251. trueppm_api/apps/projects/bundled_templates.py +215 -0
  252. trueppm_api/apps/projects/calendar_settings.py +180 -0
  253. trueppm_api/apps/projects/ceremony_views.py +244 -0
  254. trueppm_api/apps/projects/commit_moment.py +212 -0
  255. trueppm_api/apps/projects/config_notice.py +1330 -0
  256. trueppm_api/apps/projects/custom_field_values.py +266 -0
  257. trueppm_api/apps/projects/decisions_services.py +132 -0
  258. trueppm_api/apps/projects/decisions_views.py +97 -0
  259. trueppm_api/apps/projects/estimation_scale.py +126 -0
  260. trueppm_api/apps/projects/export_bundle.py +423 -0
  261. trueppm_api/apps/projects/fixtures/seeds/atlas-platform-launch.json +4278 -0
  262. trueppm_api/apps/projects/fixtures/seeds/aurora-mobile-app.json +2001 -0
  263. trueppm_api/apps/projects/fixtures/seeds/bayside-civic-center.json +1827 -0
  264. trueppm_api/apps/projects/fixtures/seeds/ga-launch.json +1909 -0
  265. trueppm_api/apps/projects/fixtures/seeds/helios-crm-replacement.json +1410 -0
  266. trueppm_api/apps/projects/guardrail_policy_source.py +269 -0
  267. trueppm_api/apps/projects/inbound_sync.py +555 -0
  268. trueppm_api/apps/projects/iteration_label.py +85 -0
  269. trueppm_api/apps/projects/key_views.py +468 -0
  270. trueppm_api/apps/projects/keys.py +205 -0
  271. trueppm_api/apps/projects/lifecycle.py +191 -0
  272. trueppm_api/apps/projects/management/__init__.py +0 -0
  273. trueppm_api/apps/projects/management/commands/__init__.py +0 -0
  274. trueppm_api/apps/projects/management/commands/backfill_in_progress_status.py +92 -0
  275. trueppm_api/apps/projects/management/commands/create_demo_share_link.py +368 -0
  276. trueppm_api/apps/projects/management/commands/export_program.py +50 -0
  277. trueppm_api/apps/projects/management/commands/import_seed.py +165 -0
  278. trueppm_api/apps/projects/management/commands/load_sample_project.py +514 -0
  279. trueppm_api/apps/projects/management/commands/seed_capacity.py +406 -0
  280. trueppm_api/apps/projects/management/commands/seed_integration_fixtures.py +192 -0
  281. trueppm_api/apps/projects/management/commands/shift_sample_dates.py +120 -0
  282. trueppm_api/apps/projects/mcp_settings.py +305 -0
  283. trueppm_api/apps/projects/methodology.py +178 -0
  284. trueppm_api/apps/projects/migration_helpers.py +75 -0
  285. trueppm_api/apps/projects/migrations/0001_initial.py +208 -0
  286. trueppm_api/apps/projects/migrations/0001_squashed_0094_project_decisions_policy.py +5659 -0
  287. trueppm_api/apps/projects/migrations/0002_alter_uuid_pk_serialize_false.py +57 -0
  288. trueppm_api/apps/projects/migrations/0003_rename_task_project_index.py +25 -0
  289. trueppm_api/apps/projects/migrations/0004_soft_delete_and_dependency_versioned.py +70 -0
  290. trueppm_api/apps/projects/migrations/0005_task_assignee.py +33 -0
  291. trueppm_api/apps/projects/migrations/0006_task_utilization_index.py +31 -0
  292. trueppm_api/apps/projects/migrations/0007_task_is_milestone.py +28 -0
  293. trueppm_api/apps/projects/migrations/0008_baseline.py +119 -0
  294. trueppm_api/apps/projects/migrations/0009_historicaldependency_historicalproject_and_more.py +210 -0
  295. trueppm_api/apps/projects/migrations/0010_risk.py +229 -0
  296. trueppm_api/apps/projects/migrations/0011_task_status.py +27 -0
  297. trueppm_api/apps/projects/migrations/0012_task_status.py +27 -0
  298. trueppm_api/apps/projects/migrations/0013_task_planned_start.py +24 -0
  299. trueppm_api/apps/projects/migrations/0014_short_hex_ids.py +74 -0
  300. trueppm_api/apps/projects/migrations/0015_backfill_short_ids.py +48 -0
  301. trueppm_api/apps/projects/migrations/0016_task_actual_dates.py +42 -0
  302. trueppm_api/apps/projects/migrations/0017_boardcolumnconfig.py +43 -0
  303. trueppm_api/apps/projects/migrations/0018_estimation_governance.py +62 -0
  304. trueppm_api/apps/projects/migrations/0019_backfill_wbs_paths.py +28 -0
  305. trueppm_api/apps/projects/migrations/0020_task_status_5col.py +65 -0
  306. trueppm_api/apps/projects/migrations/0021_boardsavedview.py +64 -0
  307. trueppm_api/apps/projects/migrations/0022_task_status_changed_at_priority_rank.py +35 -0
  308. trueppm_api/apps/projects/migrations/0023_risk_framework_fields.py +96 -0
  309. trueppm_api/apps/projects/migrations/0024_riskcomment.py +52 -0
  310. trueppm_api/apps/projects/migrations/0025_sprint.py +352 -0
  311. trueppm_api/apps/projects/migrations/0026_project_methodology.py +30 -0
  312. trueppm_api/apps/projects/migrations/0027_sprint_retro.py +89 -0
  313. trueppm_api/apps/projects/migrations/0028_normalize_notes_field.py +42 -0
  314. trueppm_api/apps/projects/migrations/0029_complete_implies_full_progress.py +38 -0
  315. trueppm_api/apps/projects/migrations/0030_review_implies_full_progress.py +37 -0
  316. trueppm_api/apps/projects/migrations/0031_task_remaining_points.py +22 -0
  317. trueppm_api/apps/projects/migrations/0032_task_is_subtask_and_sprint_scope_change.py +90 -0
  318. trueppm_api/apps/projects/migrations/0033_task_my_work_index.py +38 -0
  319. trueppm_api/apps/projects/migrations/0034_inbound_task_sync.py +313 -0
  320. trueppm_api/apps/projects/migrations/0035_retro_versioned_and_suggested_assignee.py +173 -0
  321. trueppm_api/apps/projects/migrations/0036_program_entity_and_membership.py +157 -0
  322. trueppm_api/apps/projects/migrations/0037_sprint_capacity_points.py +20 -0
  323. trueppm_api/apps/projects/migrations/0038_taskcomment_commentreaction_commentacknowledgement_and_more.py +233 -0
  324. trueppm_api/apps/projects/migrations/0039_apitoken_and_more.py +88 -0
  325. trueppm_api/apps/projects/migrations/0040_program_general_fields.py +119 -0
  326. trueppm_api/apps/projects/migrations/0041_ceremony_template_and_phase_gate_config.py +210 -0
  327. trueppm_api/apps/projects/migrations/0041_project_general_fields.py +106 -0
  328. trueppm_api/apps/projects/migrations/0042_merge_20260522_0410.py +12 -0
  329. trueppm_api/apps/projects/migrations/0042_program_rollup_config.py +95 -0
  330. trueppm_api/apps/projects/migrations/0042_workflow_color_and_custom_fields.py +94 -0
  331. trueppm_api/apps/projects/migrations/0043_merge_20260522_1118.py +10 -0
  332. trueppm_api/apps/projects/migrations/0044_merge_20260522_rollup.py +10 -0
  333. trueppm_api/apps/projects/migrations/0044_project_archive_program_close.py +119 -0
  334. trueppm_api/apps/projects/migrations/0045_program_risk_policy.py +78 -0
  335. trueppm_api/apps/projects/migrations/0046_merge_20260523_2248.py +12 -0
  336. trueppm_api/apps/projects/migrations/0047_apitokenauditentry_program_and_more.py +55 -0
  337. trueppm_api/apps/projects/migrations/0048_historicalprogram_color_program_color.py +32 -0
  338. trueppm_api/apps/projects/migrations/0049_backlog_item.py +112 -0
  339. trueppm_api/apps/projects/migrations/0050_backlog_item_trgm_search.py +26 -0
  340. trueppm_api/apps/projects/migrations/0051_alter_calendar_working_days_alter_dependency_lag_and_more.py +144 -0
  341. trueppm_api/apps/projects/migrations/0052_recurring_tasks.py +278 -0
  342. trueppm_api/apps/projects/migrations/0053_dependency_dep_pred_serverver_idx_and_more.py +56 -0
  343. trueppm_api/apps/projects/migrations/0054_sprintscopechange_goal_impact_and_more.py +117 -0
  344. trueppm_api/apps/projects/migrations/0055_historicaltask_sprint_pending_and_more.py +51 -0
  345. trueppm_api/apps/projects/migrations/0056_historicalproject_prioritization_model_and_more.py +276 -0
  346. trueppm_api/apps/projects/migrations/0057_historicalsprint_binding_committed_snapshot_and_more.py +58 -0
  347. trueppm_api/apps/projects/migrations/0058_historicaltask_delivery_mode_and_more.py +72 -0
  348. trueppm_api/apps/projects/migrations/0059_forecastsnapshot.py +80 -0
  349. trueppm_api/apps/projects/migrations/0060_historicalprojectsignalprivacypolicy_and_more.py +90 -0
  350. trueppm_api/apps/projects/migrations/0061_baselinetask_story_points.py +17 -0
  351. trueppm_api/apps/projects/migrations/0062_project_is_sample.py +22 -0
  352. trueppm_api/apps/projects/migrations/0063_historicalsprint_wip_limit_sprint_wip_limit.py +22 -0
  353. trueppm_api/apps/projects/migrations/0064_sprinttaskoutcome.py +97 -0
  354. trueppm_api/apps/projects/migrations/0065_historicalsprint_goal_outcome_sprint_goal_outcome.py +32 -0
  355. trueppm_api/apps/projects/migrations/0066_historicalproject_lead_project_lead.py +38 -0
  356. trueppm_api/apps/projects/migrations/0067_sprint_exclude_from_velocity.py +22 -0
  357. trueppm_api/apps/projects/migrations/0068_project_recalculated_at.py +23 -0
  358. trueppm_api/apps/projects/migrations/0069_iteration_label.py +22 -0
  359. trueppm_api/apps/projects/migrations/0070_historicalprogram_iteration_label_and_more.py +32 -0
  360. trueppm_api/apps/projects/migrations/0071_backfill_iteration_label_inherit.py +35 -0
  361. trueppm_api/apps/projects/migrations/0072_pulseresponse_retroboarditem.py +129 -0
  362. trueppm_api/apps/projects/migrations/0073_sprinttaskoutcome_demo_ready.py +17 -0
  363. trueppm_api/apps/projects/migrations/0074_historicaltask_blocked_reason_task_blocked_reason.py +30 -0
  364. trueppm_api/apps/projects/migrations/0075_risk_decimal_short_id.py +42 -0
  365. trueppm_api/apps/projects/migrations/0076_sprinttaskoutcome_review_polish.py +45 -0
  366. trueppm_api/apps/projects/migrations/0077_task_blocker_fields.py +111 -0
  367. trueppm_api/apps/projects/migrations/0078_alter_risktask_unique_together_and_more.py +22 -0
  368. trueppm_api/apps/projects/migrations/0079_historicalproject_status_date_project_status_date.py +22 -0
  369. trueppm_api/apps/projects/migrations/0080_alter_historicaltask_type_alter_task_type.py +46 -0
  370. trueppm_api/apps/projects/migrations/0081_historicalprogram_allow_guests_and_more.py +52 -0
  371. trueppm_api/apps/projects/migrations/0082_project_last_sync_version.py +90 -0
  372. trueppm_api/apps/projects/migrations/0083_historicalprogram_mc_history_attribution_audience_and_more.py +108 -0
  373. trueppm_api/apps/projects/migrations/0084_tasknote.py +71 -0
  374. trueppm_api/apps/projects/migrations/0085_sprint_ix_sprint_velocity.py +33 -0
  375. trueppm_api/apps/projects/migrations/0086_board_card_search_trgm.py +33 -0
  376. trueppm_api/apps/projects/migrations/0087_historicalprogram_task_duration_change_percent_policy_and_more.py +155 -0
  377. trueppm_api/apps/projects/migrations/0088_historicalprogram_allowed_attachment_types_and_more.py +61 -0
  378. trueppm_api/apps/projects/migrations/0089_signalceilingraiseproposal_signalceilingraisevote_and_more.py +157 -0
  379. trueppm_api/apps/projects/migrations/0090_historicaltask_proj_histdate_index.py +59 -0
  380. trueppm_api/apps/projects/migrations/0091_project_board_cadence.py +39 -0
  381. trueppm_api/apps/projects/migrations/0092_program_target_date.py +22 -0
  382. trueppm_api/apps/projects/migrations/0093_cross_project_dependency_consent.py +58 -0
  383. trueppm_api/apps/projects/migrations/0094_project_decisions_policy.py +90 -0
  384. trueppm_api/apps/projects/migrations/0095_poker_session_vote.py +127 -0
  385. trueppm_api/apps/projects/migrations/0095_squashed_0097_release_0_3.py +225 -0
  386. trueppm_api/apps/projects/migrations/0096_crossprojectslipconflict.py +91 -0
  387. trueppm_api/apps/projects/migrations/0097_backlogitem_backlogitem_tags_gin_and_more.py +32 -0
  388. trueppm_api/apps/projects/migrations/0098_historicalproject_show_baselines_and_more.py +52 -0
  389. trueppm_api/apps/projects/migrations/0099_apitoken_scopes.py +48 -0
  390. trueppm_api/apps/projects/migrations/0100_task_dep_serverver_idx_concurrent.py +75 -0
  391. trueppm_api/apps/projects/migrations/0101_dependency_deleted_at_task_deleted_at.py +22 -0
  392. trueppm_api/apps/projects/migrations/0102_project_deleted_at_project_proj_isdel_deletedat_idx.py +25 -0
  393. trueppm_api/apps/projects/migrations/0103_taskdurationchangeevent_task_dur_evt_sprint_idx.py +18 -0
  394. trueppm_api/apps/projects/migrations/0104_historicalproject_stale_task_threshold_days_and_more.py +32 -0
  395. trueppm_api/apps/projects/migrations/0104_trash_restore_1113.py +38 -0
  396. trueppm_api/apps/projects/migrations/0105_historical_changelog_indexes.py +76 -0
  397. trueppm_api/apps/projects/migrations/0106_boardsavedview_schema_version.py +20 -0
  398. trueppm_api/apps/projects/migrations/0106_squashed_0158_release_0_4.py +2357 -0
  399. trueppm_api/apps/projects/migrations/0107_task_activity_event.py +70 -0
  400. trueppm_api/apps/projects/migrations/0108_remove_apitoken_api_token_scope_xor_and_more.py +117 -0
  401. trueppm_api/apps/projects/migrations/0109_projectexportjob.py +82 -0
  402. trueppm_api/apps/projects/migrations/0110_sharelink.py +123 -0
  403. trueppm_api/apps/projects/migrations/0111_projectcalendarlayer.py +67 -0
  404. trueppm_api/apps/projects/migrations/0112_sharelink_expires_at_alter_sharelink_content_kind.py +31 -0
  405. trueppm_api/apps/projects/migrations/0113_alter_historicaltask_percent_complete_and_more.py +35 -0
  406. trueppm_api/apps/projects/migrations/0114_historicalproject_default_member_role_and_more.py +28 -0
  407. trueppm_api/apps/projects/migrations/0115_historicalproject_end_date_shift_threshold_days_and_more.py +22 -0
  408. trueppm_api/apps/projects/migrations/0116_alter_taskactivityevent_event_type.py +28 -0
  409. trueppm_api/apps/projects/migrations/0117_label_tasklabel_label_tasks_and_more.py +126 -0
  410. trueppm_api/apps/projects/migrations/0118_programexportjob.py +82 -0
  411. trueppm_api/apps/projects/migrations/0119_historicalprogram_calendar_program_calendar.py +36 -0
  412. trueppm_api/apps/projects/migrations/0120_alter_backlogitem_item_type.py +29 -0
  413. trueppm_api/apps/projects/migrations/0121_task_three_point_estimate_ordered.py +64 -0
  414. trueppm_api/apps/projects/migrations/0122_task_relation.py +173 -0
  415. trueppm_api/apps/projects/migrations/0123_remove_historicalproject_agile_features_and_more.py +20 -0
  416. trueppm_api/apps/projects/migrations/0124_dependency_is_driving.py +17 -0
  417. trueppm_api/apps/projects/migrations/0125_historicalprogram_estimation_scale_and_more.py +68 -0
  418. trueppm_api/apps/projects/migrations/0126_projectcustomfield_show_on_card_taskcustomfieldvalue.py +80 -0
  419. trueppm_api/apps/projects/migrations/0127_historicalprogram_mcp_enabled_and_more.py +32 -0
  420. trueppm_api/apps/projects/migrations/0128_acceptancecriterion_sync_seq_apitoken_sync_seq_and_more.py +192 -0
  421. trueppm_api/apps/projects/migrations/0129_sharelink_show_milestone_dates.py +20 -0
  422. trueppm_api/apps/projects/migrations/0130_programimportjob.py +85 -0
  423. trueppm_api/apps/projects/migrations/0131_historicalprogram_sprint_picker_ready_only_default_and_more.py +32 -0
  424. trueppm_api/apps/projects/migrations/0132_task_scheduled_start.py +17 -0
  425. trueppm_api/apps/projects/migrations/0133_project_status_date_floor_armed_at.py +17 -0
  426. trueppm_api/apps/projects/migrations/0134_task_edited_at_task_seeded_at_task_source_id_and_more.py +65 -0
  427. trueppm_api/apps/projects/migrations/0135_projecttemplate_templateapplication_and_more.py +175 -0
  428. trueppm_api/apps/projects/migrations/0136_schedule_outline_batch_operations.py +118 -0
  429. trueppm_api/apps/projects/migrations/0137_collapse_dual_scope_api_tokens.py +54 -0
  430. trueppm_api/apps/projects/migrations/0138_apitokenauditentry_api_token_audit_owner_idx.py +18 -0
  431. trueppm_api/apps/projects/migrations/0139_historicaltask_duration_unit_task_duration_unit.py +32 -0
  432. trueppm_api/apps/projects/migrations/0140_historicaltask_auto_container_and_more.py +113 -0
  433. trueppm_api/apps/projects/migrations/0141_historicalproject_draft_started_at_and_more.py +44 -0
  434. trueppm_api/apps/projects/migrations/0142_baseline_calendar_hours_per_day_and_more.py +31 -0
  435. trueppm_api/apps/projects/migrations/0143_sprintcloserequest_failure_reason_and_more.py +42 -0
  436. trueppm_api/apps/projects/migrations/0144_projecttemplate_source_project_and_more.py +35 -0
  437. trueppm_api/apps/projects/migrations/0145_seed_bundled_templates.py +65 -0
  438. trueppm_api/apps/projects/migrations/0146_historicaltask_board_lane_task_board_lane.py +32 -0
  439. trueppm_api/apps/projects/migrations/0147_structuraloperation.py +128 -0
  440. trueppm_api/apps/projects/migrations/0148_task_unique_task_wbs_path_per_project_live.py +76 -0
  441. trueppm_api/apps/projects/migrations/0149_drop_workshops_tables.py +42 -0
  442. trueppm_api/apps/projects/migrations/0150_clear_uncommitted_cpm_output.py +130 -0
  443. trueppm_api/apps/projects/migrations/0151_config_notice_request.py +70 -0
  444. trueppm_api/apps/projects/migrations/0152_aggregate_task_wbs_name_idx.py +20 -0
  445. trueppm_api/apps/projects/migrations/0153_program_sample_anchor_date.py +22 -0
  446. trueppm_api/apps/projects/migrations/0154_object_keys.py +184 -0
  447. trueppm_api/apps/projects/migrations/0155_task_milestone_at_day_end.py +20 -0
  448. trueppm_api/apps/projects/migrations/0156_program_import_job_replaced_project_ids.py +17 -0
  449. trueppm_api/apps/projects/migrations/0157_forecastsnapshot_cpm_finish_at_day_start.py +17 -0
  450. trueppm_api/apps/projects/migrations/0158_baselinetask_finish_at_day_start.py +17 -0
  451. trueppm_api/apps/projects/migrations/__init__.py +0 -0
  452. trueppm_api/apps/projects/models.py +9209 -0
  453. trueppm_api/apps/projects/poker_services.py +154 -0
  454. trueppm_api/apps/projects/poker_views.py +398 -0
  455. trueppm_api/apps/projects/product_backlog_services.py +450 -0
  456. trueppm_api/apps/projects/program_label_services.py +94 -0
  457. trueppm_api/apps/projects/program_label_views.py +189 -0
  458. trueppm_api/apps/projects/program_rollup.py +903 -0
  459. trueppm_api/apps/projects/program_schedule.py +767 -0
  460. trueppm_api/apps/projects/program_views.py +3445 -0
  461. trueppm_api/apps/projects/project_templates.py +422 -0
  462. trueppm_api/apps/projects/receivers.py +234 -0
  463. trueppm_api/apps/projects/refusal_codes.py +140 -0
  464. trueppm_api/apps/projects/reorder_services.py +145 -0
  465. trueppm_api/apps/projects/restructure_hooks.py +54 -0
  466. trueppm_api/apps/projects/retro_board_services.py +368 -0
  467. trueppm_api/apps/projects/retro_services.py +285 -0
  468. trueppm_api/apps/projects/risk_import.py +396 -0
  469. trueppm_api/apps/projects/row_identity.py +113 -0
  470. trueppm_api/apps/projects/schema_migrations.py +228 -0
  471. trueppm_api/apps/projects/schemas/seed_v1.json +492 -0
  472. trueppm_api/apps/projects/schemas/seed_v2.json +891 -0
  473. trueppm_api/apps/projects/seed/__init__.py +61 -0
  474. trueppm_api/apps/projects/seed/demo_landing_overlay.py +532 -0
  475. trueppm_api/apps/projects/seed/exporter.py +1717 -0
  476. trueppm_api/apps/projects/seed/forecast_backfill.py +247 -0
  477. trueppm_api/apps/projects/seed/importer.py +2764 -0
  478. trueppm_api/apps/projects/seed/reanchor.py +551 -0
  479. trueppm_api/apps/projects/seed/reldates.py +126 -0
  480. trueppm_api/apps/projects/seed/replace.py +128 -0
  481. trueppm_api/apps/projects/seed/replay.py +1695 -0
  482. trueppm_api/apps/projects/seed/replay_ctx.py +41 -0
  483. trueppm_api/apps/projects/seed/samples.py +427 -0
  484. trueppm_api/apps/projects/seed/validation.py +1169 -0
  485. trueppm_api/apps/projects/serializers.py +12904 -0
  486. trueppm_api/apps/projects/services.py +7525 -0
  487. trueppm_api/apps/projects/share_serializers.py +142 -0
  488. trueppm_api/apps/projects/share_services.py +373 -0
  489. trueppm_api/apps/projects/share_views.py +395 -0
  490. trueppm_api/apps/projects/sharing_settings.py +187 -0
  491. trueppm_api/apps/projects/signal_privacy_services.py +910 -0
  492. trueppm_api/apps/projects/signal_privacy_views.py +485 -0
  493. trueppm_api/apps/projects/signals.py +132 -0
  494. trueppm_api/apps/projects/slip_conflict.py +288 -0
  495. trueppm_api/apps/projects/sprint_cadence.py +453 -0
  496. trueppm_api/apps/projects/sprint_picker_settings.py +132 -0
  497. trueppm_api/apps/projects/standup.py +304 -0
  498. trueppm_api/apps/projects/standup_views.py +99 -0
  499. trueppm_api/apps/projects/structural_operation_services.py +727 -0
  500. trueppm_api/apps/projects/structural_operation_views.py +311 -0
  501. trueppm_api/apps/projects/surface_visibility.py +126 -0
  502. trueppm_api/apps/projects/task_batch_services.py +379 -0
  503. trueppm_api/apps/projects/task_bulk.py +1244 -0
  504. trueppm_api/apps/projects/task_classification.py +561 -0
  505. trueppm_api/apps/projects/task_classification_defaults.py +95 -0
  506. trueppm_api/apps/projects/task_duration_settings.py +142 -0
  507. trueppm_api/apps/projects/task_grouping.py +754 -0
  508. trueppm_api/apps/projects/tasks.py +1979 -0
  509. trueppm_api/apps/projects/template_divergence.py +168 -0
  510. trueppm_api/apps/projects/template_services.py +160 -0
  511. trueppm_api/apps/projects/template_tasks.py +261 -0
  512. trueppm_api/apps/projects/template_views.py +829 -0
  513. trueppm_api/apps/projects/throttles.py +311 -0
  514. trueppm_api/apps/projects/urls.py +1016 -0
  515. trueppm_api/apps/projects/utilization.py +909 -0
  516. trueppm_api/apps/projects/views.py +21225 -0
  517. trueppm_api/apps/projects/wbs_paths.py +119 -0
  518. trueppm_api/apps/resources/__init__.py +0 -0
  519. trueppm_api/apps/resources/apps.py +8 -0
  520. trueppm_api/apps/resources/capacity.py +121 -0
  521. trueppm_api/apps/resources/migrations/0001_initial.py +68 -0
  522. trueppm_api/apps/resources/migrations/0001_squashed_0013_alter_projectresource_unique_together_and_more.py +281 -0
  523. trueppm_api/apps/resources/migrations/0002_alter_uuid_pk_serialize_false.py +36 -0
  524. trueppm_api/apps/resources/migrations/0003_resource_soft_delete.py +30 -0
  525. trueppm_api/apps/resources/migrations/0004_add_taskresource_resource_index.py +25 -0
  526. trueppm_api/apps/resources/migrations/0005_resource_job_role.py +20 -0
  527. trueppm_api/apps/resources/migrations/0006_skill.py +34 -0
  528. trueppm_api/apps/resources/migrations/0007_resource_skill.py +63 -0
  529. trueppm_api/apps/resources/migrations/0008_project_resource.py +63 -0
  530. trueppm_api/apps/resources/migrations/0009_task_skill_requirement.py +60 -0
  531. trueppm_api/apps/resources/migrations/0010_alter_resourceskill_options_and_more.py +20 -0
  532. trueppm_api/apps/resources/migrations/0011_alter_projectresource_notes.py +17 -0
  533. trueppm_api/apps/resources/migrations/0012_add_resource_user_fk.py +26 -0
  534. trueppm_api/apps/resources/migrations/0013_alter_projectresource_unique_together_and_more.py +53 -0
  535. trueppm_api/apps/resources/migrations/0014_projectresource_sync_seq_resource_sync_seq_and_more.py +37 -0
  536. trueppm_api/apps/resources/migrations/0014_squashed_0015_release_0_4.py +47 -0
  537. trueppm_api/apps/resources/migrations/0015_projectresource_deactivated_with_resource.py +17 -0
  538. trueppm_api/apps/resources/migrations/__init__.py +0 -0
  539. trueppm_api/apps/resources/models.py +298 -0
  540. trueppm_api/apps/resources/serializers.py +426 -0
  541. trueppm_api/apps/resources/services.py +465 -0
  542. trueppm_api/apps/resources/urls.py +28 -0
  543. trueppm_api/apps/resources/views.py +1752 -0
  544. trueppm_api/apps/scheduling/__init__.py +0 -0
  545. trueppm_api/apps/scheduling/apps.py +153 -0
  546. trueppm_api/apps/scheduling/calendars.py +144 -0
  547. trueppm_api/apps/scheduling/deadletter.py +91 -0
  548. trueppm_api/apps/scheduling/finish_reading.py +198 -0
  549. trueppm_api/apps/scheduling/forecast_history_settings.py +215 -0
  550. trueppm_api/apps/scheduling/forecast_staleness.py +313 -0
  551. trueppm_api/apps/scheduling/graph_guard.py +263 -0
  552. trueppm_api/apps/scheduling/management/__init__.py +0 -0
  553. trueppm_api/apps/scheduling/management/commands/__init__.py +0 -0
  554. trueppm_api/apps/scheduling/management/commands/prune_forecast_snapshots.py +53 -0
  555. trueppm_api/apps/scheduling/mc_admission.py +181 -0
  556. trueppm_api/apps/scheduling/migrations/0001_failed_task.py +62 -0
  557. trueppm_api/apps/scheduling/migrations/0001_squashed_0007_projectforecastsnapshot.py +309 -0
  558. trueppm_api/apps/scheduling/migrations/0002_schedulerequest.py +78 -0
  559. trueppm_api/apps/scheduling/migrations/0003_add_schedule_request_reason.py +27 -0
  560. trueppm_api/apps/scheduling/migrations/0004_velocity_suggestion.py +94 -0
  561. trueppm_api/apps/scheduling/migrations/0005_montecarlorun.py +61 -0
  562. trueppm_api/apps/scheduling/migrations/0006_montecarlorun_distribution.py +17 -0
  563. trueppm_api/apps/scheduling/migrations/0007_projectforecastsnapshot.py +65 -0
  564. trueppm_api/apps/scheduling/migrations/0008_alter_schedulerequest_reason.py +28 -0
  565. trueppm_api/apps/scheduling/migrations/0008_folded_schedulerequest_reason.py +34 -0
  566. trueppm_api/apps/scheduling/migrations/0009_alter_schedulerequest_reason.py +29 -0
  567. trueppm_api/apps/scheduling/migrations/0010_failedtask_resolution_note_failedtask_resolved_at_and_more.py +43 -0
  568. trueppm_api/apps/scheduling/migrations/0010_squashed_0016_release_0_4.py +106 -0
  569. trueppm_api/apps/scheduling/migrations/0011_failedtask_project.py +26 -0
  570. trueppm_api/apps/scheduling/migrations/0012_montecarlorun_diagnostic.py +17 -0
  571. trueppm_api/apps/scheduling/migrations/0013_montecarlorun_status_date.py +17 -0
  572. trueppm_api/apps/scheduling/migrations/0014_montecarlorun_plan_version.py +17 -0
  573. trueppm_api/apps/scheduling/migrations/0015_projectforecastsnapshot_cpm_finish_at_day_start.py +17 -0
  574. trueppm_api/apps/scheduling/migrations/0016_montecarlorun_finish_readings.py +32 -0
  575. trueppm_api/apps/scheduling/migrations/__init__.py +0 -0
  576. trueppm_api/apps/scheduling/models.py +542 -0
  577. trueppm_api/apps/scheduling/receivers.py +160 -0
  578. trueppm_api/apps/scheduling/risk_premium.py +334 -0
  579. trueppm_api/apps/scheduling/serializers.py +723 -0
  580. trueppm_api/apps/scheduling/services.py +1251 -0
  581. trueppm_api/apps/scheduling/signals.py +56 -0
  582. trueppm_api/apps/scheduling/tasks.py +2248 -0
  583. trueppm_api/apps/scheduling/telemetry.py +80 -0
  584. trueppm_api/apps/scheduling/units.py +35 -0
  585. trueppm_api/apps/scheduling/urls.py +57 -0
  586. trueppm_api/apps/scheduling/views.py +2908 -0
  587. trueppm_api/apps/sso/__init__.py +0 -0
  588. trueppm_api/apps/sso/apps.py +19 -0
  589. trueppm_api/apps/sso/extensions.py +130 -0
  590. trueppm_api/apps/sso/management/__init__.py +0 -0
  591. trueppm_api/apps/sso/management/commands/__init__.py +0 -0
  592. trueppm_api/apps/sso/management/commands/seed_sso_keycloak.py +172 -0
  593. trueppm_api/apps/sso/migrations/0001_initial.py +119 -0
  594. trueppm_api/apps/sso/migrations/0002_remove_oidcprovider_workspace_ssoproviderpolicy_and_more.py +169 -0
  595. trueppm_api/apps/sso/migrations/__init__.py +0 -0
  596. trueppm_api/apps/sso/models.py +148 -0
  597. trueppm_api/apps/sso/serializers.py +446 -0
  598. trueppm_api/apps/sso/services.py +1473 -0
  599. trueppm_api/apps/sso/urls.py +47 -0
  600. trueppm_api/apps/sso/views.py +935 -0
  601. trueppm_api/apps/sync/__init__.py +0 -0
  602. trueppm_api/apps/sync/apps.py +15 -0
  603. trueppm_api/apps/sync/backfill.py +208 -0
  604. trueppm_api/apps/sync/broadcast.py +369 -0
  605. trueppm_api/apps/sync/conflict.py +262 -0
  606. trueppm_api/apps/sync/consumers.py +548 -0
  607. trueppm_api/apps/sync/migrations/0001_initial.py +59 -0
  608. trueppm_api/apps/sync/migrations/0001_squashed_0002_remove_syncbatch_syncbatch_project_client_batch_uniq_and_more.py +77 -0
  609. trueppm_api/apps/sync/migrations/0002_remove_syncbatch_syncbatch_project_client_batch_uniq_and_more.py +41 -0
  610. trueppm_api/apps/sync/migrations/0003_boardevent.py +46 -0
  611. trueppm_api/apps/sync/migrations/0003_squashed_0005_release_0_4.py +77 -0
  612. trueppm_api/apps/sync/migrations/0004_seed_sync_seq.py +24 -0
  613. trueppm_api/apps/sync/migrations/0005_program_sync_sequence.py +35 -0
  614. trueppm_api/apps/sync/migrations/0006_boardevent_per_project_seq.py +77 -0
  615. trueppm_api/apps/sync/migrations/__init__.py +0 -0
  616. trueppm_api/apps/sync/models.py +272 -0
  617. trueppm_api/apps/sync/pagination.py +231 -0
  618. trueppm_api/apps/sync/sequence.py +488 -0
  619. trueppm_api/apps/sync/serializers.py +688 -0
  620. trueppm_api/apps/sync/tasks.py +260 -0
  621. trueppm_api/apps/sync/throttles.py +175 -0
  622. trueppm_api/apps/sync/upload.py +556 -0
  623. trueppm_api/apps/sync/urls.py +17 -0
  624. trueppm_api/apps/sync/views.py +957 -0
  625. trueppm_api/apps/sync/ws_auth.py +193 -0
  626. trueppm_api/apps/taskruns/__init__.py +0 -0
  627. trueppm_api/apps/taskruns/apps.py +11 -0
  628. trueppm_api/apps/taskruns/migrations/0001_initial.py +92 -0
  629. trueppm_api/apps/taskruns/migrations/__init__.py +0 -0
  630. trueppm_api/apps/taskruns/models.py +68 -0
  631. trueppm_api/apps/taskruns/serializers.py +92 -0
  632. trueppm_api/apps/taskruns/tasks.py +60 -0
  633. trueppm_api/apps/taskruns/tracker.py +286 -0
  634. trueppm_api/apps/taskruns/urls.py +46 -0
  635. trueppm_api/apps/taskruns/views.py +195 -0
  636. trueppm_api/apps/teams/__init__.py +8 -0
  637. trueppm_api/apps/teams/apps.py +16 -0
  638. trueppm_api/apps/teams/migrations/0001_initial.py +139 -0
  639. trueppm_api/apps/teams/migrations/0001_squashed_0002_default_teams.py +159 -0
  640. trueppm_api/apps/teams/migrations/0002_default_teams.py +62 -0
  641. trueppm_api/apps/teams/migrations/0003_team_sync_seq_teammembership_sync_seq.py +22 -0
  642. trueppm_api/apps/teams/migrations/0004_backfill_default_teams_on_upgrade.py +49 -0
  643. trueppm_api/apps/teams/migrations/__init__.py +0 -0
  644. trueppm_api/apps/teams/models.py +145 -0
  645. trueppm_api/apps/teams/permissions.py +149 -0
  646. trueppm_api/apps/teams/serializers.py +95 -0
  647. trueppm_api/apps/teams/services.py +440 -0
  648. trueppm_api/apps/teams/signals.py +61 -0
  649. trueppm_api/apps/teams/urls.py +34 -0
  650. trueppm_api/apps/teams/views.py +201 -0
  651. trueppm_api/apps/timetracking/__init__.py +0 -0
  652. trueppm_api/apps/timetracking/apps.py +9 -0
  653. trueppm_api/apps/timetracking/migrations/0001_initial.py +117 -0
  654. trueppm_api/apps/timetracking/migrations/0001_squashed_0004_release_0_4.py +167 -0
  655. trueppm_api/apps/timetracking/migrations/0002_timesheetsubmission.py +46 -0
  656. trueppm_api/apps/timetracking/migrations/0003_timeentry_deleted_at_timeentry_deleted_by.py +31 -0
  657. trueppm_api/apps/timetracking/migrations/0004_timeentry_sync_seq_and_more.py +24 -0
  658. trueppm_api/apps/timetracking/migrations/__init__.py +0 -0
  659. trueppm_api/apps/timetracking/models.py +178 -0
  660. trueppm_api/apps/timetracking/serializers.py +175 -0
  661. trueppm_api/apps/timetracking/services.py +211 -0
  662. trueppm_api/apps/timetracking/urls.py +47 -0
  663. trueppm_api/apps/timetracking/views.py +597 -0
  664. trueppm_api/apps/webhooks/__init__.py +0 -0
  665. trueppm_api/apps/webhooks/apps.py +8 -0
  666. trueppm_api/apps/webhooks/backfill.py +90 -0
  667. trueppm_api/apps/webhooks/dispatch.py +279 -0
  668. trueppm_api/apps/webhooks/migrations/0001_initial.py +146 -0
  669. trueppm_api/apps/webhooks/migrations/0001_squashed_0007_sprint_lifecycle_events.py +249 -0
  670. trueppm_api/apps/webhooks/migrations/0002_alter_webhook_events.py +32 -0
  671. trueppm_api/apps/webhooks/migrations/0003_delivery_status_created_idx.py +17 -0
  672. trueppm_api/apps/webhooks/migrations/0004_webhook_program_alter_webhook_project_and_more.py +64 -0
  673. trueppm_api/apps/webhooks/migrations/0005_webhook_delivery_sequence_numbers.py +30 -0
  674. trueppm_api/apps/webhooks/migrations/0006_webhook_format_alter_webhook_events_and_more.py +61 -0
  675. trueppm_api/apps/webhooks/migrations/0007_sprint_lifecycle_events.py +63 -0
  676. trueppm_api/apps/webhooks/migrations/0008_risk_baseline_comment_events.py +73 -0
  677. trueppm_api/apps/webhooks/migrations/0009_encrypt_webhook_secret_and_failure_counters.py +100 -0
  678. trueppm_api/apps/webhooks/migrations/0010_alter_webhook_disabled_at.py +21 -0
  679. trueppm_api/apps/webhooks/migrations/0011_webhookeditor.py +48 -0
  680. trueppm_api/apps/webhooks/migrations/0012_alter_webhook_disabled_at.py +21 -0
  681. trueppm_api/apps/webhooks/migrations/__init__.py +0 -0
  682. trueppm_api/apps/webhooks/models.py +437 -0
  683. trueppm_api/apps/webhooks/serializers.py +326 -0
  684. trueppm_api/apps/webhooks/tasks.py +680 -0
  685. trueppm_api/apps/webhooks/urls.py +22 -0
  686. trueppm_api/apps/webhooks/views.py +533 -0
  687. trueppm_api/apps/workflow_engine/__init__.py +0 -0
  688. trueppm_api/apps/workflow_engine/apps.py +23 -0
  689. trueppm_api/apps/workflow_engine/migrations/0001_initial.py +230 -0
  690. trueppm_api/apps/workflow_engine/migrations/0001_squashed_0002_remove_workflowhistoryevent_workflow_history_lookup_idx.py +234 -0
  691. trueppm_api/apps/workflow_engine/migrations/0002_remove_workflowhistoryevent_workflow_history_lookup_idx.py +16 -0
  692. trueppm_api/apps/workflow_engine/migrations/0003_workflowoutboxrow_workflow_outbox_recovery_idx.py +21 -0
  693. trueppm_api/apps/workflow_engine/migrations/__init__.py +0 -0
  694. trueppm_api/apps/workflow_engine/models.py +265 -0
  695. trueppm_api/apps/workflow_engine/tasks.py +371 -0
  696. trueppm_api/apps/workspace/__init__.py +0 -0
  697. trueppm_api/apps/workspace/apps.py +10 -0
  698. trueppm_api/apps/workspace/backfill.py +111 -0
  699. trueppm_api/apps/workspace/export.py +254 -0
  700. trueppm_api/apps/workspace/migrations/0001_initial.py +326 -0
  701. trueppm_api/apps/workspace/migrations/0001_squashed_0014_workspacemembership_availability_effective_from_and_more.py +829 -0
  702. trueppm_api/apps/workspace/migrations/0002_remove_workspace_fiscal_year_start_and_more.py +85 -0
  703. trueppm_api/apps/workspace/migrations/0003_workspaceexportjob.py +73 -0
  704. trueppm_api/apps/workspace/migrations/0004_alter_workspaceinvite_status.py +27 -0
  705. trueppm_api/apps/workspace/migrations/0005_workspace_iteration_label_and_more.py +26 -0
  706. trueppm_api/apps/workspace/migrations/0006_alter_groupmembership_unique_together_and_more.py +45 -0
  707. trueppm_api/apps/workspace/migrations/0007_workspace_public_sharing_override_policy.py +21 -0
  708. trueppm_api/apps/workspace/migrations/0008_workspace_mc_history_attribution_audience_and_more.py +44 -0
  709. trueppm_api/apps/workspace/migrations/0009_workspace_methodology_and_more.py +186 -0
  710. trueppm_api/apps/workspace/migrations/0010_workspace_logo.py +38 -0
  711. trueppm_api/apps/workspace/migrations/0011_historicalworkspace_task_duration_change_percent_override_policy_and_more.py +56 -0
  712. trueppm_api/apps/workspace/migrations/0012_historicalworkspace_allowed_attachment_types_and_more.py +64 -0
  713. trueppm_api/apps/workspace/migrations/0013_auditevent.py +70 -0
  714. trueppm_api/apps/workspace/migrations/0014_workspacemembership_availability_effective_from_and_more.py +39 -0
  715. trueppm_api/apps/workspace/migrations/0015_squashed_0027_release_0_4.py +199 -0
  716. trueppm_api/apps/workspace/migrations/0015_trash_restore_1113.py +34 -0
  717. trueppm_api/apps/workspace/migrations/0016_historicalworkspace_calendar_and_more.py +55 -0
  718. trueppm_api/apps/workspace/migrations/0017_historicalworkspace_estimation_scale_and_more.py +38 -0
  719. trueppm_api/apps/workspace/migrations/0018_historicalworkspace_feedback_enabled_and_more.py +32 -0
  720. trueppm_api/apps/workspace/migrations/0019_historicalworkspace_mcp_enabled_and_more.py +22 -0
  721. trueppm_api/apps/workspace/migrations/0020_viewer_ordinal_one.py +34 -0
  722. trueppm_api/apps/workspace/migrations/0021_group_sync_seq_groupmembership_sync_seq_and_more.py +27 -0
  723. trueppm_api/apps/workspace/migrations/0022_historicalworkspace_sprint_picker_ready_only_default_and_more.py +22 -0
  724. trueppm_api/apps/workspace/migrations/0023_alter_auditevent_event_type.py +32 -0
  725. trueppm_api/apps/workspace/migrations/0024_alter_auditevent_event_type.py +33 -0
  726. trueppm_api/apps/workspace/migrations/0025_alter_auditevent_event_type.py +36 -0
  727. trueppm_api/apps/workspace/migrations/0026_alter_auditevent_event_type.py +37 -0
  728. trueppm_api/apps/workspace/migrations/0027_alter_auditevent_event_type.py +42 -0
  729. trueppm_api/apps/workspace/migrations/__init__.py +0 -0
  730. trueppm_api/apps/workspace/models.py +857 -0
  731. trueppm_api/apps/workspace/permissions.py +187 -0
  732. trueppm_api/apps/workspace/serializers.py +590 -0
  733. trueppm_api/apps/workspace/services.py +967 -0
  734. trueppm_api/apps/workspace/signals.py +37 -0
  735. trueppm_api/apps/workspace/tasks.py +616 -0
  736. trueppm_api/apps/workspace/urls.py +113 -0
  737. trueppm_api/apps/workspace/views.py +1581 -0
  738. trueppm_api/asgi.py +49 -0
  739. trueppm_api/celery.py +40 -0
  740. trueppm_api/core/__init__.py +0 -0
  741. trueppm_api/core/admin_site.py +206 -0
  742. trueppm_api/core/auth_views.py +934 -0
  743. trueppm_api/core/constant_time.py +51 -0
  744. trueppm_api/core/csp.py +54 -0
  745. trueppm_api/core/db.py +87 -0
  746. trueppm_api/core/db_session.py +37 -0
  747. trueppm_api/core/demo_read_only.py +314 -0
  748. trueppm_api/core/exception_handlers.py +157 -0
  749. trueppm_api/core/export_downloads.py +56 -0
  750. trueppm_api/core/extension_providers.py +56 -0
  751. trueppm_api/core/extension_signals.py +147 -0
  752. trueppm_api/core/idempotent.py +260 -0
  753. trueppm_api/core/metadata.py +42 -0
  754. trueppm_api/core/middleware.py +51 -0
  755. trueppm_api/core/openapi.py +1221 -0
  756. trueppm_api/core/password_reset.py +513 -0
  757. trueppm_api/core/protect_conflict.py +100 -0
  758. trueppm_api/core/ratelimit.py +148 -0
  759. trueppm_api/core/redis_throttle.py +82 -0
  760. trueppm_api/core/refresh_cookie_policy.py +156 -0
  761. trueppm_api/core/request_body.py +86 -0
  762. trueppm_api/core/security_checks.py +1034 -0
  763. trueppm_api/core/storage_config.py +105 -0
  764. trueppm_api/core/text_decode.py +168 -0
  765. trueppm_api/core/throttling.py +514 -0
  766. trueppm_api/core/valkey.py +214 -0
  767. trueppm_api/core/valkey_cache.py +66 -0
  768. trueppm_api/core/valkey_checks.py +104 -0
  769. trueppm_api/core/valkey_config.py +39 -0
  770. trueppm_api/core/worker_broker_wait.py +149 -0
  771. trueppm_api/core/worker_heartbeat.py +134 -0
  772. trueppm_api/core/worker_selfheal.py +205 -0
  773. trueppm_api/fields.py +36 -0
  774. trueppm_api/permissions.py +30 -0
  775. trueppm_api/py.typed +0 -0
  776. trueppm_api/routing.py +11 -0
  777. trueppm_api/settings/__init__.py +0 -0
  778. trueppm_api/settings/base.py +2605 -0
  779. trueppm_api/settings/dev.py +296 -0
  780. trueppm_api/settings/prod.py +265 -0
  781. trueppm_api/urls.py +217 -0
  782. trueppm_api/workflows/__init__.py +38 -0
  783. trueppm_api/workflows/backends/__init__.py +6 -0
  784. trueppm_api/workflows/backends/default.py +297 -0
  785. trueppm_api/workflows/consumers/__init__.py +11 -0
  786. trueppm_api/workflows/consumers/requeue_failed_task.py +65 -0
  787. trueppm_api/workflows/interface.py +148 -0
  788. trueppm_api/workflows/registry.py +106 -0
  789. trueppm_api/workflows/services.py +90 -0
  790. trueppm_api/wsgi.py +11 -0
  791. trueppm_api-0.4.0.dist-info/METADATA +273 -0
  792. trueppm_api-0.4.0.dist-info/RECORD +799 -0
  793. trueppm_api-0.4.0.dist-info/WHEEL +4 -0
  794. trueppm_api-0.4.0.dist-info/licenses/LICENSE +201 -0
  795. trueppm_api-0.4.0.dist-info/licenses/NOTICE +7 -0
  796. trueppm_api-0.4.0.dist-info/licenses/NOTICES +104 -0
  797. trueppm_api-0.4.0.dist-info/licenses/licenses/GPL-3.0.txt +674 -0
  798. trueppm_api-0.4.0.dist-info/licenses/licenses/LGPL-3.0.txt +165 -0
  799. trueppm_api-0.4.0.dist-info/licenses/licenses/MPL-2.0.txt +373 -0
@@ -0,0 +1,4278 @@
1
+ {
2
+ "schema_version": "2.1",
3
+ "program": {
4
+ "slug": "atlas-platform-launch",
5
+ "name": "Atlas Platform Launch",
6
+ "description": "Fictional B2B SaaS launch program — the hybrid bridge demo. One program, three projects spanning agile, waterfall, and hybrid delivery.",
7
+ "methodology": "HYBRID",
8
+ "color": "#2E5AAC",
9
+ "lead": "alex",
10
+ "backlog_items": [
11
+ {
12
+ "slug": "scim-provisioning",
13
+ "title": "SCIM provisioning for enterprise tenants",
14
+ "description": "Three design-partner customers asked for automated user provisioning from their identity provider before rollout.",
15
+ "item_type": "feature",
16
+ "tags": [
17
+ "customer-request",
18
+ "identity"
19
+ ],
20
+ "priority_rank": 1,
21
+ "story_points": 13,
22
+ "created_by": "priya",
23
+ "created_at": "A-35T10:00"
24
+ },
25
+ {
26
+ "slug": "usage-alerts",
27
+ "title": "Usage alerts at 80% of plan",
28
+ "item_type": "story",
29
+ "tags": [
30
+ "customer-request",
31
+ "billing"
32
+ ],
33
+ "priority_rank": 2,
34
+ "story_points": 5,
35
+ "created_by": "jordan",
36
+ "created_at": "A-28T14:00"
37
+ },
38
+ {
39
+ "slug": "invoice-csv-export",
40
+ "title": "CSV export of invoices",
41
+ "item_type": "story",
42
+ "tags": [
43
+ "billing"
44
+ ],
45
+ "priority_rank": 3,
46
+ "story_points": 3,
47
+ "created_by": "nadia",
48
+ "created_at": "A-20T11:00"
49
+ },
50
+ {
51
+ "slug": "webhook-secret-rotation",
52
+ "title": "Webhook signing-secret rotation",
53
+ "item_type": "spike",
54
+ "tags": [
55
+ "security"
56
+ ],
57
+ "priority_rank": 4,
58
+ "story_points": 2,
59
+ "created_by": "tom",
60
+ "created_at": "A-9T16:00"
61
+ },
62
+ {
63
+ "slug": "dunning-notice-copy",
64
+ "title": "Dunning notice copy",
65
+ "item_type": "story",
66
+ "status": "pulled",
67
+ "pulled_to": "platform-core:4.10",
68
+ "pulled_by": "priya",
69
+ "pulled_at": "A-20T09:30",
70
+ "tags": [
71
+ "billing"
72
+ ],
73
+ "story_points": 2,
74
+ "created_by": "jordan",
75
+ "created_at": "A-24T15:00"
76
+ },
77
+ {
78
+ "slug": "backfill-tool",
79
+ "title": "Backfill tool for warehouse schema churn",
80
+ "item_type": "story",
81
+ "status": "pulled",
82
+ "pulled_to": "platform-core:3.4",
83
+ "pulled_by": "jordan",
84
+ "pulled_at": "A-3T09:25",
85
+ "tags": [
86
+ "data"
87
+ ],
88
+ "story_points": 5,
89
+ "created_by": "yuki",
90
+ "created_at": "A-12T10:00"
91
+ },
92
+ {
93
+ "slug": "multi-jurisdiction-tax",
94
+ "title": "Multi-jurisdiction tax",
95
+ "description": "Archived by the scope decision: multi-jurisdiction tax moves out of 1.0 rather than being deferred inside it.",
96
+ "item_type": "feature",
97
+ "status": "archived",
98
+ "tags": [
99
+ "billing",
100
+ "out-of-1.0"
101
+ ],
102
+ "story_points": 21,
103
+ "created_by": "jordan",
104
+ "created_at": "A-45T10:00"
105
+ },
106
+ {
107
+ "slug": "partner-referral-tracking",
108
+ "title": "Partner referral tracking",
109
+ "description": "Rejected for launch: the partner program starts after GA.",
110
+ "item_type": "feature",
111
+ "status": "archived",
112
+ "tags": [
113
+ "gtm"
114
+ ],
115
+ "created_by": "clara",
116
+ "created_at": "A-25T13:00"
117
+ }
118
+ ],
119
+ "ceremonies": [
120
+ {
121
+ "name": "Program Sync",
122
+ "cadence_type": "weekly",
123
+ "cadence_day": "tuesday",
124
+ "cadence_time": "10:00",
125
+ "duration_minutes": 30,
126
+ "owner_role": "Program Manager"
127
+ },
128
+ {
129
+ "name": "Cross-team Dependency Review",
130
+ "cadence_type": "biweekly",
131
+ "cadence_day": "wednesday",
132
+ "cadence_time": "14:00",
133
+ "duration_minutes": 45,
134
+ "owner_role": "Delivery Lead"
135
+ },
136
+ {
137
+ "name": "Steering Committee",
138
+ "cadence_type": "monthly",
139
+ "cadence_day": "1st-thursday",
140
+ "cadence_time": "15:00",
141
+ "duration_minutes": 60,
142
+ "owner_role": "Executive Sponsor"
143
+ },
144
+ {
145
+ "name": "Launch Readiness Review",
146
+ "cadence_type": "on_milestone",
147
+ "duration_minutes": 90,
148
+ "owner_role": "Program Manager"
149
+ }
150
+ ],
151
+ "agent_actions": [
152
+ {
153
+ "at": "A-5T09:00",
154
+ "principal": "sam",
155
+ "action": "get_program_schedule",
156
+ "method": "GET",
157
+ "capability": "mcp:read",
158
+ "project": "platform-core",
159
+ "object_type": "program",
160
+ "verdict": "allowed",
161
+ "summary": "Read the Atlas program schedule across Platform Core, Migration Tooling and GTM Readiness."
162
+ },
163
+ {
164
+ "at": "A-5T09:02",
165
+ "principal": "sam",
166
+ "action": "get_critical_path",
167
+ "method": "GET",
168
+ "capability": "mcp:read",
169
+ "object": "migration-tooling:3.2",
170
+ "verdict": "allowed",
171
+ "summary": "Answered \"what drives the cutover date?\": Platform Core 2.1 Tenant model -> Migration 2.1 ETL framework (FS +5 days) -> 3.1 Dry-run -> 3.2 Performance tuning -> cutover. The dry-run re-plan moved phases 3-5 out 6-7 days, so 3.2 now carries zero total float: any further slip in the dry-run moves the cutover milestone day for day."
172
+ },
173
+ {
174
+ "at": "A-4T14:30",
175
+ "principal": "priya",
176
+ "action": "get_task",
177
+ "method": "GET",
178
+ "capability": "mcp:read",
179
+ "object": "platform-core:5.3",
180
+ "verdict": "allowed",
181
+ "summary": "Read Digest scheduler: blocked four days on vendor DKIM verification, unblocked, back in progress."
182
+ },
183
+ {
184
+ "at": "A-3T10:15",
185
+ "principal": "jordan",
186
+ "action": "list_risks",
187
+ "method": "GET",
188
+ "capability": "mcp:read",
189
+ "project": "platform-core",
190
+ "object_type": "risk",
191
+ "verdict": "allowed",
192
+ "summary": "Listed the open and mitigating risks on Platform Core."
193
+ },
194
+ {
195
+ "at": "A-2T15:20",
196
+ "principal": "sam",
197
+ "action": "update_task",
198
+ "method": "PATCH",
199
+ "capability": "mcp:read",
200
+ "object": "migration-tooling:3.2",
201
+ "verdict": "refused",
202
+ "refusal_reason": "policy",
203
+ "refusal_constraint": "capability_scope",
204
+ "projected_impact": {
205
+ "requested_change": "planned_start 6 working days earlier",
206
+ "violates": "FS dependency on 3.1 Dry-run migration",
207
+ "critical_path": true
208
+ },
209
+ "summary": "Refused a write: the agent tried to pull Performance tuning's start forward six working days, ahead of its Dry-run predecessor. The token is read-only, and the change would have broken a finish-to-start dependency on the critical path."
210
+ },
211
+ {
212
+ "at": "A-1T08:45",
213
+ "principal": "alex",
214
+ "action": "get_project_overview",
215
+ "method": "GET",
216
+ "capability": "mcp:read",
217
+ "project": "platform-core",
218
+ "object_type": "project",
219
+ "verdict": "allowed",
220
+ "summary": "Read the Platform Core overview: Sprint 5 progress and the milestone forecast."
221
+ }
222
+ ]
223
+ },
224
+ "accounts": [
225
+ {
226
+ "slug": "alex",
227
+ "username": "atlas-alex",
228
+ "display_name": "Alex Rivera",
229
+ "email": "alex@atlas.example",
230
+ "role": "OWNER"
231
+ },
232
+ {
233
+ "slug": "priya",
234
+ "username": "atlas-priya",
235
+ "display_name": "Priya Nair",
236
+ "email": "priya@atlas.example",
237
+ "role": "ADMIN"
238
+ },
239
+ {
240
+ "slug": "jordan",
241
+ "username": "atlas-jordan",
242
+ "display_name": "Jordan Blake",
243
+ "email": "jordan@atlas.example",
244
+ "role": "ADMIN"
245
+ },
246
+ {
247
+ "slug": "sam",
248
+ "username": "atlas-sam",
249
+ "display_name": "Sam Okafor",
250
+ "email": "sam@atlas.example",
251
+ "role": "SCHEDULER"
252
+ },
253
+ {
254
+ "slug": "mei",
255
+ "username": "atlas-mei",
256
+ "display_name": "Mei Tanaka",
257
+ "email": "mei@atlas.example",
258
+ "role": "MEMBER"
259
+ },
260
+ {
261
+ "slug": "diego",
262
+ "username": "atlas-diego",
263
+ "display_name": "Diego Santos",
264
+ "email": "diego@atlas.example",
265
+ "role": "MEMBER"
266
+ },
267
+ {
268
+ "slug": "nadia",
269
+ "username": "atlas-nadia",
270
+ "display_name": "Nadia Hassan",
271
+ "email": "nadia@atlas.example",
272
+ "role": "MEMBER"
273
+ },
274
+ {
275
+ "slug": "tom",
276
+ "username": "atlas-tom",
277
+ "display_name": "Tom Becker",
278
+ "email": "tom@atlas.example",
279
+ "role": "MEMBER"
280
+ },
281
+ {
282
+ "slug": "yuki",
283
+ "username": "atlas-yuki",
284
+ "display_name": "Yuki Sato",
285
+ "email": "yuki@atlas.example",
286
+ "role": "MEMBER"
287
+ },
288
+ {
289
+ "slug": "omar",
290
+ "username": "atlas-omar",
291
+ "display_name": "Omar Aziz",
292
+ "email": "omar@atlas.example",
293
+ "role": "MEMBER"
294
+ },
295
+ {
296
+ "slug": "lena",
297
+ "username": "atlas-lena",
298
+ "display_name": "Lena Vogel",
299
+ "email": "lena@atlas.example",
300
+ "role": "MEMBER"
301
+ },
302
+ {
303
+ "slug": "raj",
304
+ "username": "atlas-raj",
305
+ "display_name": "Raj Mehta",
306
+ "email": "raj@atlas.example",
307
+ "role": "MEMBER"
308
+ },
309
+ {
310
+ "slug": "clara",
311
+ "username": "atlas-clara",
312
+ "display_name": "Clara Mendes",
313
+ "email": "clara@atlas.example",
314
+ "role": "MEMBER"
315
+ },
316
+ {
317
+ "slug": "ivan",
318
+ "username": "atlas-ivan",
319
+ "display_name": "Ivan Petrov",
320
+ "email": "ivan@atlas.example",
321
+ "role": "MEMBER"
322
+ },
323
+ {
324
+ "slug": "ada",
325
+ "username": "atlas-ada",
326
+ "display_name": "Ada Boyega",
327
+ "email": "ada@atlas.example",
328
+ "role": "VIEWER"
329
+ },
330
+ {
331
+ "slug": "visitor",
332
+ "username": "atlas-visitor",
333
+ "display_name": "Demo Visitor",
334
+ "email": "visitor@atlas.example",
335
+ "role": "MEMBER"
336
+ }
337
+ ],
338
+ "calendars": [
339
+ {
340
+ "slug": "standard",
341
+ "name": "Atlas Standard (5-day)",
342
+ "working_days": 31,
343
+ "hours_per_day": 8.0,
344
+ "exceptions": [
345
+ {
346
+ "exc_start": "A-45",
347
+ "exc_end": "A-43",
348
+ "description": "Diego — PTO"
349
+ },
350
+ {
351
+ "exc_start": "A+67",
352
+ "exc_end": "A+73",
353
+ "description": "Company shutdown — annual office closure"
354
+ }
355
+ ]
356
+ },
357
+ {
358
+ "slug": "gtm-regional",
359
+ "name": "GTM Regional (5-day, holidays)",
360
+ "working_days": 31,
361
+ "hours_per_day": 7.5,
362
+ "exceptions": [
363
+ {
364
+ "exc_start": "A-1",
365
+ "exc_end": "A+2",
366
+ "description": "Clara — PTO (vacation)"
367
+ },
368
+ {
369
+ "exc_start": "A-30",
370
+ "exc_end": "A-28",
371
+ "description": "Clara — PTO (conference)"
372
+ }
373
+ ]
374
+ }
375
+ ],
376
+ "resources": [
377
+ {
378
+ "slug": "alex",
379
+ "name": "Alex Rivera",
380
+ "job_role": "Program Manager",
381
+ "max_units": 0.5,
382
+ "calendar": "standard",
383
+ "account": "alex"
384
+ },
385
+ {
386
+ "slug": "priya",
387
+ "name": "Priya Nair",
388
+ "job_role": "Engineering Lead",
389
+ "max_units": 1.0,
390
+ "calendar": "standard",
391
+ "account": "priya",
392
+ "skills": [
393
+ {
394
+ "name": "Security review",
395
+ "proficiency": "expert"
396
+ },
397
+ {
398
+ "name": "Python",
399
+ "proficiency": "expert"
400
+ }
401
+ ]
402
+ },
403
+ {
404
+ "slug": "jordan",
405
+ "name": "Jordan Blake",
406
+ "job_role": "Product Owner",
407
+ "max_units": 1.0,
408
+ "calendar": "standard",
409
+ "account": "jordan"
410
+ },
411
+ {
412
+ "slug": "sam",
413
+ "name": "Sam Okafor",
414
+ "job_role": "Project Scheduler",
415
+ "max_units": 1.0,
416
+ "calendar": "standard",
417
+ "account": "sam"
418
+ },
419
+ {
420
+ "slug": "mei",
421
+ "name": "Mei Tanaka",
422
+ "job_role": "Senior Engineer",
423
+ "max_units": 1.0,
424
+ "calendar": "standard",
425
+ "account": "mei",
426
+ "skills": [
427
+ {
428
+ "name": "OAuth and OIDC",
429
+ "proficiency": "expert"
430
+ },
431
+ {
432
+ "name": "Python",
433
+ "proficiency": "expert"
434
+ }
435
+ ]
436
+ },
437
+ {
438
+ "slug": "diego",
439
+ "name": "Diego Santos",
440
+ "job_role": "Senior Engineer",
441
+ "max_units": 1.0,
442
+ "calendar": "standard",
443
+ "account": "diego",
444
+ "skills": [
445
+ {
446
+ "name": "Email delivery",
447
+ "proficiency": "expert"
448
+ },
449
+ {
450
+ "name": "Python",
451
+ "proficiency": "intermediate"
452
+ }
453
+ ]
454
+ },
455
+ {
456
+ "slug": "nadia",
457
+ "name": "Nadia Hassan",
458
+ "job_role": "Engineer",
459
+ "max_units": 1.0,
460
+ "calendar": "standard",
461
+ "account": "nadia",
462
+ "skills": [
463
+ {
464
+ "name": "Billing systems",
465
+ "proficiency": "intermediate"
466
+ },
467
+ {
468
+ "name": "Python",
469
+ "proficiency": "intermediate"
470
+ }
471
+ ]
472
+ },
473
+ {
474
+ "slug": "tom",
475
+ "name": "Tom Becker",
476
+ "job_role": "Engineer",
477
+ "max_units": 1.0,
478
+ "calendar": "standard",
479
+ "account": "tom",
480
+ "skills": [
481
+ {
482
+ "name": "Payments",
483
+ "proficiency": "beginner"
484
+ },
485
+ {
486
+ "name": "Python",
487
+ "proficiency": "intermediate"
488
+ }
489
+ ]
490
+ },
491
+ {
492
+ "slug": "yuki",
493
+ "name": "Yuki Sato",
494
+ "job_role": "Data Engineer",
495
+ "max_units": 1.0,
496
+ "calendar": "standard",
497
+ "account": "yuki",
498
+ "skills": [
499
+ {
500
+ "name": "Data pipelines",
501
+ "proficiency": "expert"
502
+ },
503
+ {
504
+ "name": "SQL",
505
+ "proficiency": "expert"
506
+ }
507
+ ]
508
+ },
509
+ {
510
+ "slug": "omar",
511
+ "name": "Omar Aziz",
512
+ "job_role": "Data Engineer",
513
+ "max_units": 1.0,
514
+ "calendar": "standard",
515
+ "account": "omar",
516
+ "skills": [
517
+ {
518
+ "name": "Data pipelines",
519
+ "proficiency": "intermediate"
520
+ },
521
+ {
522
+ "name": "SQL",
523
+ "proficiency": "intermediate"
524
+ }
525
+ ]
526
+ },
527
+ {
528
+ "slug": "lena",
529
+ "name": "Lena Vogel",
530
+ "job_role": "QA Engineer",
531
+ "max_units": 1.0,
532
+ "calendar": "standard",
533
+ "account": "lena",
534
+ "skills": [
535
+ {
536
+ "name": "Test automation",
537
+ "proficiency": "expert"
538
+ }
539
+ ]
540
+ },
541
+ {
542
+ "slug": "raj",
543
+ "name": "Raj Mehta",
544
+ "job_role": "DevOps Engineer",
545
+ "max_units": 0.8,
546
+ "calendar": "standard",
547
+ "account": "raj",
548
+ "skills": [
549
+ {
550
+ "name": "Kubernetes",
551
+ "proficiency": "expert"
552
+ }
553
+ ]
554
+ },
555
+ {
556
+ "slug": "clara",
557
+ "name": "Clara Mendes",
558
+ "job_role": "Content Strategist",
559
+ "max_units": 1.0,
560
+ "calendar": "gtm-regional",
561
+ "account": "clara",
562
+ "skills": [
563
+ {
564
+ "name": "Technical writing",
565
+ "proficiency": "expert"
566
+ }
567
+ ]
568
+ },
569
+ {
570
+ "slug": "ivan",
571
+ "name": "Ivan Petrov",
572
+ "job_role": "Solutions Architect",
573
+ "max_units": 0.2,
574
+ "calendar": "standard",
575
+ "account": "ivan"
576
+ },
577
+ {
578
+ "slug": "ada",
579
+ "name": "Ada Boyega",
580
+ "job_role": "Executive Sponsor",
581
+ "max_units": 0.1,
582
+ "calendar": "standard",
583
+ "account": "ada"
584
+ }
585
+ ],
586
+ "risks": [
587
+ {
588
+ "slug": "prog-cross-team-dependency",
589
+ "title": "Cross-team dependency stalls the critical path",
590
+ "description": "Platform Core API delays ripple into Migration and then the public launch.",
591
+ "status": "MITIGATING",
592
+ "probability": 4,
593
+ "impact": 5,
594
+ "category": "ORGANIZATIONAL",
595
+ "response": "MITIGATE",
596
+ "mitigation_due_date": "A+10",
597
+ "owner": "alex",
598
+ "tasks": [
599
+ "platform-core:2.1",
600
+ "migration-tooling:2.1",
601
+ "gtm-readiness:3"
602
+ ]
603
+ },
604
+ {
605
+ "slug": "prog-budget",
606
+ "title": "Program budget pressure",
607
+ "description": "A contractor rate increase threatens the back half of the program.",
608
+ "status": "OPEN",
609
+ "probability": 2,
610
+ "impact": 4,
611
+ "category": "EXTERNAL",
612
+ "response": "ACCEPT",
613
+ "owner": "ada",
614
+ "tasks": [
615
+ "platform-core:9"
616
+ ]
617
+ },
618
+ {
619
+ "slug": "prog-regulatory",
620
+ "title": "Regulatory sign-off gates billing + cutover",
621
+ "description": "A compliance review must clear before billing go-live and the production cutover.",
622
+ "status": "OPEN",
623
+ "probability": 2,
624
+ "impact": 5,
625
+ "category": "EXTERNAL",
626
+ "response": "MITIGATE",
627
+ "owner": "alex",
628
+ "tasks": [
629
+ "platform-core:4.1",
630
+ "migration-tooling:5.2"
631
+ ]
632
+ },
633
+ {
634
+ "slug": "prog-security-audit",
635
+ "title": "Third-party security audit findings on SSO",
636
+ "status": "MITIGATING",
637
+ "probability": 3,
638
+ "impact": 4,
639
+ "category": "TECHNICAL",
640
+ "response": "MITIGATE",
641
+ "mitigation_due_date": "A-25",
642
+ "owner": "priya",
643
+ "tasks": [
644
+ "platform-core:1.1"
645
+ ]
646
+ },
647
+ {
648
+ "slug": "prog-resource-contention",
649
+ "title": "Shared engineers contended across projects",
650
+ "status": "OPEN",
651
+ "probability": 4,
652
+ "impact": 3,
653
+ "category": "ORGANIZATIONAL",
654
+ "response": "MITIGATE",
655
+ "owner": "sam",
656
+ "tasks": [
657
+ "platform-core:3.1",
658
+ "gtm-readiness:2.1"
659
+ ]
660
+ },
661
+ {
662
+ "slug": "prog-exec-sponsor",
663
+ "title": "Executive sponsor transition mid-program",
664
+ "status": "OPEN",
665
+ "probability": 2,
666
+ "impact": 4,
667
+ "category": "ORGANIZATIONAL",
668
+ "response": "ACCEPT",
669
+ "owner": "ada",
670
+ "notes": "New sponsor onboarded; launch funding reconfirmed.",
671
+ "tasks": [
672
+ "gtm-readiness:1.3"
673
+ ]
674
+ }
675
+ ],
676
+ "projects": [
677
+ {
678
+ "slug": "platform-core",
679
+ "name": "Platform Core",
680
+ "code": "PLAT",
681
+ "description": "The agile build stream — the platform itself, delivered sprint by sprint.",
682
+ "methodology": "AGILE",
683
+ "start_date": "A-90",
684
+ "calendar": "standard",
685
+ "members": [
686
+ {
687
+ "account": "alex",
688
+ "role": "OWNER"
689
+ },
690
+ {
691
+ "account": "priya",
692
+ "role": "ADMIN"
693
+ },
694
+ {
695
+ "account": "sam",
696
+ "role": "SCHEDULER"
697
+ },
698
+ {
699
+ "account": "jordan",
700
+ "role": "MEMBER"
701
+ },
702
+ {
703
+ "account": "mei",
704
+ "role": "MEMBER"
705
+ },
706
+ {
707
+ "account": "diego",
708
+ "role": "MEMBER"
709
+ },
710
+ {
711
+ "account": "nadia",
712
+ "role": "MEMBER"
713
+ },
714
+ {
715
+ "account": "tom",
716
+ "role": "MEMBER"
717
+ },
718
+ {
719
+ "account": "yuki",
720
+ "role": "MEMBER"
721
+ },
722
+ {
723
+ "account": "omar",
724
+ "role": "MEMBER"
725
+ },
726
+ {
727
+ "account": "lena",
728
+ "role": "MEMBER"
729
+ },
730
+ {
731
+ "account": "ivan",
732
+ "role": "VIEWER"
733
+ },
734
+ {
735
+ "account": "ada",
736
+ "role": "VIEWER"
737
+ },
738
+ {
739
+ "account": "visitor",
740
+ "role": "MEMBER"
741
+ }
742
+ ],
743
+ "default_view": "BOARD",
744
+ "forecast_history": {
745
+ "days": 60,
746
+ "commitment_finish": "A+45",
747
+ "cpm_start": "A+38",
748
+ "cpm_end": "A+52",
749
+ "p50_start": "A+42",
750
+ "p50_end": "A+56",
751
+ "p80_start": "A+48",
752
+ "p80_end": "A+64",
753
+ "p95_start": "A+54",
754
+ "p95_end": "A+76",
755
+ "mc_iterations": 2000,
756
+ "completion_ratio": 0.5
757
+ },
758
+ "board_columns": [
759
+ {
760
+ "status": "BACKLOG",
761
+ "label": "Backlog",
762
+ "visible": true
763
+ },
764
+ {
765
+ "status": "NOT_STARTED",
766
+ "label": "To Do",
767
+ "visible": true
768
+ },
769
+ {
770
+ "status": "IN_PROGRESS",
771
+ "label": "In Progress",
772
+ "visible": true,
773
+ "wip_limit": 5,
774
+ "lanes": [
775
+ {
776
+ "key": "building",
777
+ "label": "Building"
778
+ },
779
+ {
780
+ "key": "blocked",
781
+ "label": "Blocked",
782
+ "wip_limit": 3
783
+ }
784
+ ]
785
+ },
786
+ {
787
+ "status": "REVIEW",
788
+ "label": "In Review",
789
+ "visible": true,
790
+ "wip_limit": 2
791
+ },
792
+ {
793
+ "status": "COMPLETE",
794
+ "label": "Done",
795
+ "visible": true
796
+ }
797
+ ],
798
+ "labels": [
799
+ {
800
+ "slug": "security",
801
+ "name": "Security",
802
+ "color": "rose",
803
+ "position": 0
804
+ },
805
+ {
806
+ "slug": "tech-debt",
807
+ "name": "Tech debt",
808
+ "color": "slate",
809
+ "position": 1
810
+ },
811
+ {
812
+ "slug": "customer-request",
813
+ "name": "Customer request",
814
+ "color": "blue",
815
+ "position": 2
816
+ },
817
+ {
818
+ "slug": "spike",
819
+ "name": "Spike",
820
+ "color": "purple",
821
+ "position": 3
822
+ },
823
+ {
824
+ "slug": "compliance",
825
+ "name": "Compliance",
826
+ "color": "amber",
827
+ "position": 4
828
+ }
829
+ ],
830
+ "tasks": [
831
+ {
832
+ "wbs_path": "1",
833
+ "name": "Identity & access",
834
+ "type": "epic",
835
+ "delivery_mode": "scrum",
836
+ "governance_class": "flow"
837
+ },
838
+ {
839
+ "wbs_path": "2",
840
+ "name": "Core API",
841
+ "type": "epic",
842
+ "delivery_mode": "scrum",
843
+ "governance_class": "flow"
844
+ },
845
+ {
846
+ "wbs_path": "3",
847
+ "name": "Data platform",
848
+ "type": "epic",
849
+ "delivery_mode": "scrum",
850
+ "governance_class": "flow"
851
+ },
852
+ {
853
+ "wbs_path": "4",
854
+ "name": "Billing",
855
+ "type": "epic",
856
+ "delivery_mode": "scrum",
857
+ "governance_class": "flow"
858
+ },
859
+ {
860
+ "wbs_path": "5",
861
+ "name": "Notifications",
862
+ "type": "epic",
863
+ "delivery_mode": "scrum",
864
+ "governance_class": "flow"
865
+ },
866
+ {
867
+ "wbs_path": "1.1",
868
+ "name": "SSO login",
869
+ "type": "story",
870
+ "status": "COMPLETE",
871
+ "percent_complete": 100.0,
872
+ "story_points": 5,
873
+ "parent_epic": "1",
874
+ "assignee": "mei",
875
+ "sprint": "pc-sprint-1",
876
+ "delivery_mode": "scrum",
877
+ "governance_class": "flow",
878
+ "labels": [
879
+ "security"
880
+ ],
881
+ "attachments": [
882
+ {
883
+ "external_url": "https://example.com/atlas/design/sso-oidc-flow",
884
+ "external_title": "SSO / OIDC flow design",
885
+ "is_pinned": true,
886
+ "uploaded_by": "mei"
887
+ },
888
+ {
889
+ "external_url": "https://example.com/atlas/security/csrf-finding-0142",
890
+ "external_title": "Security review finding SR-0142 (CSRF on callback)",
891
+ "uploaded_by": "priya"
892
+ }
893
+ ],
894
+ "dor": "ready"
895
+ },
896
+ {
897
+ "wbs_path": "1.2",
898
+ "name": "MFA enrollment",
899
+ "type": "story",
900
+ "status": "COMPLETE",
901
+ "percent_complete": 100.0,
902
+ "story_points": 5,
903
+ "parent_epic": "1",
904
+ "assignee": "diego",
905
+ "sprint": "pc-sprint-1",
906
+ "delivery_mode": "scrum",
907
+ "governance_class": "flow",
908
+ "labels": [
909
+ "security"
910
+ ],
911
+ "dor": "ready"
912
+ },
913
+ {
914
+ "wbs_path": "1.3",
915
+ "name": "Role management",
916
+ "type": "story",
917
+ "status": "COMPLETE",
918
+ "percent_complete": 100.0,
919
+ "story_points": 5,
920
+ "parent_epic": "1",
921
+ "assignee": "nadia",
922
+ "sprint": "pc-sprint-2",
923
+ "delivery_mode": "scrum",
924
+ "governance_class": "flow",
925
+ "dor": "ready"
926
+ },
927
+ {
928
+ "wbs_path": "1.4",
929
+ "name": "Session hardening",
930
+ "type": "story",
931
+ "status": "COMPLETE",
932
+ "percent_complete": 100.0,
933
+ "story_points": 5,
934
+ "parent_epic": "1",
935
+ "assignee": "mei",
936
+ "sprint": "pc-sprint-3",
937
+ "delivery_mode": "scrum",
938
+ "governance_class": "flow",
939
+ "dor": "ready"
940
+ },
941
+ {
942
+ "wbs_path": "1.5",
943
+ "name": "Audit log",
944
+ "type": "story",
945
+ "status": "COMPLETE",
946
+ "percent_complete": 100.0,
947
+ "story_points": 5,
948
+ "parent_epic": "1",
949
+ "assignee": "mei",
950
+ "sprint": "pc-sprint-5",
951
+ "delivery_mode": "scrum",
952
+ "governance_class": "flow",
953
+ "labels": [
954
+ "security",
955
+ "compliance"
956
+ ],
957
+ "links": [
958
+ {
959
+ "target": "1.1",
960
+ "link_type": "relates_to",
961
+ "note": "Audit log captures the authentication events emitted by SSO login."
962
+ }
963
+ ],
964
+ "acceptance_criteria": [
965
+ {
966
+ "text": "Every admin role change writes an entry with actor, before and after",
967
+ "met": true,
968
+ "met_by": "priya",
969
+ "met_at": "A-3T15:30"
970
+ },
971
+ {
972
+ "text": "Entries cannot be edited or deleted through the API",
973
+ "met": true,
974
+ "met_by": "priya",
975
+ "met_at": "A-3T15:30"
976
+ },
977
+ {
978
+ "text": "The log exports as CSV for the security review",
979
+ "met": true,
980
+ "met_by": "priya",
981
+ "met_at": "A-3T15:30"
982
+ }
983
+ ],
984
+ "dor": "ready"
985
+ },
986
+ {
987
+ "wbs_path": "1.6",
988
+ "name": "Service accounts",
989
+ "type": "story",
990
+ "status": "COMPLETE",
991
+ "percent_complete": 100.0,
992
+ "story_points": 5,
993
+ "parent_epic": "1",
994
+ "assignee": "diego",
995
+ "sprint": "pc-sprint-4",
996
+ "delivery_mode": "scrum",
997
+ "governance_class": "flow",
998
+ "dor": "ready"
999
+ },
1000
+ {
1001
+ "wbs_path": "1.7",
1002
+ "name": "Passwordless login",
1003
+ "type": "story",
1004
+ "status": "BACKLOG",
1005
+ "story_points": 8,
1006
+ "parent_epic": "1",
1007
+ "assignee": "mei",
1008
+ "sprint": "pc-sprint-6",
1009
+ "delivery_mode": "scrum",
1010
+ "governance_class": "flow",
1011
+ "assignments": [
1012
+ {
1013
+ "resource": "mei",
1014
+ "units": 0.6
1015
+ },
1016
+ {
1017
+ "resource": "diego",
1018
+ "units": 0.4
1019
+ }
1020
+ ]
1021
+ },
1022
+ {
1023
+ "wbs_path": "1.8",
1024
+ "name": "Access reviews",
1025
+ "type": "story",
1026
+ "status": "BACKLOG",
1027
+ "story_points": 5,
1028
+ "parent_epic": "1",
1029
+ "assignee": "diego",
1030
+ "sprint": "pc-sprint-7",
1031
+ "delivery_mode": "scrum",
1032
+ "governance_class": "flow"
1033
+ },
1034
+ {
1035
+ "wbs_path": "1.9",
1036
+ "name": "Delegated admin",
1037
+ "type": "story",
1038
+ "status": "BACKLOG",
1039
+ "story_points": 5,
1040
+ "parent_epic": "1",
1041
+ "assignee": "nadia",
1042
+ "sprint": "pc-sprint-8",
1043
+ "delivery_mode": "scrum",
1044
+ "governance_class": "flow"
1045
+ },
1046
+ {
1047
+ "wbs_path": "1.10",
1048
+ "name": "Fallback IdP spike",
1049
+ "type": "story",
1050
+ "status": "COMPLETE",
1051
+ "percent_complete": 100.0,
1052
+ "story_points": 3,
1053
+ "parent_epic": "1",
1054
+ "assignee": "mei",
1055
+ "sprint": "pc-sprint-5",
1056
+ "delivery_mode": "scrum",
1057
+ "governance_class": "flow",
1058
+ "attachments": [
1059
+ {
1060
+ "external_url": "https://example.com/atlas/spikes/fallback-idp",
1061
+ "external_title": "Fallback IdP spike — findings",
1062
+ "uploaded_by": "mei"
1063
+ }
1064
+ ],
1065
+ "dor": "ready"
1066
+ },
1067
+ {
1068
+ "wbs_path": "2.1",
1069
+ "name": "Tenant model",
1070
+ "type": "story",
1071
+ "status": "COMPLETE",
1072
+ "percent_complete": 100.0,
1073
+ "story_points": 8,
1074
+ "parent_epic": "2",
1075
+ "assignee": "omar",
1076
+ "sprint": "pc-sprint-1",
1077
+ "delivery_mode": "scrum",
1078
+ "governance_class": "flow",
1079
+ "dor": "ready"
1080
+ },
1081
+ {
1082
+ "wbs_path": "2.2",
1083
+ "name": "Rate limiting",
1084
+ "type": "story",
1085
+ "status": "COMPLETE",
1086
+ "percent_complete": 100.0,
1087
+ "story_points": 5,
1088
+ "parent_epic": "2",
1089
+ "assignee": "tom",
1090
+ "sprint": "pc-sprint-2",
1091
+ "delivery_mode": "scrum",
1092
+ "governance_class": "flow",
1093
+ "dor": "ready"
1094
+ },
1095
+ {
1096
+ "wbs_path": "2.3",
1097
+ "name": "Webhook delivery",
1098
+ "type": "story",
1099
+ "status": "COMPLETE",
1100
+ "percent_complete": 100.0,
1101
+ "story_points": 8,
1102
+ "parent_epic": "2",
1103
+ "assignee": "diego",
1104
+ "sprint": "pc-sprint-2",
1105
+ "delivery_mode": "scrum",
1106
+ "governance_class": "flow",
1107
+ "dor": "ready"
1108
+ },
1109
+ {
1110
+ "wbs_path": "2.4",
1111
+ "name": "API key rotation",
1112
+ "type": "story",
1113
+ "status": "COMPLETE",
1114
+ "percent_complete": 100.0,
1115
+ "story_points": 2,
1116
+ "parent_epic": "2",
1117
+ "assignee": "tom",
1118
+ "sprint": "pc-sprint-2",
1119
+ "delivery_mode": "scrum",
1120
+ "governance_class": "flow",
1121
+ "dor": "ready"
1122
+ },
1123
+ {
1124
+ "wbs_path": "2.5",
1125
+ "name": "OpenAPI export",
1126
+ "type": "story",
1127
+ "status": "COMPLETE",
1128
+ "percent_complete": 100.0,
1129
+ "story_points": 8,
1130
+ "parent_epic": "2",
1131
+ "assignee": "yuki",
1132
+ "sprint": "pc-sprint-3",
1133
+ "delivery_mode": "scrum",
1134
+ "governance_class": "flow",
1135
+ "dor": "ready"
1136
+ },
1137
+ {
1138
+ "wbs_path": "2.6",
1139
+ "name": "Tenant data cutover hook",
1140
+ "type": "tech_debt",
1141
+ "status": "ON_HOLD",
1142
+ "story_points": 5,
1143
+ "parent_epic": "2",
1144
+ "assignee": "omar",
1145
+ "sprint": "pc-sprint-5",
1146
+ "delivery_mode": "scrum",
1147
+ "governance_class": "flow",
1148
+ "labels": [
1149
+ "tech-debt"
1150
+ ],
1151
+ "links": [
1152
+ {
1153
+ "target": "migration-tooling:3.2",
1154
+ "link_type": "relates_to",
1155
+ "note": "Gated on the migration team's Performance tuning — the cross-project predecessor that must land before this hook can cut over."
1156
+ }
1157
+ ],
1158
+ "notes": "Committed to the active sprint but gated on the migration team's Performance tuning task — a cross-project predecessor whose finish lands after this sprint closes. Demonstrates the dependency-reality at-risk indicator (#372)."
1159
+ },
1160
+ {
1161
+ "wbs_path": "2.7",
1162
+ "name": "Idempotency keys",
1163
+ "type": "story",
1164
+ "status": "COMPLETE",
1165
+ "percent_complete": 100.0,
1166
+ "story_points": 2,
1167
+ "parent_epic": "2",
1168
+ "assignee": "tom",
1169
+ "sprint": "pc-sprint-4",
1170
+ "delivery_mode": "scrum",
1171
+ "governance_class": "flow",
1172
+ "dor": "ready"
1173
+ },
1174
+ {
1175
+ "wbs_path": "2.8",
1176
+ "name": "Webhook retries dashboard",
1177
+ "type": "story",
1178
+ "status": "BACKLOG",
1179
+ "story_points": 3,
1180
+ "parent_epic": "2",
1181
+ "assignee": "tom",
1182
+ "sprint": "pc-sprint-6",
1183
+ "delivery_mode": "scrum",
1184
+ "governance_class": "flow"
1185
+ },
1186
+ {
1187
+ "wbs_path": "2.9",
1188
+ "name": "API usage analytics",
1189
+ "type": "story",
1190
+ "status": "BACKLOG",
1191
+ "story_points": 8,
1192
+ "parent_epic": "2",
1193
+ "assignee": "omar",
1194
+ "sprint": "pc-sprint-7",
1195
+ "delivery_mode": "scrum",
1196
+ "governance_class": "flow"
1197
+ },
1198
+ {
1199
+ "wbs_path": "2.10",
1200
+ "name": "Partner API keys",
1201
+ "type": "story",
1202
+ "status": "BACKLOG",
1203
+ "story_points": 5,
1204
+ "parent_epic": "2",
1205
+ "assignee": "diego",
1206
+ "sprint": "pc-sprint-8",
1207
+ "delivery_mode": "scrum",
1208
+ "governance_class": "flow"
1209
+ },
1210
+ {
1211
+ "wbs_path": "3.1",
1212
+ "name": "Event pipeline",
1213
+ "type": "story",
1214
+ "status": "COMPLETE",
1215
+ "percent_complete": 100.0,
1216
+ "story_points": 8,
1217
+ "parent_epic": "3",
1218
+ "assignee": "yuki",
1219
+ "sprint": "pc-sprint-1",
1220
+ "delivery_mode": "scrum",
1221
+ "governance_class": "flow",
1222
+ "dor": "ready"
1223
+ },
1224
+ {
1225
+ "wbs_path": "3.2",
1226
+ "name": "Warehouse sync",
1227
+ "type": "story",
1228
+ "status": "COMPLETE",
1229
+ "percent_complete": 100.0,
1230
+ "story_points": 8,
1231
+ "parent_epic": "3",
1232
+ "assignee": "omar",
1233
+ "sprint": "pc-sprint-2",
1234
+ "delivery_mode": "scrum",
1235
+ "governance_class": "flow",
1236
+ "dor": "ready"
1237
+ },
1238
+ {
1239
+ "wbs_path": "3.3",
1240
+ "name": "Schema registry",
1241
+ "type": "story",
1242
+ "status": "COMPLETE",
1243
+ "percent_complete": 100.0,
1244
+ "story_points": 8,
1245
+ "parent_epic": "3",
1246
+ "assignee": "yuki",
1247
+ "sprint": "pc-sprint-3",
1248
+ "delivery_mode": "scrum",
1249
+ "governance_class": "flow",
1250
+ "dor": "ready"
1251
+ },
1252
+ {
1253
+ "wbs_path": "3.4",
1254
+ "name": "Backfill tool",
1255
+ "type": "story",
1256
+ "status": "IN_PROGRESS",
1257
+ "percent_complete": 30.0,
1258
+ "story_points": 8,
1259
+ "remaining_points": 6,
1260
+ "parent_epic": "3",
1261
+ "assignee": "yuki",
1262
+ "sprint": "pc-sprint-5",
1263
+ "delivery_mode": "scrum",
1264
+ "governance_class": "flow",
1265
+ "attachments": [
1266
+ {
1267
+ "external_url": "https://example.com/atlas/runbooks/warehouse-backfill",
1268
+ "external_title": "Warehouse backfill runbook",
1269
+ "uploaded_by": "yuki"
1270
+ }
1271
+ ],
1272
+ "assignments": [
1273
+ {
1274
+ "resource": "yuki",
1275
+ "units": 0.8
1276
+ },
1277
+ {
1278
+ "resource": "ivan",
1279
+ "units": 0.2
1280
+ }
1281
+ ],
1282
+ "acceptance_criteria": [
1283
+ {
1284
+ "text": "Backfills one tenant at a time without locking the warehouse"
1285
+ },
1286
+ {
1287
+ "text": "Re-running a backfill never duplicates rows",
1288
+ "given": "a backfill that already completed for a tenant",
1289
+ "when": "it runs again after a schema change",
1290
+ "then": "no row is written twice"
1291
+ },
1292
+ {
1293
+ "text": "Progress resumes after a worker restart"
1294
+ }
1295
+ ],
1296
+ "skill_requirements": [
1297
+ {
1298
+ "skill": "Data pipelines",
1299
+ "min_proficiency": "intermediate"
1300
+ }
1301
+ ],
1302
+ "dor": "ready"
1303
+ },
1304
+ {
1305
+ "wbs_path": "3.5",
1306
+ "name": "PII scrubber",
1307
+ "type": "story",
1308
+ "status": "COMPLETE",
1309
+ "percent_complete": 100.0,
1310
+ "story_points": 8,
1311
+ "parent_epic": "3",
1312
+ "assignee": "omar",
1313
+ "sprint": "pc-sprint-4",
1314
+ "delivery_mode": "scrum",
1315
+ "governance_class": "flow",
1316
+ "dor": "ready"
1317
+ },
1318
+ {
1319
+ "wbs_path": "3.6",
1320
+ "name": "Data retention policies",
1321
+ "type": "story",
1322
+ "status": "BACKLOG",
1323
+ "story_points": 5,
1324
+ "parent_epic": "3",
1325
+ "assignee": "yuki",
1326
+ "sprint": "pc-sprint-6",
1327
+ "delivery_mode": "scrum",
1328
+ "governance_class": "flow",
1329
+ "assignments": [
1330
+ {
1331
+ "resource": "yuki",
1332
+ "units": 0.5
1333
+ },
1334
+ {
1335
+ "resource": "omar",
1336
+ "units": 0.5
1337
+ }
1338
+ ]
1339
+ },
1340
+ {
1341
+ "wbs_path": "3.7",
1342
+ "name": "Streaming exports",
1343
+ "type": "story",
1344
+ "status": "BACKLOG",
1345
+ "story_points": 8,
1346
+ "parent_epic": "3",
1347
+ "assignee": "omar",
1348
+ "sprint": "pc-sprint-7",
1349
+ "delivery_mode": "scrum",
1350
+ "governance_class": "flow"
1351
+ },
1352
+ {
1353
+ "wbs_path": "3.8",
1354
+ "name": "Anomaly detection spike",
1355
+ "type": "spike",
1356
+ "status": "BACKLOG",
1357
+ "story_points": 3,
1358
+ "parent_epic": "3",
1359
+ "assignee": "yuki",
1360
+ "sprint": "pc-sprint-8",
1361
+ "delivery_mode": "scrum",
1362
+ "governance_class": "flow",
1363
+ "labels": [
1364
+ "spike"
1365
+ ]
1366
+ },
1367
+ {
1368
+ "wbs_path": "4.1",
1369
+ "name": "Plan catalog",
1370
+ "type": "story",
1371
+ "status": "COMPLETE",
1372
+ "percent_complete": 100.0,
1373
+ "story_points": 5,
1374
+ "parent_epic": "4",
1375
+ "assignee": "nadia",
1376
+ "sprint": "pc-sprint-3",
1377
+ "delivery_mode": "scrum",
1378
+ "governance_class": "flow",
1379
+ "labels": [
1380
+ "compliance"
1381
+ ],
1382
+ "dor": "ready"
1383
+ },
1384
+ {
1385
+ "wbs_path": "4.2",
1386
+ "name": "Usage metering",
1387
+ "type": "story",
1388
+ "status": "COMPLETE",
1389
+ "percent_complete": 100.0,
1390
+ "story_points": 5,
1391
+ "parent_epic": "4",
1392
+ "assignee": "tom",
1393
+ "sprint": "pc-sprint-4",
1394
+ "delivery_mode": "scrum",
1395
+ "governance_class": "flow",
1396
+ "dor": "ready"
1397
+ },
1398
+ {
1399
+ "wbs_path": "4.3",
1400
+ "name": "Invoice render",
1401
+ "type": "story",
1402
+ "status": "COMPLETE",
1403
+ "percent_complete": 100.0,
1404
+ "story_points": 5,
1405
+ "parent_epic": "4",
1406
+ "assignee": "nadia",
1407
+ "sprint": "pc-sprint-4",
1408
+ "delivery_mode": "scrum",
1409
+ "governance_class": "flow",
1410
+ "dor": "ready"
1411
+ },
1412
+ {
1413
+ "wbs_path": "4.4",
1414
+ "name": "Dunning flow",
1415
+ "type": "story",
1416
+ "status": "REVIEW",
1417
+ "percent_complete": 85.0,
1418
+ "story_points": 5,
1419
+ "parent_epic": "4",
1420
+ "assignee": "nadia",
1421
+ "sprint": "pc-sprint-5",
1422
+ "delivery_mode": "scrum",
1423
+ "governance_class": "flow",
1424
+ "acceptance_criteria": [
1425
+ {
1426
+ "text": "Retries follow the 1-3-7 day ladder"
1427
+ },
1428
+ {
1429
+ "text": "Paying an invoice cancels its pending retries"
1430
+ },
1431
+ {
1432
+ "text": "Access is suspended only after the last retry fails"
1433
+ }
1434
+ ],
1435
+ "dor": "ready"
1436
+ },
1437
+ {
1438
+ "wbs_path": "4.5",
1439
+ "name": "Tax engine",
1440
+ "type": "story",
1441
+ "status": "NOT_STARTED",
1442
+ "story_points": 8,
1443
+ "parent_epic": "4",
1444
+ "assignee": "tom",
1445
+ "sprint": "pc-sprint-5",
1446
+ "delivery_mode": "scrum",
1447
+ "governance_class": "flow",
1448
+ "labels": [
1449
+ "customer-request"
1450
+ ],
1451
+ "attachments": [
1452
+ {
1453
+ "external_url": "https://example.com/atlas/legal/tax-jurisdiction-scope",
1454
+ "external_title": "Tax jurisdiction scope decision",
1455
+ "is_pinned": true,
1456
+ "uploaded_by": "jordan"
1457
+ }
1458
+ ],
1459
+ "assignments": [
1460
+ {
1461
+ "resource": "tom",
1462
+ "units": 0.75
1463
+ },
1464
+ {
1465
+ "resource": "ivan",
1466
+ "units": 0.2
1467
+ }
1468
+ ],
1469
+ "acceptance_criteria": [
1470
+ {
1471
+ "text": "Tax is calculated for every launch jurisdiction"
1472
+ },
1473
+ {
1474
+ "text": "An out-of-scope jurisdiction is refused at checkout, never taxed at zero"
1475
+ }
1476
+ ],
1477
+ "skill_requirements": [
1478
+ {
1479
+ "skill": "Billing systems",
1480
+ "min_proficiency": "expert"
1481
+ }
1482
+ ],
1483
+ "dor": "ready"
1484
+ },
1485
+ {
1486
+ "wbs_path": "4.10",
1487
+ "name": "Dunning notice copy",
1488
+ "type": "story",
1489
+ "status": "IN_PROGRESS",
1490
+ "percent_complete": 50.0,
1491
+ "story_points": 2,
1492
+ "remaining_points": 1,
1493
+ "parent_epic": "4",
1494
+ "assignee": "jordan",
1495
+ "sprint": "pc-sprint-5",
1496
+ "delivery_mode": "scrum",
1497
+ "governance_class": "flow",
1498
+ "acceptance_criteria": [
1499
+ {
1500
+ "text": "Legal has reviewed the copy for each notice"
1501
+ },
1502
+ {
1503
+ "text": "Every notice names the amount due and the next retry date"
1504
+ }
1505
+ ],
1506
+ "dor": "ready"
1507
+ },
1508
+ {
1509
+ "wbs_path": "4.6",
1510
+ "name": "Credit memo flow",
1511
+ "type": "story",
1512
+ "status": "COMPLETE",
1513
+ "percent_complete": 100.0,
1514
+ "story_points": 3,
1515
+ "parent_epic": "4",
1516
+ "assignee": "nadia",
1517
+ "sprint": "pc-sprint-4",
1518
+ "delivery_mode": "scrum",
1519
+ "governance_class": "flow",
1520
+ "dor": "ready"
1521
+ },
1522
+ {
1523
+ "wbs_path": "4.7",
1524
+ "name": "Revenue recognition export",
1525
+ "type": "story",
1526
+ "status": "BACKLOG",
1527
+ "story_points": 8,
1528
+ "parent_epic": "4",
1529
+ "assignee": "nadia",
1530
+ "sprint": "pc-sprint-6",
1531
+ "delivery_mode": "scrum",
1532
+ "governance_class": "flow"
1533
+ },
1534
+ {
1535
+ "wbs_path": "4.8",
1536
+ "name": "Dunning email sequences",
1537
+ "type": "story",
1538
+ "status": "BACKLOG",
1539
+ "story_points": 3,
1540
+ "parent_epic": "4",
1541
+ "assignee": "tom",
1542
+ "sprint": "pc-sprint-7",
1543
+ "delivery_mode": "scrum",
1544
+ "governance_class": "flow",
1545
+ "links": [
1546
+ {
1547
+ "target": "4.4",
1548
+ "link_type": "duplicates",
1549
+ "note": "Email-sequence scope overlaps the dunning flow story — consolidate before Sprint 7 pickup."
1550
+ }
1551
+ ]
1552
+ },
1553
+ {
1554
+ "wbs_path": "4.9",
1555
+ "name": "Usage-based invoicing v2",
1556
+ "type": "story",
1557
+ "status": "BACKLOG",
1558
+ "story_points": 13,
1559
+ "parent_epic": "4",
1560
+ "assignee": "nadia",
1561
+ "sprint": "pc-sprint-8",
1562
+ "delivery_mode": "scrum",
1563
+ "governance_class": "flow",
1564
+ "labels": [
1565
+ "customer-request"
1566
+ ]
1567
+ },
1568
+ {
1569
+ "wbs_path": "5.1",
1570
+ "name": "Email service",
1571
+ "type": "story",
1572
+ "status": "COMPLETE",
1573
+ "percent_complete": 100.0,
1574
+ "story_points": 2,
1575
+ "parent_epic": "5",
1576
+ "assignee": "tom",
1577
+ "sprint": "pc-sprint-1",
1578
+ "delivery_mode": "scrum",
1579
+ "governance_class": "flow",
1580
+ "dor": "ready"
1581
+ },
1582
+ {
1583
+ "wbs_path": "5.2",
1584
+ "name": "In-app inbox",
1585
+ "type": "story",
1586
+ "status": "COMPLETE",
1587
+ "percent_complete": 100.0,
1588
+ "story_points": 3,
1589
+ "parent_epic": "5",
1590
+ "assignee": "diego",
1591
+ "sprint": "pc-sprint-2",
1592
+ "delivery_mode": "scrum",
1593
+ "governance_class": "flow",
1594
+ "dor": "ready"
1595
+ },
1596
+ {
1597
+ "wbs_path": "5.3",
1598
+ "name": "Digest scheduler",
1599
+ "type": "story",
1600
+ "status": "IN_PROGRESS",
1601
+ "percent_complete": 65.0,
1602
+ "story_points": 3,
1603
+ "remaining_points": 1,
1604
+ "parent_epic": "5",
1605
+ "assignee": "diego",
1606
+ "sprint": "pc-sprint-5",
1607
+ "delivery_mode": "scrum",
1608
+ "governance_class": "flow",
1609
+ "assignments": [
1610
+ {
1611
+ "resource": "diego",
1612
+ "units": 0.7
1613
+ },
1614
+ {
1615
+ "resource": "ivan",
1616
+ "units": 0.2
1617
+ }
1618
+ ],
1619
+ "acceptance_criteria": [
1620
+ {
1621
+ "text": "Digests send in the recipient's timezone",
1622
+ "met": true,
1623
+ "met_by": "diego",
1624
+ "met_at": "A-6T12:00"
1625
+ },
1626
+ {
1627
+ "text": "A user who opts out receives nothing"
1628
+ }
1629
+ ],
1630
+ "skill_requirements": [
1631
+ {
1632
+ "skill": "Email delivery",
1633
+ "min_proficiency": "intermediate"
1634
+ }
1635
+ ],
1636
+ "dor": "ready"
1637
+ },
1638
+ {
1639
+ "wbs_path": "5.4",
1640
+ "name": "Preference center",
1641
+ "type": "story",
1642
+ "status": "COMPLETE",
1643
+ "percent_complete": 100.0,
1644
+ "story_points": 3,
1645
+ "parent_epic": "5",
1646
+ "assignee": "mei",
1647
+ "sprint": "pc-sprint-4",
1648
+ "delivery_mode": "scrum",
1649
+ "governance_class": "flow",
1650
+ "dor": "ready"
1651
+ },
1652
+ {
1653
+ "wbs_path": "5.5",
1654
+ "name": "Notification templates",
1655
+ "type": "story",
1656
+ "status": "COMPLETE",
1657
+ "percent_complete": 100.0,
1658
+ "story_points": 3,
1659
+ "parent_epic": "5",
1660
+ "assignee": "diego",
1661
+ "sprint": "pc-sprint-4",
1662
+ "delivery_mode": "scrum",
1663
+ "governance_class": "flow",
1664
+ "dor": "ready"
1665
+ },
1666
+ {
1667
+ "wbs_path": "5.6",
1668
+ "name": "Mobile push channel",
1669
+ "type": "story",
1670
+ "status": "BACKLOG",
1671
+ "story_points": 5,
1672
+ "parent_epic": "5",
1673
+ "assignee": "mei",
1674
+ "sprint": "pc-sprint-6",
1675
+ "delivery_mode": "scrum",
1676
+ "governance_class": "flow"
1677
+ },
1678
+ {
1679
+ "wbs_path": "5.7",
1680
+ "name": "Quiet hours",
1681
+ "type": "story",
1682
+ "status": "BACKLOG",
1683
+ "story_points": 2,
1684
+ "parent_epic": "5",
1685
+ "assignee": "diego",
1686
+ "sprint": "pc-sprint-7",
1687
+ "delivery_mode": "scrum",
1688
+ "governance_class": "flow"
1689
+ },
1690
+ {
1691
+ "wbs_path": "5.8",
1692
+ "name": "Digest personalization",
1693
+ "type": "story",
1694
+ "status": "BACKLOG",
1695
+ "story_points": 3,
1696
+ "parent_epic": "5",
1697
+ "assignee": "mei",
1698
+ "sprint": "pc-sprint-8",
1699
+ "delivery_mode": "scrum",
1700
+ "governance_class": "flow"
1701
+ },
1702
+ {
1703
+ "wbs_path": "9",
1704
+ "name": "Platform Core GA",
1705
+ "is_milestone": true,
1706
+ "delivery_mode": "milestone",
1707
+ "planned_start": "A+51"
1708
+ },
1709
+ {
1710
+ "wbs_path": "2.11",
1711
+ "name": "Webhook signature check rejects rotated secrets",
1712
+ "type": "bug",
1713
+ "status": "BACKLOG",
1714
+ "story_points": 2,
1715
+ "parent_epic": "2",
1716
+ "assignee": "tom",
1717
+ "delivery_mode": "scrum",
1718
+ "governance_class": "flow",
1719
+ "dor": "refine",
1720
+ "labels": [
1721
+ "customer-request"
1722
+ ]
1723
+ },
1724
+ {
1725
+ "wbs_path": "10",
1726
+ "name": "Daily standup",
1727
+ "status": "NOT_STARTED",
1728
+ "duration": 1,
1729
+ "assignee": "sam",
1730
+ "delivery_mode": "scrum",
1731
+ "recurrence": {
1732
+ "frequency": "WEEKLY",
1733
+ "weekdays": [
1734
+ "mon",
1735
+ "tue",
1736
+ "wed",
1737
+ "thu",
1738
+ "fri"
1739
+ ],
1740
+ "time_of_day": "09:30"
1741
+ }
1742
+ },
1743
+ {
1744
+ "wbs_path": "2.8.1",
1745
+ "name": "Retry history query endpoint",
1746
+ "status": "NOT_STARTED",
1747
+ "duration": 1,
1748
+ "assignee": "tom",
1749
+ "is_subtask": true,
1750
+ "delivery_mode": "scrum"
1751
+ },
1752
+ {
1753
+ "wbs_path": "2.8.2",
1754
+ "name": "Dashboard retry timeline",
1755
+ "status": "NOT_STARTED",
1756
+ "duration": 1,
1757
+ "assignee": "tom",
1758
+ "is_subtask": true,
1759
+ "delivery_mode": "scrum"
1760
+ },
1761
+ {
1762
+ "wbs_path": "2.8.3",
1763
+ "name": "Alert when retries are exhausted",
1764
+ "status": "NOT_STARTED",
1765
+ "duration": 1,
1766
+ "assignee": "diego",
1767
+ "is_subtask": true,
1768
+ "delivery_mode": "scrum"
1769
+ }
1770
+ ],
1771
+ "dependencies": [
1772
+ {
1773
+ "predecessor": "migration-tooling:3.2",
1774
+ "successor": "2.6",
1775
+ "dep_type": "FS"
1776
+ }
1777
+ ],
1778
+ "sprints": [
1779
+ {
1780
+ "slug": "pc-sprint-1",
1781
+ "name": "Sprint 1",
1782
+ "goal": "Stand up identity and the tenant core.",
1783
+ "state": "COMPLETED",
1784
+ "start_date": "A-62",
1785
+ "finish_date": "A-49",
1786
+ "capacity_points": 34,
1787
+ "committed_points": 30,
1788
+ "completed_points": 28
1789
+ },
1790
+ {
1791
+ "slug": "pc-sprint-2",
1792
+ "name": "Sprint 2",
1793
+ "goal": "Access control and the public API surface.",
1794
+ "state": "COMPLETED",
1795
+ "start_date": "A-48",
1796
+ "finish_date": "A-35",
1797
+ "capacity_points": 34,
1798
+ "committed_points": 31,
1799
+ "completed_points": 31
1800
+ },
1801
+ {
1802
+ "slug": "pc-sprint-3",
1803
+ "name": "Sprint 3",
1804
+ "goal": "Data platform foundations and the billing catalog.",
1805
+ "state": "COMPLETED",
1806
+ "start_date": "A-34",
1807
+ "finish_date": "A-21",
1808
+ "capacity_points": 34,
1809
+ "committed_points": 32,
1810
+ "completed_points": 26
1811
+ },
1812
+ {
1813
+ "slug": "pc-sprint-4",
1814
+ "name": "Sprint 4",
1815
+ "goal": "Billing pipeline end to end.",
1816
+ "state": "COMPLETED",
1817
+ "start_date": "A-20",
1818
+ "finish_date": "A-7",
1819
+ "capacity_points": 34,
1820
+ "committed_points": 34,
1821
+ "completed_points": 34
1822
+ },
1823
+ {
1824
+ "slug": "pc-sprint-5",
1825
+ "name": "Sprint 5",
1826
+ "goal": "Audit trail, dunning, and the warehouse backfill.",
1827
+ "state": "ACTIVE",
1828
+ "start_date": "A-6",
1829
+ "finish_date": "A+7",
1830
+ "capacity_points": 34,
1831
+ "committed_points": 28
1832
+ },
1833
+ {
1834
+ "slug": "pc-sprint-6",
1835
+ "name": "Sprint 6",
1836
+ "goal": "Self-serve auth and data retention.",
1837
+ "state": "PLANNED",
1838
+ "start_date": "A+8",
1839
+ "finish_date": "A+21",
1840
+ "capacity_points": 34
1841
+ },
1842
+ {
1843
+ "slug": "pc-sprint-7",
1844
+ "name": "Sprint 7",
1845
+ "goal": "Usage analytics and export depth.",
1846
+ "state": "PLANNED",
1847
+ "start_date": "A+22",
1848
+ "finish_date": "A+35",
1849
+ "capacity_points": 34
1850
+ },
1851
+ {
1852
+ "slug": "pc-sprint-8",
1853
+ "name": "Sprint 8",
1854
+ "goal": "Partner surface and invoicing v2.",
1855
+ "state": "PLANNED",
1856
+ "start_date": "A+36",
1857
+ "finish_date": "A+49",
1858
+ "capacity_points": 34,
1859
+ "target_milestone": "9"
1860
+ }
1861
+ ],
1862
+ "baselines": [
1863
+ {
1864
+ "name": "Sprint-0 baseline",
1865
+ "is_active": true,
1866
+ "captured_at": "A-87",
1867
+ "tasks": [
1868
+ {
1869
+ "task": "1.1",
1870
+ "story_points": 5
1871
+ },
1872
+ {
1873
+ "task": "1.2",
1874
+ "story_points": 5
1875
+ },
1876
+ {
1877
+ "task": "1.3",
1878
+ "story_points": 5
1879
+ },
1880
+ {
1881
+ "task": "1.4",
1882
+ "story_points": 5
1883
+ },
1884
+ {
1885
+ "task": "1.5",
1886
+ "story_points": 5
1887
+ },
1888
+ {
1889
+ "task": "2.1",
1890
+ "story_points": 8
1891
+ },
1892
+ {
1893
+ "task": "2.2",
1894
+ "story_points": 5
1895
+ },
1896
+ {
1897
+ "task": "2.3",
1898
+ "story_points": 8
1899
+ },
1900
+ {
1901
+ "task": "2.4",
1902
+ "story_points": 2
1903
+ },
1904
+ {
1905
+ "task": "2.5",
1906
+ "story_points": 8
1907
+ },
1908
+ {
1909
+ "task": "3.1",
1910
+ "story_points": 8
1911
+ },
1912
+ {
1913
+ "task": "3.2",
1914
+ "story_points": 8
1915
+ },
1916
+ {
1917
+ "task": "3.3",
1918
+ "story_points": 8
1919
+ },
1920
+ {
1921
+ "task": "3.4",
1922
+ "story_points": 5
1923
+ },
1924
+ {
1925
+ "task": "3.5",
1926
+ "story_points": 8
1927
+ },
1928
+ {
1929
+ "task": "4.1",
1930
+ "story_points": 5
1931
+ },
1932
+ {
1933
+ "task": "4.2",
1934
+ "story_points": 5
1935
+ },
1936
+ {
1937
+ "task": "4.3",
1938
+ "story_points": 5
1939
+ },
1940
+ {
1941
+ "task": "4.4",
1942
+ "story_points": 5
1943
+ },
1944
+ {
1945
+ "task": "4.5",
1946
+ "story_points": 8
1947
+ },
1948
+ {
1949
+ "task": "5.1",
1950
+ "story_points": 2
1951
+ },
1952
+ {
1953
+ "task": "5.2",
1954
+ "story_points": 3
1955
+ },
1956
+ {
1957
+ "task": "5.3",
1958
+ "story_points": 3
1959
+ },
1960
+ {
1961
+ "task": "5.4",
1962
+ "story_points": 3
1963
+ },
1964
+ {
1965
+ "task": "5.6",
1966
+ "story_points": 3
1967
+ },
1968
+ {
1969
+ "task": "5.7",
1970
+ "story_points": 2
1971
+ },
1972
+ {
1973
+ "task": "5.8",
1974
+ "story_points": 2
1975
+ }
1976
+ ]
1977
+ }
1978
+ ],
1979
+ "risks": [
1980
+ {
1981
+ "slug": "pc-velocity-dip",
1982
+ "title": "Velocity dip after team expansion",
1983
+ "description": "Onboarding three new engineers mid-program may dip velocity for 2 sprints.",
1984
+ "status": "MITIGATING",
1985
+ "probability": 3,
1986
+ "impact": 3,
1987
+ "category": "ORGANIZATIONAL",
1988
+ "response": "MITIGATE",
1989
+ "trigger": "Two consecutive sprints close below 80% of committed points.",
1990
+ "contingency": "Re-baseline Sprint 6-8 commitments against the post-onboarding run rate rather than the pre-expansion average.",
1991
+ "mitigation_due_date": "A-24",
1992
+ "owner": "priya",
1993
+ "tasks": [
1994
+ "2.1"
1995
+ ]
1996
+ },
1997
+ {
1998
+ "slug": "pc-scope-creep",
1999
+ "title": "Billing scope creep",
2000
+ "description": "Tax-engine requirements are still firming up and may expand the billing epic.",
2001
+ "status": "RESOLVED",
2002
+ "probability": 4,
2003
+ "impact": 3,
2004
+ "category": "PROJECT_MANAGEMENT",
2005
+ "response": "AVOID",
2006
+ "trigger": "A second tax jurisdiction is requested before the billing epic closes.",
2007
+ "contingency": "n/a — the exposure was removed rather than managed: multi-jurisdiction tax moved out of 1.0 by decision, not deferred within it.",
2008
+ "mitigation_due_date": "A-30",
2009
+ "owner": "jordan",
2010
+ "tasks": [
2011
+ "4.5"
2012
+ ]
2013
+ },
2014
+ {
2015
+ "slug": "pc-sso-vendor",
2016
+ "title": "SSO/identity vendor integration risk",
2017
+ "description": "The chosen IdP's enterprise SSO certification is on the critical path.",
2018
+ "status": "MITIGATING",
2019
+ "probability": 3,
2020
+ "impact": 4,
2021
+ "category": "EXTERNAL",
2022
+ "response": "MITIGATE",
2023
+ "trigger": "Vendor misses a sandbox milestone, or certification slips past the Sprint 6 gate.",
2024
+ "contingency": "Ship with the interim OIDC profile and defer enterprise SSO to 1.1; the fallback IdP spike (1.6) is what makes that a decision rather than a scramble.",
2025
+ "mitigation_due_date": "A-18",
2026
+ "owner": "mei",
2027
+ "tasks": [
2028
+ "1.1",
2029
+ "1.10"
2030
+ ]
2031
+ },
2032
+ {
2033
+ "slug": "pc-data-platform",
2034
+ "title": "Data platform schema churn",
2035
+ "status": "OPEN",
2036
+ "probability": 3,
2037
+ "impact": 4,
2038
+ "category": "TECHNICAL",
2039
+ "response": "MITIGATE",
2040
+ "mitigation_due_date": "A+18",
2041
+ "owner": "yuki",
2042
+ "tasks": [
2043
+ "3.1",
2044
+ "3.2"
2045
+ ]
2046
+ },
2047
+ {
2048
+ "slug": "pc-notif-throttle",
2049
+ "title": "Notification provider rate limits",
2050
+ "status": "OPEN",
2051
+ "probability": 2,
2052
+ "impact": 2,
2053
+ "category": "TECHNICAL",
2054
+ "response": "ACCEPT",
2055
+ "owner": "tom",
2056
+ "notes": "Batching + backoff implemented; load test passed.",
2057
+ "tasks": [
2058
+ "5.1"
2059
+ ]
2060
+ }
2061
+ ],
2062
+ "team": {
2063
+ "name": "Platform Core Team",
2064
+ "members": [
2065
+ {
2066
+ "account": "sam",
2067
+ "scrum_master": true
2068
+ },
2069
+ {
2070
+ "account": "jordan",
2071
+ "product_owner": true
2072
+ }
2073
+ ]
2074
+ }
2075
+ },
2076
+ {
2077
+ "slug": "migration-tooling",
2078
+ "name": "Migration Tooling",
2079
+ "code": "MIGR",
2080
+ "description": "The waterfall stream — CPM-scheduled data migration with three-point estimates.",
2081
+ "methodology": "WATERFALL",
2082
+ "start_date": "A-90",
2083
+ "calendar": "standard",
2084
+ "health": "AT_RISK",
2085
+ "members": [
2086
+ {
2087
+ "account": "alex",
2088
+ "role": "OWNER"
2089
+ },
2090
+ {
2091
+ "account": "sam",
2092
+ "role": "SCHEDULER"
2093
+ },
2094
+ {
2095
+ "account": "raj",
2096
+ "role": "SCHEDULER"
2097
+ },
2098
+ {
2099
+ "account": "priya",
2100
+ "role": "MEMBER"
2101
+ },
2102
+ {
2103
+ "account": "omar",
2104
+ "role": "MEMBER"
2105
+ },
2106
+ {
2107
+ "account": "yuki",
2108
+ "role": "MEMBER"
2109
+ },
2110
+ {
2111
+ "account": "tom",
2112
+ "role": "MEMBER"
2113
+ },
2114
+ {
2115
+ "account": "ivan",
2116
+ "role": "VIEWER"
2117
+ },
2118
+ {
2119
+ "account": "ada",
2120
+ "role": "VIEWER"
2121
+ },
2122
+ {
2123
+ "account": "visitor",
2124
+ "role": "MEMBER"
2125
+ }
2126
+ ],
2127
+ "default_view": "SCHEDULE",
2128
+ "forecast_history": {
2129
+ "days": 60,
2130
+ "commitment_finish": "A+67",
2131
+ "cpm_start": "A+60",
2132
+ "cpm_end": "A+74",
2133
+ "p50_start": "A+64",
2134
+ "p50_end": "A+78",
2135
+ "p80_start": "A+70",
2136
+ "p80_end": "A+86",
2137
+ "p95_start": "A+76",
2138
+ "p95_end": "A+96",
2139
+ "mc_iterations": 2000,
2140
+ "completion_ratio": 0.35
2141
+ },
2142
+ "labels": [
2143
+ {
2144
+ "slug": "critical-path",
2145
+ "name": "Critical path",
2146
+ "color": "rose",
2147
+ "position": 0
2148
+ },
2149
+ {
2150
+ "slug": "cutover",
2151
+ "name": "Cutover",
2152
+ "color": "amber",
2153
+ "position": 1
2154
+ },
2155
+ {
2156
+ "slug": "data-quality",
2157
+ "name": "Data quality",
2158
+ "color": "cyan",
2159
+ "position": 2
2160
+ },
2161
+ {
2162
+ "slug": "rollback",
2163
+ "name": "Rollback",
2164
+ "color": "purple",
2165
+ "position": 3
2166
+ },
2167
+ {
2168
+ "slug": "dry-run",
2169
+ "name": "Dry run",
2170
+ "color": "slate",
2171
+ "position": 4
2172
+ }
2173
+ ],
2174
+ "tasks": [
2175
+ {
2176
+ "wbs_path": "1",
2177
+ "name": "Assess",
2178
+ "type": "task",
2179
+ "governance_class": "gated",
2180
+ "delivery_mode": "waterfall"
2181
+ },
2182
+ {
2183
+ "wbs_path": "1.1",
2184
+ "name": "Inventory legacy schemas",
2185
+ "type": "task",
2186
+ "status": "COMPLETE",
2187
+ "percent_complete": 100.0,
2188
+ "duration": 5,
2189
+ "estimate": {
2190
+ "optimistic": 4,
2191
+ "most_likely": 5,
2192
+ "pessimistic": 9
2193
+ },
2194
+ "assignee": "raj",
2195
+ "governance_class": "gated",
2196
+ "delivery_mode": "waterfall",
2197
+ "planned_start": "A-90"
2198
+ },
2199
+ {
2200
+ "wbs_path": "1.2",
2201
+ "name": "Profile data quality",
2202
+ "type": "task",
2203
+ "status": "COMPLETE",
2204
+ "percent_complete": 100.0,
2205
+ "duration": 4,
2206
+ "estimate": {
2207
+ "optimistic": 3,
2208
+ "most_likely": 4,
2209
+ "pessimistic": 7
2210
+ },
2211
+ "assignee": "tom",
2212
+ "governance_class": "gated",
2213
+ "delivery_mode": "waterfall",
2214
+ "planned_start": "A-83",
2215
+ "labels": [
2216
+ "data-quality"
2217
+ ]
2218
+ },
2219
+ {
2220
+ "wbs_path": "1.3",
2221
+ "name": "Map field semantics",
2222
+ "type": "task",
2223
+ "status": "COMPLETE",
2224
+ "percent_complete": 100.0,
2225
+ "duration": 6,
2226
+ "estimate": {
2227
+ "optimistic": 4,
2228
+ "most_likely": 6,
2229
+ "pessimistic": 11
2230
+ },
2231
+ "assignee": "yuki",
2232
+ "governance_class": "gated",
2233
+ "delivery_mode": "waterfall",
2234
+ "planned_start": "A-88"
2235
+ },
2236
+ {
2237
+ "wbs_path": "1.4",
2238
+ "name": "Risk & cutover plan",
2239
+ "type": "task",
2240
+ "status": "COMPLETE",
2241
+ "percent_complete": 100.0,
2242
+ "duration": 3,
2243
+ "estimate": {
2244
+ "optimistic": 2,
2245
+ "most_likely": 3,
2246
+ "pessimistic": 5
2247
+ },
2248
+ "assignee": "omar",
2249
+ "governance_class": "gated",
2250
+ "delivery_mode": "waterfall",
2251
+ "planned_start": "A-77"
2252
+ },
2253
+ {
2254
+ "wbs_path": "2",
2255
+ "name": "Build",
2256
+ "type": "task",
2257
+ "governance_class": "gated",
2258
+ "delivery_mode": "waterfall"
2259
+ },
2260
+ {
2261
+ "wbs_path": "2.1",
2262
+ "name": "ETL framework",
2263
+ "type": "task",
2264
+ "status": "COMPLETE",
2265
+ "percent_complete": 100.0,
2266
+ "duration": 8,
2267
+ "estimate": {
2268
+ "optimistic": 6,
2269
+ "most_likely": 8,
2270
+ "pessimistic": 14
2271
+ },
2272
+ "assignee": "tom",
2273
+ "governance_class": "gated",
2274
+ "delivery_mode": "waterfall",
2275
+ "planned_start": "A-46"
2276
+ },
2277
+ {
2278
+ "wbs_path": "2.2",
2279
+ "name": "Schema transformer",
2280
+ "type": "task",
2281
+ "status": "COMPLETE",
2282
+ "percent_complete": 100.0,
2283
+ "duration": 7,
2284
+ "estimate": {
2285
+ "optimistic": 5,
2286
+ "most_likely": 7,
2287
+ "pessimistic": 13
2288
+ },
2289
+ "assignee": "yuki",
2290
+ "governance_class": "gated",
2291
+ "delivery_mode": "waterfall",
2292
+ "planned_start": "A-42",
2293
+ "labels": [
2294
+ "data-quality"
2295
+ ]
2296
+ },
2297
+ {
2298
+ "wbs_path": "2.3",
2299
+ "name": "Validation harness",
2300
+ "type": "task",
2301
+ "status": "COMPLETE",
2302
+ "percent_complete": 100.0,
2303
+ "duration": 6,
2304
+ "estimate": {
2305
+ "optimistic": 4,
2306
+ "most_likely": 6,
2307
+ "pessimistic": 11
2308
+ },
2309
+ "assignee": "omar",
2310
+ "governance_class": "gated",
2311
+ "delivery_mode": "waterfall",
2312
+ "planned_start": "A-36"
2313
+ },
2314
+ {
2315
+ "wbs_path": "2.4",
2316
+ "name": "Reconciliation reports",
2317
+ "type": "task",
2318
+ "status": "COMPLETE",
2319
+ "percent_complete": 100.0,
2320
+ "duration": 4,
2321
+ "estimate": {
2322
+ "optimistic": 3,
2323
+ "most_likely": 4,
2324
+ "pessimistic": 7
2325
+ },
2326
+ "assignee": "raj",
2327
+ "governance_class": "gated",
2328
+ "delivery_mode": "waterfall",
2329
+ "planned_start": "A-28"
2330
+ },
2331
+ {
2332
+ "wbs_path": "3",
2333
+ "name": "Migrate",
2334
+ "type": "task",
2335
+ "governance_class": "gated",
2336
+ "delivery_mode": "waterfall"
2337
+ },
2338
+ {
2339
+ "wbs_path": "3.1",
2340
+ "name": "Dry-run migration",
2341
+ "type": "task",
2342
+ "status": "IN_PROGRESS",
2343
+ "percent_complete": 55.0,
2344
+ "duration": 5,
2345
+ "estimate": {
2346
+ "optimistic": 4,
2347
+ "most_likely": 5,
2348
+ "pessimistic": 15
2349
+ },
2350
+ "assignee": "yuki",
2351
+ "governance_class": "gated",
2352
+ "delivery_mode": "waterfall",
2353
+ "planned_start": "A-11",
2354
+ "labels": [
2355
+ "dry-run",
2356
+ "critical-path"
2357
+ ]
2358
+ },
2359
+ {
2360
+ "wbs_path": "3.2",
2361
+ "name": "Performance tuning",
2362
+ "type": "task",
2363
+ "status": "NOT_STARTED",
2364
+ "duration": 4,
2365
+ "estimate": {
2366
+ "optimistic": 3,
2367
+ "most_likely": 4,
2368
+ "pessimistic": 12
2369
+ },
2370
+ "assignee": "omar",
2371
+ "governance_class": "gated",
2372
+ "delivery_mode": "waterfall",
2373
+ "planned_start": "A+11",
2374
+ "labels": [
2375
+ "critical-path"
2376
+ ]
2377
+ },
2378
+ {
2379
+ "wbs_path": "3.3",
2380
+ "name": "Delta sync",
2381
+ "type": "task",
2382
+ "status": "NOT_STARTED",
2383
+ "duration": 6,
2384
+ "estimate": {
2385
+ "optimistic": 4,
2386
+ "most_likely": 6,
2387
+ "pessimistic": 18
2388
+ },
2389
+ "assignee": "raj",
2390
+ "governance_class": "gated",
2391
+ "delivery_mode": "waterfall",
2392
+ "planned_start": "A+1"
2393
+ },
2394
+ {
2395
+ "wbs_path": "3.4",
2396
+ "name": "Production rehearsal",
2397
+ "type": "task",
2398
+ "status": "NOT_STARTED",
2399
+ "duration": 5,
2400
+ "estimate": {
2401
+ "optimistic": 4,
2402
+ "most_likely": 5,
2403
+ "pessimistic": 14
2404
+ },
2405
+ "assignee": "tom",
2406
+ "governance_class": "gated",
2407
+ "delivery_mode": "waterfall",
2408
+ "planned_start": "A+18",
2409
+ "labels": [
2410
+ "cutover"
2411
+ ]
2412
+ },
2413
+ {
2414
+ "wbs_path": "4",
2415
+ "name": "Validate",
2416
+ "type": "task",
2417
+ "governance_class": "gated",
2418
+ "delivery_mode": "waterfall"
2419
+ },
2420
+ {
2421
+ "wbs_path": "4.1",
2422
+ "name": "Row-count reconciliation",
2423
+ "type": "task",
2424
+ "status": "NOT_STARTED",
2425
+ "duration": 3,
2426
+ "estimate": {
2427
+ "optimistic": 2,
2428
+ "most_likely": 3,
2429
+ "pessimistic": 7
2430
+ },
2431
+ "assignee": "omar",
2432
+ "governance_class": "gated",
2433
+ "delivery_mode": "waterfall",
2434
+ "planned_start": "A+32"
2435
+ },
2436
+ {
2437
+ "wbs_path": "4.2",
2438
+ "name": "Business sign-off pack",
2439
+ "type": "task",
2440
+ "status": "NOT_STARTED",
2441
+ "duration": 4,
2442
+ "estimate": {
2443
+ "optimistic": 3,
2444
+ "most_likely": 4,
2445
+ "pessimistic": 9
2446
+ },
2447
+ "assignee": "raj",
2448
+ "governance_class": "gated",
2449
+ "delivery_mode": "waterfall",
2450
+ "planned_start": "A+37"
2451
+ },
2452
+ {
2453
+ "wbs_path": "4.3",
2454
+ "name": "Rollback drill",
2455
+ "type": "task",
2456
+ "status": "NOT_STARTED",
2457
+ "duration": 3,
2458
+ "estimate": {
2459
+ "optimistic": 2,
2460
+ "most_likely": 3,
2461
+ "pessimistic": 8
2462
+ },
2463
+ "assignee": "tom",
2464
+ "governance_class": "gated",
2465
+ "delivery_mode": "waterfall",
2466
+ "planned_start": "A+34",
2467
+ "labels": [
2468
+ "rollback"
2469
+ ]
2470
+ },
2471
+ {
2472
+ "wbs_path": "5",
2473
+ "name": "Cutover",
2474
+ "type": "task",
2475
+ "governance_class": "gated",
2476
+ "delivery_mode": "waterfall"
2477
+ },
2478
+ {
2479
+ "wbs_path": "5.1",
2480
+ "name": "Freeze window prep",
2481
+ "type": "task",
2482
+ "status": "NOT_STARTED",
2483
+ "duration": 2,
2484
+ "estimate": {
2485
+ "optimistic": 1,
2486
+ "most_likely": 2,
2487
+ "pessimistic": 5
2488
+ },
2489
+ "assignee": "raj",
2490
+ "governance_class": "gated",
2491
+ "delivery_mode": "waterfall",
2492
+ "planned_start": "A+61"
2493
+ },
2494
+ {
2495
+ "wbs_path": "5.2",
2496
+ "name": "Final cutover",
2497
+ "type": "task",
2498
+ "status": "NOT_STARTED",
2499
+ "duration": 3,
2500
+ "estimate": {
2501
+ "optimistic": 2,
2502
+ "most_likely": 3,
2503
+ "pessimistic": 9
2504
+ },
2505
+ "assignee": "tom",
2506
+ "governance_class": "gated",
2507
+ "delivery_mode": "waterfall",
2508
+ "labels": [
2509
+ "cutover",
2510
+ "critical-path"
2511
+ ],
2512
+ "links": [
2513
+ {
2514
+ "target": "gtm-readiness:3",
2515
+ "link_type": "blocks",
2516
+ "note": "Public launch cannot proceed until the production cutover completes."
2517
+ }
2518
+ ]
2519
+ },
2520
+ {
2521
+ "wbs_path": "5.3",
2522
+ "name": "Decommission legacy",
2523
+ "type": "task",
2524
+ "status": "NOT_STARTED",
2525
+ "duration": 4,
2526
+ "estimate": {
2527
+ "optimistic": 3,
2528
+ "most_likely": 4,
2529
+ "pessimistic": 12
2530
+ },
2531
+ "assignee": "yuki",
2532
+ "governance_class": "gated",
2533
+ "delivery_mode": "waterfall",
2534
+ "labels": [
2535
+ "cutover"
2536
+ ]
2537
+ },
2538
+ {
2539
+ "wbs_path": "6",
2540
+ "name": "Migration complete",
2541
+ "is_milestone": true,
2542
+ "delivery_mode": "milestone"
2543
+ }
2544
+ ],
2545
+ "dependencies": [
2546
+ {
2547
+ "predecessor": "1.1",
2548
+ "successor": "1.2",
2549
+ "dep_type": "FS",
2550
+ "lag": 0
2551
+ },
2552
+ {
2553
+ "predecessor": "1.1",
2554
+ "successor": "1.3",
2555
+ "dep_type": "SS",
2556
+ "lag": 0
2557
+ },
2558
+ {
2559
+ "predecessor": "1.2",
2560
+ "successor": "1.4",
2561
+ "dep_type": "FS",
2562
+ "lag": 0
2563
+ },
2564
+ {
2565
+ "predecessor": "1.3",
2566
+ "successor": "1.4",
2567
+ "dep_type": "FS",
2568
+ "lag": 0
2569
+ },
2570
+ {
2571
+ "predecessor": "1.4",
2572
+ "successor": "2.1",
2573
+ "dep_type": "FS",
2574
+ "lag": 0
2575
+ },
2576
+ {
2577
+ "predecessor": "2.1",
2578
+ "successor": "2.2",
2579
+ "dep_type": "SS",
2580
+ "lag": 0
2581
+ },
2582
+ {
2583
+ "predecessor": "2.1",
2584
+ "successor": "2.3",
2585
+ "dep_type": "FS",
2586
+ "lag": 0
2587
+ },
2588
+ {
2589
+ "predecessor": "2.3",
2590
+ "successor": "2.4",
2591
+ "dep_type": "FS",
2592
+ "lag": 0
2593
+ },
2594
+ {
2595
+ "predecessor": "2.2",
2596
+ "successor": "3.1",
2597
+ "dep_type": "FS",
2598
+ "lag": 0
2599
+ },
2600
+ {
2601
+ "predecessor": "2.3",
2602
+ "successor": "3.1",
2603
+ "dep_type": "FS",
2604
+ "lag": 0
2605
+ },
2606
+ {
2607
+ "predecessor": "3.1",
2608
+ "successor": "3.2",
2609
+ "dep_type": "FS",
2610
+ "lag": 0
2611
+ },
2612
+ {
2613
+ "predecessor": "3.1",
2614
+ "successor": "3.3",
2615
+ "dep_type": "SS",
2616
+ "lag": 0
2617
+ },
2618
+ {
2619
+ "predecessor": "3.2",
2620
+ "successor": "3.4",
2621
+ "dep_type": "FS",
2622
+ "lag": 0
2623
+ },
2624
+ {
2625
+ "predecessor": "3.3",
2626
+ "successor": "3.4",
2627
+ "dep_type": "FS",
2628
+ "lag": 0
2629
+ },
2630
+ {
2631
+ "predecessor": "3.4",
2632
+ "successor": "4.1",
2633
+ "dep_type": "FS",
2634
+ "lag": 0
2635
+ },
2636
+ {
2637
+ "predecessor": "4.1",
2638
+ "successor": "4.2",
2639
+ "dep_type": "FS",
2640
+ "lag": 0
2641
+ },
2642
+ {
2643
+ "predecessor": "3.4",
2644
+ "successor": "4.3",
2645
+ "dep_type": "FS",
2646
+ "lag": 0
2647
+ },
2648
+ {
2649
+ "predecessor": "4.2",
2650
+ "successor": "5.1",
2651
+ "dep_type": "FS",
2652
+ "lag": 0
2653
+ },
2654
+ {
2655
+ "predecessor": "4.3",
2656
+ "successor": "5.1",
2657
+ "dep_type": "FS",
2658
+ "lag": 0
2659
+ },
2660
+ {
2661
+ "predecessor": "5.1",
2662
+ "successor": "5.2",
2663
+ "dep_type": "FS",
2664
+ "lag": 0
2665
+ },
2666
+ {
2667
+ "predecessor": "5.2",
2668
+ "successor": "5.3",
2669
+ "dep_type": "FS",
2670
+ "lag": 0
2671
+ },
2672
+ {
2673
+ "predecessor": "5.3",
2674
+ "successor": "6",
2675
+ "dep_type": "FS",
2676
+ "lag": 0
2677
+ },
2678
+ {
2679
+ "predecessor": "platform-core:2.1",
2680
+ "successor": "2.1",
2681
+ "dep_type": "FS",
2682
+ "lag": 5
2683
+ }
2684
+ ],
2685
+ "baselines": [
2686
+ {
2687
+ "name": "Kickoff baseline",
2688
+ "is_active": false,
2689
+ "captured_at": "A-87",
2690
+ "tasks": [
2691
+ {
2692
+ "task": "1.1",
2693
+ "start": "A-90",
2694
+ "finish": "A-85",
2695
+ "duration": 5
2696
+ },
2697
+ {
2698
+ "task": "1.2",
2699
+ "start": "A-83",
2700
+ "finish": "A-79",
2701
+ "duration": 4
2702
+ },
2703
+ {
2704
+ "task": "1.3",
2705
+ "start": "A-88",
2706
+ "finish": "A-82",
2707
+ "duration": 6
2708
+ },
2709
+ {
2710
+ "task": "1.4",
2711
+ "start": "A-77",
2712
+ "finish": "A-74",
2713
+ "duration": 3
2714
+ },
2715
+ {
2716
+ "task": "2.1",
2717
+ "start": "A-46",
2718
+ "finish": "A-38",
2719
+ "duration": 8
2720
+ },
2721
+ {
2722
+ "task": "2.2",
2723
+ "start": "A-42",
2724
+ "finish": "A-35",
2725
+ "duration": 7
2726
+ },
2727
+ {
2728
+ "task": "2.3",
2729
+ "start": "A-36",
2730
+ "finish": "A-30",
2731
+ "duration": 6
2732
+ },
2733
+ {
2734
+ "task": "2.4",
2735
+ "start": "A-28",
2736
+ "finish": "A-24",
2737
+ "duration": 4
2738
+ },
2739
+ {
2740
+ "task": "3.1",
2741
+ "start": "A-18",
2742
+ "finish": "A-13",
2743
+ "duration": 5
2744
+ },
2745
+ {
2746
+ "task": "3.2",
2747
+ "start": "A+4",
2748
+ "finish": "A+8",
2749
+ "duration": 4
2750
+ },
2751
+ {
2752
+ "task": "3.3",
2753
+ "start": "A-6",
2754
+ "finish": "A+0",
2755
+ "duration": 6
2756
+ },
2757
+ {
2758
+ "task": "3.4",
2759
+ "start": "A+11",
2760
+ "finish": "A+16",
2761
+ "duration": 5
2762
+ },
2763
+ {
2764
+ "task": "4.1",
2765
+ "start": "A+26",
2766
+ "finish": "A+29",
2767
+ "duration": 3
2768
+ },
2769
+ {
2770
+ "task": "4.2",
2771
+ "start": "A+31",
2772
+ "finish": "A+35",
2773
+ "duration": 4
2774
+ },
2775
+ {
2776
+ "task": "4.3",
2777
+ "start": "A+28",
2778
+ "finish": "A+31",
2779
+ "duration": 3
2780
+ },
2781
+ {
2782
+ "task": "5.1",
2783
+ "start": "A+55",
2784
+ "finish": "A+57",
2785
+ "duration": 2
2786
+ },
2787
+ {
2788
+ "task": "5.2",
2789
+ "start": "A+60",
2790
+ "finish": "A+63",
2791
+ "duration": 3
2792
+ },
2793
+ {
2794
+ "task": "5.3",
2795
+ "start": "A+63",
2796
+ "finish": "A+67",
2797
+ "duration": 4
2798
+ }
2799
+ ]
2800
+ }
2801
+ ],
2802
+ "risks": [
2803
+ {
2804
+ "slug": "mt-data-quality",
2805
+ "title": "Legacy data quality worse than profiled",
2806
+ "description": "Undocumented nulls and encoding issues could expand the transform effort.",
2807
+ "status": "OPEN",
2808
+ "probability": 4,
2809
+ "impact": 4,
2810
+ "category": "TECHNICAL",
2811
+ "response": "MITIGATE",
2812
+ "owner": "yuki",
2813
+ "tasks": [
2814
+ "1.2",
2815
+ "2.2"
2816
+ ]
2817
+ },
2818
+ {
2819
+ "slug": "mt-cutover-window",
2820
+ "title": "Cutover window too short",
2821
+ "description": "The approved freeze window may not absorb a failed first cutover.",
2822
+ "status": "MITIGATING",
2823
+ "probability": 3,
2824
+ "impact": 5,
2825
+ "category": "EXTERNAL",
2826
+ "response": "MITIGATE",
2827
+ "mitigation_due_date": "A+25",
2828
+ "owner": "sam",
2829
+ "tasks": [
2830
+ "5.2"
2831
+ ]
2832
+ },
2833
+ {
2834
+ "slug": "mt-perf",
2835
+ "title": "Migration throughput below target",
2836
+ "description": "Delta-sync throughput may not keep pace with production write volume.",
2837
+ "status": "OPEN",
2838
+ "probability": 3,
2839
+ "impact": 4,
2840
+ "category": "TECHNICAL",
2841
+ "response": "ACCEPT",
2842
+ "owner": "omar",
2843
+ "tasks": [
2844
+ "3.3"
2845
+ ]
2846
+ },
2847
+ {
2848
+ "slug": "mt-rollback",
2849
+ "title": "No tested rollback for a failed cutover",
2850
+ "description": "A failed production cutover without a rehearsed rollback strands the migration.",
2851
+ "status": "OPEN",
2852
+ "probability": 2,
2853
+ "impact": 5,
2854
+ "category": "TECHNICAL",
2855
+ "response": "MITIGATE",
2856
+ "owner": "sam",
2857
+ "tasks": [
2858
+ "5.3"
2859
+ ]
2860
+ },
2861
+ {
2862
+ "slug": "mt-mapping",
2863
+ "title": "Field-mapping ambiguity in legacy schema",
2864
+ "status": "OPEN",
2865
+ "probability": 3,
2866
+ "impact": 3,
2867
+ "category": "TECHNICAL",
2868
+ "response": "MITIGATE",
2869
+ "mitigation_due_date": "A-28",
2870
+ "owner": "omar",
2871
+ "tasks": [
2872
+ "1.3"
2873
+ ]
2874
+ }
2875
+ ]
2876
+ },
2877
+ {
2878
+ "slug": "gtm-readiness",
2879
+ "name": "GTM Readiness",
2880
+ "code": "GTM",
2881
+ "description": "The hybrid stream — gated launch planning with agile enablement content.",
2882
+ "methodology": "HYBRID",
2883
+ "start_date": "A-50",
2884
+ "calendar": "gtm-regional",
2885
+ "members": [
2886
+ {
2887
+ "account": "alex",
2888
+ "role": "OWNER"
2889
+ },
2890
+ {
2891
+ "account": "jordan",
2892
+ "role": "OWNER"
2893
+ },
2894
+ {
2895
+ "account": "sam",
2896
+ "role": "SCHEDULER"
2897
+ },
2898
+ {
2899
+ "account": "clara",
2900
+ "role": "MEMBER"
2901
+ },
2902
+ {
2903
+ "account": "lena",
2904
+ "role": "MEMBER"
2905
+ },
2906
+ {
2907
+ "account": "ada",
2908
+ "role": "VIEWER"
2909
+ },
2910
+ {
2911
+ "account": "visitor",
2912
+ "role": "MEMBER"
2913
+ }
2914
+ ],
2915
+ "default_view": "OVERVIEW",
2916
+ "forecast_history": {
2917
+ "days": 60,
2918
+ "commitment_finish": "A+76",
2919
+ "cpm_start": "A+70",
2920
+ "cpm_end": "A+82",
2921
+ "p50_start": "A+74",
2922
+ "p50_end": "A+86",
2923
+ "p80_start": "A+80",
2924
+ "p80_end": "A+92",
2925
+ "p95_start": "A+86",
2926
+ "p95_end": "A+102",
2927
+ "mc_iterations": 2000,
2928
+ "completion_ratio": 0.35
2929
+ },
2930
+ "labels": [
2931
+ {
2932
+ "slug": "launch-blocker",
2933
+ "name": "Launch blocker",
2934
+ "color": "rose",
2935
+ "position": 0
2936
+ },
2937
+ {
2938
+ "slug": "content",
2939
+ "name": "Content",
2940
+ "color": "teal",
2941
+ "position": 1
2942
+ },
2943
+ {
2944
+ "slug": "pricing",
2945
+ "name": "Pricing",
2946
+ "color": "amber",
2947
+ "position": 2
2948
+ }
2949
+ ],
2950
+ "tasks": [
2951
+ {
2952
+ "wbs_path": "1",
2953
+ "name": "Launch planning",
2954
+ "governance_class": "gated",
2955
+ "delivery_mode": "waterfall"
2956
+ },
2957
+ {
2958
+ "wbs_path": "1.1",
2959
+ "name": "Positioning & messaging",
2960
+ "duration": 4,
2961
+ "planned_start": "A-48",
2962
+ "estimate": {
2963
+ "optimistic": 3,
2964
+ "most_likely": 4,
2965
+ "pessimistic": 7
2966
+ },
2967
+ "status": "COMPLETE",
2968
+ "percent_complete": 100.0,
2969
+ "governance_class": "gated",
2970
+ "delivery_mode": "waterfall",
2971
+ "assignee": "jordan"
2972
+ },
2973
+ {
2974
+ "wbs_path": "1.2",
2975
+ "name": "Pricing & packaging sign-off",
2976
+ "duration": 3,
2977
+ "planned_start": "A-9",
2978
+ "estimate": {
2979
+ "optimistic": 2,
2980
+ "most_likely": 3,
2981
+ "pessimistic": 5
2982
+ },
2983
+ "status": "IN_PROGRESS",
2984
+ "percent_complete": 60.0,
2985
+ "governance_class": "gated",
2986
+ "delivery_mode": "waterfall",
2987
+ "assignee": "jordan",
2988
+ "labels": [
2989
+ "pricing",
2990
+ "launch-blocker"
2991
+ ]
2992
+ },
2993
+ {
2994
+ "wbs_path": "1.3",
2995
+ "name": "Launch gate review",
2996
+ "duration": 2,
2997
+ "planned_start": "A+6",
2998
+ "estimate": {
2999
+ "optimistic": 1,
3000
+ "most_likely": 2,
3001
+ "pessimistic": 4
3002
+ },
3003
+ "status": "NOT_STARTED",
3004
+ "governance_class": "gated",
3005
+ "delivery_mode": "waterfall",
3006
+ "assignee": "jordan",
3007
+ "labels": [
3008
+ "launch-blocker"
3009
+ ]
3010
+ },
3011
+ {
3012
+ "wbs_path": "2",
3013
+ "name": "Enablement",
3014
+ "governance_class": "flow",
3015
+ "delivery_mode": "scrum"
3016
+ },
3017
+ {
3018
+ "wbs_path": "2.1",
3019
+ "name": "Sales deck",
3020
+ "type": "story",
3021
+ "status": "COMPLETE",
3022
+ "percent_complete": 100.0,
3023
+ "story_points": 5,
3024
+ "assignee": "clara",
3025
+ "sprint": "gtm-sprint-1",
3026
+ "governance_class": "flow",
3027
+ "delivery_mode": "scrum",
3028
+ "labels": [
3029
+ "content"
3030
+ ],
3031
+ "dor": "ready"
3032
+ },
3033
+ {
3034
+ "wbs_path": "2.2",
3035
+ "name": "Demo script",
3036
+ "type": "story",
3037
+ "status": "COMPLETE",
3038
+ "percent_complete": 100.0,
3039
+ "story_points": 3,
3040
+ "assignee": "clara",
3041
+ "sprint": "gtm-sprint-1",
3042
+ "governance_class": "flow",
3043
+ "delivery_mode": "scrum",
3044
+ "dor": "ready"
3045
+ },
3046
+ {
3047
+ "wbs_path": "2.3",
3048
+ "name": "Pricing FAQ",
3049
+ "type": "story",
3050
+ "status": "COMPLETE",
3051
+ "percent_complete": 100.0,
3052
+ "story_points": 5,
3053
+ "assignee": "jordan",
3054
+ "sprint": "gtm-sprint-1",
3055
+ "governance_class": "flow",
3056
+ "delivery_mode": "scrum",
3057
+ "dor": "ready"
3058
+ },
3059
+ {
3060
+ "wbs_path": "2.4",
3061
+ "name": "Onboarding guide",
3062
+ "type": "story",
3063
+ "status": "COMPLETE",
3064
+ "percent_complete": 100.0,
3065
+ "story_points": 5,
3066
+ "assignee": "clara",
3067
+ "sprint": "gtm-sprint-2",
3068
+ "governance_class": "flow",
3069
+ "delivery_mode": "scrum",
3070
+ "dor": "ready"
3071
+ },
3072
+ {
3073
+ "wbs_path": "2.5",
3074
+ "name": "Launch blog",
3075
+ "type": "story",
3076
+ "status": "IN_PROGRESS",
3077
+ "percent_complete": 40.0,
3078
+ "story_points": 3,
3079
+ "remaining_points": 2,
3080
+ "assignee": "clara",
3081
+ "sprint": "gtm-sprint-2",
3082
+ "governance_class": "flow",
3083
+ "delivery_mode": "scrum",
3084
+ "labels": [
3085
+ "content"
3086
+ ],
3087
+ "dor": "ready"
3088
+ },
3089
+ {
3090
+ "wbs_path": "2.6",
3091
+ "name": "Webinar prep",
3092
+ "type": "story",
3093
+ "status": "NOT_STARTED",
3094
+ "story_points": 5,
3095
+ "assignee": "clara",
3096
+ "sprint": "gtm-sprint-2",
3097
+ "governance_class": "flow",
3098
+ "delivery_mode": "scrum",
3099
+ "dor": "ready"
3100
+ },
3101
+ {
3102
+ "wbs_path": "2.9",
3103
+ "name": "Pricing page copy",
3104
+ "type": "story",
3105
+ "status": "NOT_STARTED",
3106
+ "story_points": 1,
3107
+ "assignee": "jordan",
3108
+ "sprint": "gtm-sprint-2",
3109
+ "governance_class": "flow",
3110
+ "delivery_mode": "scrum",
3111
+ "dor": "ready"
3112
+ },
3113
+ {
3114
+ "wbs_path": "2.7",
3115
+ "name": "Support runbook",
3116
+ "type": "story",
3117
+ "status": "BACKLOG",
3118
+ "story_points": 5,
3119
+ "assignee": "clara",
3120
+ "sprint": "gtm-sprint-3",
3121
+ "governance_class": "flow",
3122
+ "delivery_mode": "scrum",
3123
+ "labels": [
3124
+ "content"
3125
+ ]
3126
+ },
3127
+ {
3128
+ "wbs_path": "2.8",
3129
+ "name": "Release notes",
3130
+ "type": "story",
3131
+ "status": "BACKLOG",
3132
+ "story_points": 3,
3133
+ "assignee": "clara",
3134
+ "sprint": "gtm-sprint-3",
3135
+ "governance_class": "flow",
3136
+ "delivery_mode": "scrum"
3137
+ },
3138
+ {
3139
+ "wbs_path": "3",
3140
+ "name": "Public launch",
3141
+ "is_milestone": true,
3142
+ "delivery_mode": "milestone",
3143
+ "planned_start": "A+80"
3144
+ }
3145
+ ],
3146
+ "dependencies": [
3147
+ {
3148
+ "predecessor": "1.1",
3149
+ "successor": "1.2",
3150
+ "dep_type": "FS",
3151
+ "lag": 0
3152
+ },
3153
+ {
3154
+ "predecessor": "1.2",
3155
+ "successor": "1.3",
3156
+ "dep_type": "FS",
3157
+ "lag": -2
3158
+ },
3159
+ {
3160
+ "predecessor": "1.2",
3161
+ "successor": "2.5",
3162
+ "dep_type": "FF",
3163
+ "lag": 0
3164
+ },
3165
+ {
3166
+ "predecessor": "1.3",
3167
+ "successor": "2.6",
3168
+ "dep_type": "SF",
3169
+ "lag": 0
3170
+ },
3171
+ {
3172
+ "predecessor": "1.3",
3173
+ "successor": "3",
3174
+ "dep_type": "FS",
3175
+ "lag": 2
3176
+ },
3177
+ {
3178
+ "predecessor": "migration-tooling:6",
3179
+ "successor": "3",
3180
+ "dep_type": "FS",
3181
+ "lag": 3
3182
+ }
3183
+ ],
3184
+ "sprints": [
3185
+ {
3186
+ "slug": "gtm-sprint-1",
3187
+ "name": "Enablement 1",
3188
+ "goal": "Core selling kit.",
3189
+ "state": "COMPLETED",
3190
+ "start_date": "A-20",
3191
+ "finish_date": "A-7",
3192
+ "capacity_points": 14,
3193
+ "committed_points": 13,
3194
+ "completed_points": 13
3195
+ },
3196
+ {
3197
+ "slug": "gtm-sprint-2",
3198
+ "name": "Enablement 2",
3199
+ "goal": "Onboarding and launch content.",
3200
+ "state": "ACTIVE",
3201
+ "start_date": "A-6",
3202
+ "finish_date": "A+7",
3203
+ "capacity_points": 14,
3204
+ "committed_points": 14
3205
+ },
3206
+ {
3207
+ "slug": "gtm-sprint-3",
3208
+ "name": "Enablement 3",
3209
+ "goal": "Support readiness and release notes.",
3210
+ "state": "PLANNED",
3211
+ "start_date": "A+8",
3212
+ "finish_date": "A+21",
3213
+ "capacity_points": 14
3214
+ }
3215
+ ],
3216
+ "baselines": [
3217
+ {
3218
+ "name": "Launch-planning baseline",
3219
+ "is_active": true,
3220
+ "captured_at": "A-47",
3221
+ "tasks": [
3222
+ {
3223
+ "task": "1.1",
3224
+ "start": "A-48",
3225
+ "finish": "A-44",
3226
+ "duration": 4
3227
+ },
3228
+ {
3229
+ "task": "1.2",
3230
+ "start": "A-12",
3231
+ "finish": "A-9",
3232
+ "duration": 3
3233
+ },
3234
+ {
3235
+ "task": "1.3",
3236
+ "start": "A+3",
3237
+ "finish": "A+5",
3238
+ "duration": 2
3239
+ },
3240
+ {
3241
+ "task": "2.1",
3242
+ "story_points": 5
3243
+ },
3244
+ {
3245
+ "task": "2.2",
3246
+ "story_points": 3
3247
+ },
3248
+ {
3249
+ "task": "2.3",
3250
+ "story_points": 5
3251
+ },
3252
+ {
3253
+ "task": "2.4",
3254
+ "story_points": 5
3255
+ },
3256
+ {
3257
+ "task": "2.5",
3258
+ "story_points": 3
3259
+ },
3260
+ {
3261
+ "task": "2.6",
3262
+ "story_points": 5
3263
+ },
3264
+ {
3265
+ "task": "2.9",
3266
+ "story_points": 1
3267
+ },
3268
+ {
3269
+ "task": "2.7",
3270
+ "story_points": 5
3271
+ },
3272
+ {
3273
+ "task": "2.8",
3274
+ "story_points": 3
3275
+ }
3276
+ ]
3277
+ }
3278
+ ],
3279
+ "risks": [
3280
+ {
3281
+ "slug": "gtm-launch-slip",
3282
+ "title": "Launch slips past fiscal quarter",
3283
+ "description": "A migration slip cascades to the public-launch milestone and misses the quarter.",
3284
+ "status": "OPEN",
3285
+ "probability": 3,
3286
+ "impact": 4,
3287
+ "category": "EXTERNAL",
3288
+ "response": "MITIGATE",
3289
+ "owner": "alex",
3290
+ "tasks": [
3291
+ "3"
3292
+ ]
3293
+ },
3294
+ {
3295
+ "slug": "gtm-pricing",
3296
+ "title": "Pricing & packaging not signed off",
3297
+ "status": "OPEN",
3298
+ "probability": 3,
3299
+ "impact": 4,
3300
+ "category": "ORGANIZATIONAL",
3301
+ "response": "MITIGATE",
3302
+ "owner": "jordan",
3303
+ "tasks": [
3304
+ "1.2"
3305
+ ]
3306
+ },
3307
+ {
3308
+ "slug": "gtm-enablement",
3309
+ "title": "Sales enablement lag at launch",
3310
+ "status": "ACCEPTED",
3311
+ "probability": 2,
3312
+ "impact": 3,
3313
+ "category": "ORGANIZATIONAL",
3314
+ "response": "ACCEPT",
3315
+ "owner": "clara",
3316
+ "tasks": [
3317
+ "2.1"
3318
+ ]
3319
+ },
3320
+ {
3321
+ "slug": "gtm-analyst",
3322
+ "title": "Analyst-briefing embargo conflict",
3323
+ "status": "OPEN",
3324
+ "probability": 2,
3325
+ "impact": 2,
3326
+ "category": "EXTERNAL",
3327
+ "response": "ACCEPT",
3328
+ "owner": "ada",
3329
+ "notes": "Embargo dates aligned with the launch gate; closed.",
3330
+ "tasks": [
3331
+ "1.3"
3332
+ ]
3333
+ }
3334
+ ],
3335
+ "team": {
3336
+ "name": "GTM Enablement",
3337
+ "members": [
3338
+ {
3339
+ "account": "sam",
3340
+ "scrum_master": true
3341
+ },
3342
+ {
3343
+ "account": "jordan",
3344
+ "product_owner": true
3345
+ }
3346
+ ]
3347
+ }
3348
+ }
3349
+ ],
3350
+ "events": [
3351
+ {
3352
+ "at": "A-89T10:00",
3353
+ "action": "risk.note",
3354
+ "target": "risk:prog-cross-team-dependency",
3355
+ "actor": "alex",
3356
+ "body": "Tracked at the program level — the register has no program-level risk model yet, so this sits on Platform Core, but it spans all three projects: a slip on the Core API (2.1) ripples into the migration cutover (2.1) and then the GTM launch gate (3). Weekly cross-team sync is the mitigation for now."
3357
+ },
3358
+ {
3359
+ "at": "A-89T10:15",
3360
+ "action": "risk.note",
3361
+ "target": "risk:prog-budget",
3362
+ "actor": "ada",
3363
+ "body": "Program-level risk, materialized here on Platform Core for the same reason as the others above — no program-level risk model yet. The contractor rate increase is confirmed for the back half of the program; holding it against the existing contingency rather than requesting more budget."
3364
+ },
3365
+ {
3366
+ "at": "A-89T10:30",
3367
+ "action": "risk.note",
3368
+ "target": "risk:prog-regulatory",
3369
+ "actor": "alex",
3370
+ "body": "Program-level risk sitting on Platform Core in the register — it actually gates two projects: billing go-live (Platform Core 4.1) and the production cutover (Migration Tooling 5.2). Compliance review is scheduled; no findings yet."
3371
+ },
3372
+ {
3373
+ "at": "A-89T10:45",
3374
+ "action": "risk.note",
3375
+ "target": "risk:prog-resource-contention",
3376
+ "actor": "sam",
3377
+ "body": "Program-level risk on Platform Core by the same convention. The actual contention is Sam pulled across Core API (3.1) and GTM readiness (2.1) in the same sprint — sequencing rather than adding people, per the contingency."
3378
+ },
3379
+ {
3380
+ "at": "A-62T09:00",
3381
+ "action": "sprint.activate",
3382
+ "target": "sprint:platform-core:pc-sprint-1",
3383
+ "actor": "sam"
3384
+ },
3385
+ {
3386
+ "at": "A-61T09:00",
3387
+ "action": "task.comment",
3388
+ "target": "task:platform-core:1.1",
3389
+ "actor": "mei",
3390
+ "body": "Starting SSO — OIDC discovery and the login callback."
3391
+ },
3392
+ {
3393
+ "at": "A-60T10:00",
3394
+ "action": "task.status",
3395
+ "target": "task:platform-core:1.1",
3396
+ "actor": "mei",
3397
+ "to": "IN_PROGRESS"
3398
+ },
3399
+ {
3400
+ "at": "A-58T09:00",
3401
+ "action": "task.comment",
3402
+ "target": "task:platform-core:2.1",
3403
+ "actor": "priya",
3404
+ "body": "Omar's pulled onto the migration assessment — moving Tenant model to Diego."
3405
+ },
3406
+ {
3407
+ "at": "A-58T09:05",
3408
+ "action": "task.assign",
3409
+ "target": "task:platform-core:2.1",
3410
+ "actor": "priya",
3411
+ "assignee": "diego"
3412
+ },
3413
+ {
3414
+ "at": "A-58T09:10",
3415
+ "action": "risk.note",
3416
+ "target": "risk:pc-velocity-dip",
3417
+ "actor": "priya",
3418
+ "body": "Two new engineers ramped onto Core API this sprint — the Tenant model reassignment above is exactly the kind of shuffle this risk expects. Velocity held at 90% of the pre-expansion baseline; watching one more sprint before deciding whether the re-baseline in the contingency is actually needed."
3419
+ },
3420
+ {
3421
+ "at": "A-56T15:00",
3422
+ "action": "task.comment",
3423
+ "target": "task:platform-core:1.1",
3424
+ "actor": "mei",
3425
+ "body": "SSO login works against the IdP sandbox. PR up for review."
3426
+ },
3427
+ {
3428
+ "at": "A-56T15:30",
3429
+ "action": "task.status",
3430
+ "target": "task:platform-core:1.1",
3431
+ "actor": "mei",
3432
+ "to": "REVIEW"
3433
+ },
3434
+ {
3435
+ "at": "A-55T11:00",
3436
+ "action": "task.comment",
3437
+ "target": "task:platform-core:1.1",
3438
+ "actor": "priya",
3439
+ "body": "Security review: the state param isn't validated on the callback — that's a login CSRF hole. Sending it back, and logging it as an audit finding.",
3440
+ "slug": "sso-security-review"
3441
+ },
3442
+ {
3443
+ "at": "A-55T11:30",
3444
+ "action": "task.status",
3445
+ "target": "task:platform-core:1.1",
3446
+ "actor": "priya",
3447
+ "to": "IN_PROGRESS"
3448
+ },
3449
+ {
3450
+ "at": "A-55T11:45",
3451
+ "action": "risk.note",
3452
+ "target": "risk:prog-security-audit",
3453
+ "actor": "priya",
3454
+ "body": "Program-level risk sitting on Platform Core because there's no program risk model — the audit actually covers the SSO work (1.1) Mei and I are pairing on. Third-party audit flagged two findings; both are inside the SSO hardening already in flight, not new work."
3455
+ },
3456
+ {
3457
+ "at": "A-55T12:00",
3458
+ "action": "risk.status",
3459
+ "target": "risk:prog-security-audit",
3460
+ "actor": "priya",
3461
+ "to": "MITIGATING"
3462
+ },
3463
+ {
3464
+ "at": "A-54T09:45",
3465
+ "action": "risk.note",
3466
+ "target": "risk:pc-sso-vendor",
3467
+ "actor": "mei",
3468
+ "body": "Vendor slipped their sandbox milestone by a week. Raising to mitigating and spiking a fallback IdP (1.10) so a slip past the Sprint 6 gate is a decision we make, not one made for us."
3469
+ },
3470
+ {
3471
+ "at": "A-54T10:00",
3472
+ "action": "risk.status",
3473
+ "target": "risk:pc-sso-vendor",
3474
+ "actor": "mei",
3475
+ "to": "MITIGATING"
3476
+ },
3477
+ {
3478
+ "at": "A-16T16:00",
3479
+ "action": "risk.note",
3480
+ "target": "risk:pc-sso-vendor",
3481
+ "actor": "mei",
3482
+ "body": "Fallback spike done — the interim OIDC profile carries login and defers only enterprise SSO. Certification is still open, but the critical path no longer runs through it."
3483
+ },
3484
+ {
3485
+ "at": "A-52T14:00",
3486
+ "action": "task.comment",
3487
+ "target": "task:platform-core:1.1",
3488
+ "actor": "mei",
3489
+ "body": "Validated state and nonce on the callback and added a regression test. Re-review please.",
3490
+ "reply_to": "sso-security-review"
3491
+ },
3492
+ {
3493
+ "at": "A-52T14:30",
3494
+ "action": "task.status",
3495
+ "target": "task:platform-core:1.1",
3496
+ "actor": "mei",
3497
+ "to": "REVIEW"
3498
+ },
3499
+ {
3500
+ "at": "A-51T16:00",
3501
+ "action": "task.comment",
3502
+ "target": "task:platform-core:1.1",
3503
+ "actor": "priya",
3504
+ "body": "Solid now. Approving.",
3505
+ "reply_to": "sso-security-review",
3506
+ "slug": "sso-approval"
3507
+ },
3508
+ {
3509
+ "at": "A-51T16:30",
3510
+ "action": "task.status",
3511
+ "target": "task:platform-core:1.1",
3512
+ "actor": "priya",
3513
+ "to": "COMPLETE"
3514
+ },
3515
+ {
3516
+ "at": "A-49T16:30",
3517
+ "action": "task.comment",
3518
+ "target": "task:platform-core:2.4",
3519
+ "actor": "tom",
3520
+ "body": "API key rotation slipped behind the SSO rework — carrying it into Sprint 2."
3521
+ },
3522
+ {
3523
+ "at": "A-49T17:00",
3524
+ "action": "sprint.close",
3525
+ "target": "sprint:platform-core:pc-sprint-1",
3526
+ "actor": "sam",
3527
+ "goal_outcome": "MET"
3528
+ },
3529
+ {
3530
+ "at": "A-48T09:00",
3531
+ "action": "sprint.activate",
3532
+ "target": "sprint:platform-core:pc-sprint-2",
3533
+ "actor": "sam"
3534
+ },
3535
+ {
3536
+ "at": "A-45T09:00",
3537
+ "action": "risk.status",
3538
+ "target": "risk:prog-exec-sponsor",
3539
+ "actor": "ada",
3540
+ "to": "MITIGATING"
3541
+ },
3542
+ {
3543
+ "at": "A-44T10:00",
3544
+ "action": "task.comment",
3545
+ "target": "task:gtm-readiness:1.2",
3546
+ "actor": "jordan",
3547
+ "body": "Positioning is locked; the pricing review with Finance is the long pole now."
3548
+ },
3549
+ {
3550
+ "at": "A-44T10:15",
3551
+ "action": "risk.note",
3552
+ "target": "risk:gtm-pricing",
3553
+ "actor": "jordan",
3554
+ "body": "Finance pricing review is booked but not yet held. Packaging tiers are drafted and don't block enablement content, so this doesn't gate anything else yet — just watching the calendar."
3555
+ },
3556
+ {
3557
+ "at": "A-44T10:30",
3558
+ "action": "risk.note",
3559
+ "target": "risk:gtm-launch-slip",
3560
+ "actor": "alex",
3561
+ "body": "Migration is still tracking to the committed cutover date, so the quarter-end launch date holds for now. This is the one to watch if the cutover-window risk on Migration Tooling fires."
3562
+ },
3563
+ {
3564
+ "at": "A-44T10:45",
3565
+ "action": "risk.note",
3566
+ "target": "risk:gtm-enablement",
3567
+ "actor": "clara",
3568
+ "body": "Accepting the enablement lag as scoped — the sales deck ships a week behind GA rather than day-of. Sales ops confirmed that's workable against the pipeline."
3569
+ },
3570
+ {
3571
+ "at": "A-42T09:00",
3572
+ "action": "task.comment",
3573
+ "target": "task:migration-tooling:2.2",
3574
+ "actor": "yuki",
3575
+ "body": "Schema transformer scaffolded; wiring the field-mapping table."
3576
+ },
3577
+ {
3578
+ "at": "A-41T10:00",
3579
+ "action": "task.status",
3580
+ "target": "task:migration-tooling:2.2",
3581
+ "actor": "yuki",
3582
+ "to": "IN_PROGRESS"
3583
+ },
3584
+ {
3585
+ "at": "A-38T10:00",
3586
+ "action": "risk.status",
3587
+ "target": "risk:gtm-analyst",
3588
+ "actor": "ada",
3589
+ "to": "MITIGATING"
3590
+ },
3591
+ {
3592
+ "at": "A-35T15:00",
3593
+ "action": "task.comment",
3594
+ "target": "task:migration-tooling:2.2",
3595
+ "actor": "yuki",
3596
+ "body": "Transform passes on the sample extract. Ready for review."
3597
+ },
3598
+ {
3599
+ "at": "A-35T15:30",
3600
+ "action": "task.status",
3601
+ "target": "task:migration-tooling:2.2",
3602
+ "actor": "yuki",
3603
+ "to": "REVIEW"
3604
+ },
3605
+ {
3606
+ "at": "A-35T17:00",
3607
+ "action": "sprint.close",
3608
+ "target": "sprint:platform-core:pc-sprint-2",
3609
+ "actor": "sam",
3610
+ "goal_outcome": "MET"
3611
+ },
3612
+ {
3613
+ "at": "A-34T09:00",
3614
+ "action": "sprint.activate",
3615
+ "target": "sprint:platform-core:pc-sprint-3",
3616
+ "actor": "sam"
3617
+ },
3618
+ {
3619
+ "at": "A-34T11:00",
3620
+ "action": "task.comment",
3621
+ "target": "task:migration-tooling:2.2",
3622
+ "actor": "omar",
3623
+ "body": "Review: the account-type enum maps three legacy codes to one, which silently drops a distinction Finance relies on. Sending it back.",
3624
+ "slug": "mt-enum-review"
3625
+ },
3626
+ {
3627
+ "at": "A-34T11:30",
3628
+ "action": "task.status",
3629
+ "target": "task:migration-tooling:2.2",
3630
+ "actor": "omar",
3631
+ "to": "IN_PROGRESS"
3632
+ },
3633
+ {
3634
+ "at": "A-34T12:00",
3635
+ "action": "risk.status",
3636
+ "target": "risk:mt-mapping",
3637
+ "actor": "omar",
3638
+ "to": "MITIGATING"
3639
+ },
3640
+ {
3641
+ "at": "A-34T12:15",
3642
+ "action": "risk.note",
3643
+ "target": "risk:mt-mapping",
3644
+ "actor": "omar",
3645
+ "body": "The account-type enum collapse I caught in review is exactly this risk landing — three legacy codes into one dropped a distinction Finance relies on. Yuki split the mapping and added a reconciliation check; watching for other collapsed enums in the remaining tables."
3646
+ },
3647
+ {
3648
+ "at": "A-31T14:00",
3649
+ "action": "task.comment",
3650
+ "target": "task:migration-tooling:2.2",
3651
+ "actor": "yuki",
3652
+ "body": "Split the enum mapping and added a reconciliation check. Re-review.",
3653
+ "reply_to": "mt-enum-review"
3654
+ },
3655
+ {
3656
+ "at": "A-31T14:30",
3657
+ "action": "task.status",
3658
+ "target": "task:migration-tooling:2.2",
3659
+ "actor": "yuki",
3660
+ "to": "REVIEW"
3661
+ },
3662
+ {
3663
+ "at": "A-31T20:00",
3664
+ "action": "risk.note",
3665
+ "target": "risk:prog-exec-sponsor",
3666
+ "actor": "ada",
3667
+ "body": "Program-level risk on Platform Core, though the transition itself was organizational rather than project-specific: the new sponsor completed onboarding and reconfirmed launch funding in writing. Resolving — no follow-up needed from any of the three projects."
3668
+ },
3669
+ {
3670
+ "at": "A-30T09:00",
3671
+ "action": "risk.status",
3672
+ "target": "risk:prog-exec-sponsor",
3673
+ "actor": "ada",
3674
+ "to": "RESOLVED"
3675
+ },
3676
+ {
3677
+ "at": "A-30T16:00",
3678
+ "action": "task.comment",
3679
+ "target": "task:migration-tooling:2.2",
3680
+ "actor": "omar",
3681
+ "body": "Reconciles now. Approved.",
3682
+ "reply_to": "mt-enum-review"
3683
+ },
3684
+ {
3685
+ "at": "A-30T16:30",
3686
+ "action": "task.status",
3687
+ "target": "task:migration-tooling:2.2",
3688
+ "actor": "omar",
3689
+ "to": "COMPLETE"
3690
+ },
3691
+ {
3692
+ "at": "A-26T09:45",
3693
+ "action": "risk.note",
3694
+ "target": "risk:gtm-analyst",
3695
+ "actor": "ada",
3696
+ "body": "Embargo dates confirmed with both analyst firms against the launch gate — no conflict after all. Closing this out."
3697
+ },
3698
+ {
3699
+ "at": "A-26T10:00",
3700
+ "action": "risk.status",
3701
+ "target": "risk:gtm-analyst",
3702
+ "actor": "ada",
3703
+ "to": "CLOSED"
3704
+ },
3705
+ {
3706
+ "at": "A-21T16:00",
3707
+ "action": "task.comment",
3708
+ "target": "task:platform-core:4.6",
3709
+ "actor": "nadia",
3710
+ "body": "Billing sandbox access blocked both 3-pointers — carrying Credit memo flow and Notification templates into Sprint 4."
3711
+ },
3712
+ {
3713
+ "at": "A-21T17:00",
3714
+ "action": "sprint.close",
3715
+ "target": "sprint:platform-core:pc-sprint-3",
3716
+ "actor": "sam",
3717
+ "goal_outcome": "PARTIAL"
3718
+ },
3719
+ {
3720
+ "at": "A-20T09:00",
3721
+ "action": "sprint.activate",
3722
+ "target": "sprint:platform-core:pc-sprint-4",
3723
+ "actor": "sam"
3724
+ },
3725
+ {
3726
+ "at": "A-20T09:30",
3727
+ "action": "sprint.activate",
3728
+ "target": "sprint:gtm-readiness:gtm-sprint-1",
3729
+ "actor": "jordan"
3730
+ },
3731
+ {
3732
+ "at": "A-20T10:00",
3733
+ "action": "retro.action",
3734
+ "target": "sprint:platform-core:pc-sprint-3",
3735
+ "actor": "priya",
3736
+ "assignee": "priya",
3737
+ "points": 1,
3738
+ "body": "Cap review WIP at 2"
3739
+ },
3740
+ {
3741
+ "at": "A-20T10:05",
3742
+ "action": "retro.action",
3743
+ "target": "sprint:platform-core:pc-sprint-3",
3744
+ "actor": "sam",
3745
+ "assignee": "sam",
3746
+ "points": 2,
3747
+ "notes": "Sprint 3 closed PARTIAL — billing sandbox access blocked both Credit memo flow and Notification templates, and they carried into Sprint 4. Review WIP was also running high enough that stories sat in review longer than they were in progress. Two changes: cap review WIP at 2, and split anything estimated over 8 points before it enters a sprint.",
3748
+ "body": "Split stories larger than 8 points"
3749
+ },
3750
+ {
3751
+ "at": "A-19T09:30",
3752
+ "action": "retro.promote",
3753
+ "target": "sprint:platform-core:pc-sprint-3",
3754
+ "actor": "jordan",
3755
+ "body": "Split stories larger than 8 points"
3756
+ },
3757
+ {
3758
+ "at": "A-18T10:00",
3759
+ "action": "risk.status",
3760
+ "target": "risk:pc-notif-throttle",
3761
+ "actor": "tom",
3762
+ "to": "MITIGATING"
3763
+ },
3764
+ {
3765
+ "at": "A-13T09:00",
3766
+ "action": "risk.note",
3767
+ "target": "risk:mt-data-quality",
3768
+ "actor": "yuki",
3769
+ "body": "Profiling pass on the legacy export confirms the null rate in the customer-address fields is worse than the original sample suggested, but still inside the transform effort we budgeted. Holding at open ahead of the dry-run."
3770
+ },
3771
+ {
3772
+ "at": "A-13T09:15",
3773
+ "action": "risk.note",
3774
+ "target": "risk:mt-cutover-window",
3775
+ "actor": "sam",
3776
+ "body": "The freeze window is fixed by the vendor's own change window and can't move. Building the rollback rehearsal into the cutover rehearsal task (5.3) so a failed first attempt still has an exit inside the same window."
3777
+ },
3778
+ {
3779
+ "at": "A-13T09:30",
3780
+ "action": "risk.note",
3781
+ "target": "risk:mt-perf",
3782
+ "actor": "omar",
3783
+ "body": "Second load test came in at 82% of production write volume. Accepting the gap for now — closing it fully would mean re-architecting the sync workers this late in the migration."
3784
+ },
3785
+ {
3786
+ "at": "A-13T09:45",
3787
+ "action": "risk.note",
3788
+ "target": "risk:mt-rollback",
3789
+ "actor": "sam",
3790
+ "body": "No rollback rehearsal scheduled yet — the cutover dry-run (3.1) starting today is the vehicle for it. This stays open until that rehearsal actually exercises a rollback, not just a forward cutover."
3791
+ },
3792
+ {
3793
+ "at": "A-11T09:00",
3794
+ "action": "task.comment",
3795
+ "target": "task:migration-tooling:3.1",
3796
+ "actor": "yuki",
3797
+ "body": "Kicking off the dry-run against the full production extract."
3798
+ },
3799
+ {
3800
+ "at": "A-11T09:30",
3801
+ "action": "task.status",
3802
+ "target": "task:migration-tooling:3.1",
3803
+ "actor": "yuki",
3804
+ "to": "IN_PROGRESS"
3805
+ },
3806
+ {
3807
+ "at": "A-10T09:00",
3808
+ "action": "task.comment",
3809
+ "target": "task:migration-tooling:3.1",
3810
+ "actor": "sam",
3811
+ "body": "First-pass dry-run numbers are in and they push phases 3-5 out 6-7 days. Re-baselining against the re-plan so the kickoff dates stay on record rather than quietly becoming the new plan."
3812
+ },
3813
+ {
3814
+ "at": "A-10T09:05",
3815
+ "action": "baseline.capture",
3816
+ "target": "project:migration-tooling",
3817
+ "actor": "sam",
3818
+ "body": "Post-dry-run re-plan",
3819
+ "is_active": true
3820
+ },
3821
+ {
3822
+ "at": "A-7T17:00",
3823
+ "action": "sprint.close",
3824
+ "target": "sprint:platform-core:pc-sprint-4",
3825
+ "actor": "sam",
3826
+ "goal_outcome": "MET"
3827
+ },
3828
+ {
3829
+ "at": "A-7T17:30",
3830
+ "action": "sprint.close",
3831
+ "target": "sprint:gtm-readiness:gtm-sprint-1",
3832
+ "actor": "jordan",
3833
+ "goal_outcome": "MET"
3834
+ },
3835
+ {
3836
+ "at": "A-6T09:00",
3837
+ "action": "sprint.activate",
3838
+ "target": "sprint:platform-core:pc-sprint-5",
3839
+ "actor": "sam"
3840
+ },
3841
+ {
3842
+ "at": "A-6T09:30",
3843
+ "action": "sprint.activate",
3844
+ "target": "sprint:gtm-readiness:gtm-sprint-2",
3845
+ "actor": "jordan"
3846
+ },
3847
+ {
3848
+ "at": "A-5T10:00",
3849
+ "action": "task.status",
3850
+ "target": "task:platform-core:1.5",
3851
+ "actor": "mei",
3852
+ "to": "IN_PROGRESS"
3853
+ },
3854
+ {
3855
+ "at": "A-5T11:00",
3856
+ "action": "task.status",
3857
+ "target": "task:platform-core:4.4",
3858
+ "actor": "nadia",
3859
+ "to": "IN_PROGRESS"
3860
+ },
3861
+ {
3862
+ "at": "A-5T14:00",
3863
+ "action": "task.status",
3864
+ "target": "task:gtm-readiness:2.4",
3865
+ "actor": "clara",
3866
+ "to": "IN_PROGRESS"
3867
+ },
3868
+ {
3869
+ "at": "A-4T09:00",
3870
+ "action": "task.comment",
3871
+ "target": "task:migration-tooling:3.3",
3872
+ "actor": "sam",
3873
+ "body": "Delta sync needs deeper data-platform knowledge — moving it from Raj to Omar."
3874
+ },
3875
+ {
3876
+ "at": "A-4T09:05",
3877
+ "action": "task.assign",
3878
+ "target": "task:migration-tooling:3.3",
3879
+ "actor": "sam",
3880
+ "assignee": "omar"
3881
+ },
3882
+ {
3883
+ "at": "A-4T10:00",
3884
+ "action": "task.comment",
3885
+ "target": "task:platform-core:2.6",
3886
+ "actor": "omar",
3887
+ "body": "Blocked: Migration's performance tuning now lands after this sprint closes — parking the cutover hook until the tuned pipeline exists."
3888
+ },
3889
+ {
3890
+ "at": "A-4T10:05",
3891
+ "action": "task.status",
3892
+ "target": "task:platform-core:2.6",
3893
+ "actor": "omar",
3894
+ "to": "ON_HOLD"
3895
+ },
3896
+ {
3897
+ "at": "A-4T11:00",
3898
+ "action": "task.ac_met",
3899
+ "target": "task:platform-core:4.5",
3900
+ "actor": "jordan"
3901
+ },
3902
+ {
3903
+ "at": "A-4T14:30",
3904
+ "action": "risk.note",
3905
+ "target": "risk:pc-notif-throttle",
3906
+ "actor": "tom",
3907
+ "body": "Per-tenant throttle shipped with the delivery queue; load test held at 5x the observed peak. Closing this out."
3908
+ },
3909
+ {
3910
+ "at": "A-4T15:00",
3911
+ "action": "risk.status",
3912
+ "target": "risk:pc-notif-throttle",
3913
+ "actor": "tom",
3914
+ "to": "RESOLVED"
3915
+ },
3916
+ {
3917
+ "at": "A-30T11:00",
3918
+ "action": "risk.note",
3919
+ "target": "risk:pc-scope-creep",
3920
+ "actor": "jordan",
3921
+ "body": "@atlas-priya @atlas-alex — decision: multi-jurisdiction tax moves out of 1.0 rather than being deferred inside it. Avoiding the exposure instead of managing it; the billing epic scope is now fixed."
3922
+ },
3923
+ {
3924
+ "at": "A-30T11:30",
3925
+ "action": "risk.status",
3926
+ "target": "risk:pc-scope-creep",
3927
+ "actor": "jordan",
3928
+ "to": "RESOLVED"
3929
+ },
3930
+ {
3931
+ "at": "A-10T09:15",
3932
+ "action": "task.block",
3933
+ "target": "task:platform-core:5.3",
3934
+ "actor": "diego",
3935
+ "body": "Email provider hasn't verified our sending domain — digests can't go out to real addresses until DKIM is signed off, so the scheduler is built but untestable end to end.",
3936
+ "blocker_type": "vendor"
3937
+ },
3938
+ {
3939
+ "at": "A-9T10:00",
3940
+ "action": "task.comment",
3941
+ "target": "task:platform-core:5.3",
3942
+ "actor": "diego",
3943
+ "body": "@atlas-priya this is a vendor wait, not an estimate miss — the scheduler itself is done. Flagging it so the burndown reads honestly if it slips past Friday.",
3944
+ "slug": "digest-vendor-wait"
3945
+ },
3946
+ {
3947
+ "at": "A-8T16:30",
3948
+ "action": "task.comment",
3949
+ "target": "task:platform-core:5.3",
3950
+ "actor": "priya",
3951
+ "body": "Acknowledged. @atlas-alex I'd rather carry this than fake a close — it's four days of vendor latency, not scope.",
3952
+ "reply_to": "digest-vendor-wait",
3953
+ "slug": "digest-carry-call"
3954
+ },
3955
+ {
3956
+ "at": "A-6T11:00",
3957
+ "action": "task.unblock",
3958
+ "target": "task:platform-core:5.3",
3959
+ "actor": "diego",
3960
+ "body": "DKIM verified, digests sending against the sandbox domain."
3961
+ },
3962
+ {
3963
+ "at": "A-6T11:30",
3964
+ "action": "task.comment",
3965
+ "target": "task:platform-core:5.3",
3966
+ "actor": "diego",
3967
+ "body": "Unblocked after four days. Back in progress with the sprint's remaining point on it."
3968
+ },
3969
+ {
3970
+ "at": "A-5T09:00",
3971
+ "action": "task.block",
3972
+ "target": "task:platform-core:4.5",
3973
+ "actor": "tom",
3974
+ "body": "Waiting on legal for the jurisdiction list — we cannot pick a tax provider until we know which jurisdictions are in scope for 1.0.",
3975
+ "blocker_type": "decision"
3976
+ },
3977
+ {
3978
+ "at": "A-4T09:30",
3979
+ "action": "task.comment",
3980
+ "target": "task:platform-core:4.5",
3981
+ "actor": "tom",
3982
+ "body": "@atlas-jordan this is the one still holding the billing epic. Not an estimate problem — we're waiting on an answer."
3983
+ },
3984
+ {
3985
+ "at": "A-3T09:30",
3986
+ "action": "task.comment",
3987
+ "target": "task:platform-core:3.4",
3988
+ "actor": "jordan",
3989
+ "body": "Warehouse schema churn means we need an extra backfill pass this sprint — pulling Backfill tool into the sprint."
3990
+ },
3991
+ {
3992
+ "at": "A-3T09:35",
3993
+ "action": "sprint.scope_inject",
3994
+ "target": "task:platform-core:3.4",
3995
+ "actor": "jordan",
3996
+ "goal_impact": true
3997
+ },
3998
+ {
3999
+ "at": "A-3T11:00",
4000
+ "action": "task.status",
4001
+ "target": "task:platform-core:1.5",
4002
+ "actor": "mei",
4003
+ "to": "REVIEW"
4004
+ },
4005
+ {
4006
+ "at": "A-3T16:00",
4007
+ "action": "task.status",
4008
+ "target": "task:platform-core:1.5",
4009
+ "actor": "priya",
4010
+ "to": "COMPLETE"
4011
+ },
4012
+ {
4013
+ "at": "A-2T10:00",
4014
+ "action": "task.comment",
4015
+ "target": "task:gtm-readiness:2.5",
4016
+ "actor": "clara",
4017
+ "body": "Launch blog drafted through the pricing section."
4018
+ },
4019
+ {
4020
+ "at": "A-2T10:05",
4021
+ "action": "task.status",
4022
+ "target": "task:gtm-readiness:2.5",
4023
+ "actor": "clara",
4024
+ "to": "IN_PROGRESS"
4025
+ },
4026
+ {
4027
+ "at": "A-2T11:00",
4028
+ "action": "task.comment",
4029
+ "target": "task:platform-core:3.4",
4030
+ "actor": "priya",
4031
+ "body": "We'll protect the sprint goal by deferring lower-priority work. Accepting the injection — and it's bigger than we thought: re-pointing from 5 to 8."
4032
+ },
4033
+ {
4034
+ "at": "A-2T11:05",
4035
+ "action": "sprint.scope_resolve",
4036
+ "target": "task:platform-core:3.4",
4037
+ "actor": "priya",
4038
+ "to": "ACCEPTED"
4039
+ },
4040
+ {
4041
+ "at": "A-2T11:10",
4042
+ "action": "task.points",
4043
+ "target": "task:platform-core:3.4",
4044
+ "actor": "priya",
4045
+ "points": 8
4046
+ },
4047
+ {
4048
+ "at": "A-2T11:30",
4049
+ "action": "task.status",
4050
+ "target": "task:platform-core:3.4",
4051
+ "actor": "yuki",
4052
+ "to": "IN_PROGRESS"
4053
+ },
4054
+ {
4055
+ "at": "A-2T14:00",
4056
+ "action": "task.comment",
4057
+ "target": "task:platform-core:4.4",
4058
+ "actor": "nadia",
4059
+ "body": "Dunning flow ready for review — retry ladder and grace periods are in."
4060
+ },
4061
+ {
4062
+ "at": "A-2T14:05",
4063
+ "action": "task.status",
4064
+ "target": "task:platform-core:4.4",
4065
+ "actor": "nadia",
4066
+ "to": "REVIEW"
4067
+ },
4068
+ {
4069
+ "at": "A-2T15:00",
4070
+ "action": "task.comment",
4071
+ "target": "task:migration-tooling:3.1",
4072
+ "actor": "yuki",
4073
+ "body": "Dry-run is halfway through; the tenant shard fan-out is the hot spot."
4074
+ },
4075
+ {
4076
+ "at": "A-2T15:10",
4077
+ "action": "task.comment",
4078
+ "target": "task:migration-tooling:3.2",
4079
+ "actor": "sam",
4080
+ "body": "Re-estimating performance tuning off the dry-run findings — 4 days was optimistic."
4081
+ },
4082
+ {
4083
+ "at": "A-2T15:15",
4084
+ "action": "task.estimate",
4085
+ "target": "task:migration-tooling:3.2",
4086
+ "actor": "sam",
4087
+ "estimate": {
4088
+ "optimistic": 4,
4089
+ "most_likely": 6,
4090
+ "pessimistic": 12
4091
+ }
4092
+ },
4093
+ {
4094
+ "at": "A-2T16:00",
4095
+ "action": "task.status",
4096
+ "target": "task:gtm-readiness:2.4",
4097
+ "actor": "clara",
4098
+ "to": "COMPLETE"
4099
+ },
4100
+ {
4101
+ "at": "A-2T16:05",
4102
+ "action": "task.comment",
4103
+ "target": "task:gtm-readiness:2.4",
4104
+ "actor": "clara",
4105
+ "body": "Onboarding guide is live in the docs hub."
4106
+ },
4107
+ {
4108
+ "at": "A-1T09:30",
4109
+ "action": "task.comment",
4110
+ "target": "task:platform-core:5.3",
4111
+ "actor": "diego",
4112
+ "body": "Digest batching is in; the preference fan-out is what's left."
4113
+ },
4114
+ {
4115
+ "at": "A-1T10:00",
4116
+ "action": "task.comment",
4117
+ "target": "task:gtm-readiness:2.5",
4118
+ "actor": "jordan",
4119
+ "body": "Draft launch blog is with brand review; hero image still open."
4120
+ },
4121
+ {
4122
+ "at": "A-1T10:45",
4123
+ "action": "risk.note",
4124
+ "target": "risk:pc-data-platform",
4125
+ "actor": "yuki",
4126
+ "body": "Schema churn hit two of the three data-platform tasks this week — the customer-events table changed shape twice under us. Moving to mitigating and locking a schema freeze date for the remaining epics."
4127
+ },
4128
+ {
4129
+ "at": "A-1T11:00",
4130
+ "action": "risk.status",
4131
+ "target": "risk:pc-data-platform",
4132
+ "actor": "priya",
4133
+ "to": "MITIGATING"
4134
+ },
4135
+ {
4136
+ "at": "A-55T11:20",
4137
+ "action": "task.ack",
4138
+ "target": "comment:sso-security-review",
4139
+ "actor": "mei"
4140
+ },
4141
+ {
4142
+ "at": "A-51T16:20",
4143
+ "action": "task.react",
4144
+ "target": "comment:sso-approval",
4145
+ "actor": "mei",
4146
+ "emoji": "👍"
4147
+ },
4148
+ {
4149
+ "at": "A-34T11:20",
4150
+ "action": "task.ack",
4151
+ "target": "comment:mt-enum-review",
4152
+ "actor": "yuki"
4153
+ },
4154
+ {
4155
+ "at": "A-9T10:30",
4156
+ "action": "task.ack",
4157
+ "target": "comment:digest-vendor-wait",
4158
+ "actor": "priya"
4159
+ },
4160
+ {
4161
+ "at": "A-8T17:00",
4162
+ "action": "task.react",
4163
+ "target": "comment:digest-carry-call",
4164
+ "actor": "alex",
4165
+ "emoji": "👍"
4166
+ },
4167
+ {
4168
+ "at": "A-5T10:00",
4169
+ "action": "task.comment",
4170
+ "target": "task:platform-core:4.4",
4171
+ "actor": "alex",
4172
+ "body": "@atlas-nadia @atlas-jordan the dunning flow and its notice copy (4.10) ship together — keep them in one review so the retry ladder and the wording cannot drift apart."
4173
+ },
4174
+ {
4175
+ "at": "A-51T16:10",
4176
+ "action": "task.note",
4177
+ "target": "task:platform-core:1.1",
4178
+ "actor": "priya",
4179
+ "body": "Decision: every OIDC callback validates state and nonce. A login CSRF finding blocks release; it is not a follow-up ticket.",
4180
+ "decision": true
4181
+ },
4182
+ {
4183
+ "at": "A-30T11:05",
4184
+ "action": "task.note",
4185
+ "target": "task:platform-core:4.5",
4186
+ "actor": "jordan",
4187
+ "body": "Decision: multi-jurisdiction tax moves out of 1.0 rather than being deferred inside it. The tax engine covers the launch jurisdictions only.",
4188
+ "decision": true,
4189
+ "pinned": true
4190
+ },
4191
+ {
4192
+ "at": "A-30T16:10",
4193
+ "action": "task.note",
4194
+ "target": "task:migration-tooling:2.2",
4195
+ "actor": "omar",
4196
+ "body": "Decision: legacy account-type codes map one-to-one, and the reconciliation check fails the run on any lossy mapping.",
4197
+ "decision": true
4198
+ },
4199
+ {
4200
+ "at": "A-10T09:10",
4201
+ "action": "task.note",
4202
+ "target": "task:migration-tooling:3.1",
4203
+ "actor": "sam",
4204
+ "body": "The active baseline is now the post-dry-run re-plan. Slip against the kickoff plan lives on the superseded baseline — compare both before calling a date.",
4205
+ "pinned": true
4206
+ },
4207
+ {
4208
+ "at": "A-2T11:10",
4209
+ "action": "task.note",
4210
+ "target": "task:platform-core:3.4",
4211
+ "actor": "priya",
4212
+ "body": "Decision: accept the Backfill tool injection and hold Webhook retries dashboard (2.8) for Sprint 6 to protect the sprint goal.",
4213
+ "decision": true
4214
+ },
4215
+ {
4216
+ "at": "A-1T10:00",
4217
+ "action": "task.ac_met",
4218
+ "target": "task:platform-core:4.4",
4219
+ "actor": "jordan",
4220
+ "criterion": 0
4221
+ },
4222
+ {
4223
+ "at": "A-1T10:05",
4224
+ "action": "task.ac_met",
4225
+ "target": "task:platform-core:4.4",
4226
+ "actor": "jordan",
4227
+ "criterion": 1
4228
+ },
4229
+ {
4230
+ "at": "A-1T15:00",
4231
+ "action": "task.ac_met",
4232
+ "target": "task:platform-core:3.4",
4233
+ "actor": "yuki",
4234
+ "criterion": 0
4235
+ },
4236
+ {
4237
+ "at": "A-52T17:30",
4238
+ "action": "time.log",
4239
+ "target": "task:platform-core:1.1",
4240
+ "actor": "mei",
4241
+ "minutes": 240,
4242
+ "note": "State and nonce validation plus the regression test"
4243
+ },
4244
+ {
4245
+ "at": "A-2T16:30",
4246
+ "action": "time.log",
4247
+ "target": "task:platform-core:4.4",
4248
+ "actor": "nadia",
4249
+ "minutes": 180,
4250
+ "note": "Retry ladder and grace-period edge cases"
4251
+ },
4252
+ {
4253
+ "at": "A-2T17:00",
4254
+ "action": "time.log",
4255
+ "target": "task:migration-tooling:3.1",
4256
+ "actor": "yuki",
4257
+ "minutes": 300,
4258
+ "note": "Dry-run: tenant shard fan-out profiling"
4259
+ },
4260
+ {
4261
+ "at": "A-2T12:00",
4262
+ "action": "time.log",
4263
+ "target": "task:gtm-readiness:2.5",
4264
+ "actor": "clara",
4265
+ "minutes": 120,
4266
+ "note": "Launch blog, pricing section"
4267
+ },
4268
+ {
4269
+ "at": "A-4T10:10",
4270
+ "action": "task.block",
4271
+ "target": "task:platform-core:2.6",
4272
+ "actor": "omar",
4273
+ "body": "Waiting on Migration's performance tuning (3.2): the cutover hook has nothing to hook into until the tuned pipeline exists.",
4274
+ "blocker_type": "dependency",
4275
+ "blocking_task": "migration-tooling:3.2"
4276
+ }
4277
+ ]
4278
+ }