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