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,1905 @@
1
+ {
2
+ "schema_version": "2.1",
3
+ "program": {
4
+ "slug": "ga-launch",
5
+ "name": "1.0 GA Launch",
6
+ "description": "Ship 1.0 to GA: platform scale, security sign-off, SOC 2 audit-readiness, and a coordinated launch — four workstreams, one outcome, joined by cross-project dependencies and shared people.",
7
+ "methodology": "HYBRID",
8
+ "color": "#7C3AED",
9
+ "lead": "dana",
10
+ "mc_history_enabled": true,
11
+ "mc_history_attribution_audience": "scheduler_plus",
12
+ "backlog_items": [
13
+ {
14
+ "slug": "public-status-page",
15
+ "title": "Public status page",
16
+ "item_type": "feature",
17
+ "tags": [
18
+ "customer-request"
19
+ ],
20
+ "priority_rank": 1,
21
+ "story_points": 8,
22
+ "created_by": "malcolm",
23
+ "created_at": "A-18T10:00"
24
+ },
25
+ {
26
+ "slug": "analyst-briefing-kit",
27
+ "title": "Analyst briefing kit",
28
+ "item_type": "story",
29
+ "status": "pulled",
30
+ "pulled_to": "ga-marketing:4",
31
+ "pulled_by": "dana",
32
+ "pulled_at": "A-14T10:00",
33
+ "created_by": "jane",
34
+ "created_at": "A-20T10:00"
35
+ },
36
+ {
37
+ "slug": "bug-bounty-program",
38
+ "title": "Bug bounty program",
39
+ "description": "Deferred past GA: triage capacity is consumed by pen-test remediation.",
40
+ "item_type": "feature",
41
+ "status": "archived",
42
+ "tags": [
43
+ "security"
44
+ ],
45
+ "created_by": "janus",
46
+ "created_at": "A-10T10:00"
47
+ }
48
+ ],
49
+ "ceremonies": [
50
+ {
51
+ "name": "Launch Readiness Sync",
52
+ "cadence_type": "weekly",
53
+ "cadence_day": "monday",
54
+ "cadence_time": "11:00",
55
+ "duration_minutes": 30,
56
+ "owner_role": "Launch Lead"
57
+ },
58
+ {
59
+ "name": "Audit Readiness Check-in",
60
+ "cadence_type": "biweekly",
61
+ "cadence_day": "wednesday",
62
+ "cadence_time": "16:00",
63
+ "duration_minutes": 30,
64
+ "owner_role": "Compliance Lead"
65
+ },
66
+ {
67
+ "name": "Security Sign-off Board",
68
+ "cadence_type": "on_milestone",
69
+ "duration_minutes": 60,
70
+ "owner_role": "Security Lead"
71
+ }
72
+ ]
73
+ },
74
+ "accounts": [
75
+ {
76
+ "slug": "dana",
77
+ "username": "ga-dana",
78
+ "email": "ga-dana@trueppm.demo",
79
+ "display_name": "Dana Okafor",
80
+ "role": "OWNER"
81
+ },
82
+ {
83
+ "slug": "malcolm",
84
+ "username": "ga-malcolm",
85
+ "email": "ga-malcolm@trueppm.demo",
86
+ "display_name": "Malcolm Reed",
87
+ "role": "ADMIN"
88
+ },
89
+ {
90
+ "slug": "janus",
91
+ "username": "ga-janus",
92
+ "email": "ga-janus@trueppm.demo",
93
+ "display_name": "Janus Vela",
94
+ "role": "MEMBER"
95
+ },
96
+ {
97
+ "slug": "bob",
98
+ "username": "ga-bob",
99
+ "email": "ga-bob@trueppm.demo",
100
+ "display_name": "Bob Tran",
101
+ "role": "MEMBER"
102
+ },
103
+ {
104
+ "slug": "jane",
105
+ "username": "ga-jane",
106
+ "email": "ga-jane@trueppm.demo",
107
+ "display_name": "Jane Castellano",
108
+ "role": "MEMBER"
109
+ },
110
+ {
111
+ "slug": "lena",
112
+ "username": "ga-lena",
113
+ "email": "ga-lena@trueppm.demo",
114
+ "display_name": "Lena Fischer",
115
+ "role": "MEMBER"
116
+ },
117
+ {
118
+ "slug": "sam",
119
+ "username": "ga-sam",
120
+ "email": "ga-sam@trueppm.demo",
121
+ "display_name": "Sam Ortiz",
122
+ "role": "VIEWER"
123
+ }
124
+ ],
125
+ "calendars": [
126
+ {
127
+ "slug": "standard",
128
+ "name": "Standard 5-day",
129
+ "working_days": 31,
130
+ "hours_per_day": 8.0,
131
+ "timezone": "UTC",
132
+ "exceptions": [
133
+ {
134
+ "exc_start": "A-1",
135
+ "exc_end": "A-1",
136
+ "description": "Company holiday"
137
+ }
138
+ ]
139
+ }
140
+ ],
141
+ "resources": [
142
+ {
143
+ "slug": "dana",
144
+ "name": "Dana Okafor",
145
+ "job_role": "Program Manager",
146
+ "max_units": 1.0,
147
+ "account": "dana",
148
+ "calendar": "standard"
149
+ },
150
+ {
151
+ "slug": "malcolm",
152
+ "name": "Malcolm Reed",
153
+ "job_role": "Platform Engineer",
154
+ "max_units": 1.0,
155
+ "account": "malcolm",
156
+ "calendar": "standard",
157
+ "skills": [
158
+ {
159
+ "name": "Kubernetes",
160
+ "proficiency": "expert"
161
+ },
162
+ {
163
+ "name": "Auth systems",
164
+ "proficiency": "intermediate"
165
+ }
166
+ ]
167
+ },
168
+ {
169
+ "slug": "janus",
170
+ "name": "Janus Vela",
171
+ "job_role": "InfoSec Engineer",
172
+ "max_units": 1.0,
173
+ "account": "janus",
174
+ "calendar": "standard",
175
+ "skills": [
176
+ {
177
+ "name": "Penetration testing",
178
+ "proficiency": "expert"
179
+ },
180
+ {
181
+ "name": "Auth systems",
182
+ "proficiency": "expert"
183
+ }
184
+ ]
185
+ },
186
+ {
187
+ "slug": "bob",
188
+ "name": "Bob Tran",
189
+ "job_role": "Compliance Officer",
190
+ "max_units": 1.0,
191
+ "account": "bob",
192
+ "calendar": "standard",
193
+ "skills": [
194
+ {
195
+ "name": "SOC 2",
196
+ "proficiency": "expert"
197
+ }
198
+ ]
199
+ },
200
+ {
201
+ "slug": "jane",
202
+ "name": "Jane Castellano",
203
+ "job_role": "Marketing Lead",
204
+ "max_units": 1.0,
205
+ "account": "jane",
206
+ "calendar": "standard",
207
+ "skills": [
208
+ {
209
+ "name": "Product marketing",
210
+ "proficiency": "expert"
211
+ }
212
+ ]
213
+ },
214
+ {
215
+ "slug": "lena",
216
+ "name": "Lena Fischer",
217
+ "job_role": "Technical Writer",
218
+ "max_units": 0.6,
219
+ "account": "lena",
220
+ "calendar": "standard",
221
+ "skills": [
222
+ {
223
+ "name": "Technical writing",
224
+ "proficiency": "expert"
225
+ },
226
+ {
227
+ "name": "Policy writing",
228
+ "proficiency": "intermediate"
229
+ }
230
+ ]
231
+ },
232
+ {
233
+ "slug": "sam",
234
+ "name": "Sam Ortiz",
235
+ "job_role": "Backend Engineer",
236
+ "max_units": 1.0,
237
+ "account": "sam",
238
+ "calendar": "standard",
239
+ "skills": [
240
+ {
241
+ "name": "Python",
242
+ "proficiency": "expert"
243
+ }
244
+ ]
245
+ }
246
+ ],
247
+ "risks": [
248
+ {
249
+ "slug": "gate-convergence",
250
+ "title": "Three gates converge on one launch date",
251
+ "description": "GA go-live is a hard successor of both Platform GA-ready and Security sign-off, and SOC 2 evidence is gated on security sign-off as well. One slip in remediation moves the launch and the audit together.",
252
+ "status": "MITIGATING",
253
+ "probability": 4,
254
+ "impact": 5,
255
+ "category": "ORGANIZATIONAL",
256
+ "response": "MITIGATE",
257
+ "owner": "dana",
258
+ "mitigation_due_date": "A+9",
259
+ "trigger": "Security sign-off forecasts past day 54 on the program pass.",
260
+ "contingency": "Decouple what can be decoupled — evidence collection splits off the non-security controls — and hold the press embargo rather than the engineering date.",
261
+ "tasks": [
262
+ "ga-security:5",
263
+ "ga-marketing:5",
264
+ "ga-soc2:3"
265
+ ]
266
+ },
267
+ {
268
+ "slug": "shared-people",
269
+ "title": "The same three people carry all four workstreams",
270
+ "status": "OPEN",
271
+ "probability": 4,
272
+ "impact": 3,
273
+ "category": "ORGANIZATIONAL",
274
+ "response": "ACCEPT",
275
+ "owner": "dana",
276
+ "trigger": "Any named person exceeds 100% allocation for more than one week.",
277
+ "contingency": "Sequence rather than staff: the program has no bench, so contention is resolved by moving a workstream right, not by adding people.",
278
+ "notes": "Visible on the team view: Malcolm runs the platform rollout at 1.0 while carrying security remediation at 0.5, and Lena is split across policy authoring and launch content at 0.6 total capacity.",
279
+ "tasks": [
280
+ "ga-platform:2",
281
+ "ga-security:3"
282
+ ]
283
+ }
284
+ ],
285
+ "projects": [
286
+ {
287
+ "slug": "ga-platform",
288
+ "name": "Platform Hardening & Scale",
289
+ "description": "Make the platform carry GA load: capacity, autoscaling, failover, and the observability to prove it.",
290
+ "methodology": "WATERFALL",
291
+ "start_date": "A-45",
292
+ "calendar": "standard",
293
+ "lead": "malcolm",
294
+ "default_view": "SCHEDULE",
295
+ "forecast_history": {
296
+ "days": 60,
297
+ "commitment_finish": "A+30",
298
+ "cpm_start": "A+24",
299
+ "cpm_end": "A+36",
300
+ "p50_start": "A+27",
301
+ "p50_end": "A+40",
302
+ "p80_start": "A+30",
303
+ "p80_end": "A+46",
304
+ "p95_start": "A+34",
305
+ "p95_end": "A+54",
306
+ "mc_iterations": 1500,
307
+ "completion_ratio": 0.55
308
+ },
309
+ "labels": [
310
+ {
311
+ "slug": "critical-path",
312
+ "name": "Critical path",
313
+ "color": "rose",
314
+ "position": 0
315
+ },
316
+ {
317
+ "slug": "cross-workstream",
318
+ "name": "Cross-workstream",
319
+ "color": "purple",
320
+ "position": 1
321
+ },
322
+ {
323
+ "slug": "gate",
324
+ "name": "Release gate",
325
+ "color": "amber",
326
+ "position": 2
327
+ },
328
+ {
329
+ "slug": "compliance",
330
+ "name": "Compliance evidence",
331
+ "color": "teal",
332
+ "position": 3
333
+ }
334
+ ],
335
+ "tasks": [
336
+ {
337
+ "wbs_path": "1",
338
+ "name": "Capacity baseline & load test",
339
+ "status": "COMPLETE",
340
+ "planned_start": "A-45",
341
+ "assignee": "malcolm",
342
+ "governance_class": "flow",
343
+ "duration": 5,
344
+ "delivery_mode": "waterfall",
345
+ "percent_complete": 100.0,
346
+ "labels": [
347
+ "critical-path"
348
+ ],
349
+ "assignments": [
350
+ {
351
+ "resource": "malcolm",
352
+ "units": 1.0
353
+ },
354
+ {
355
+ "resource": "sam",
356
+ "units": 1.0
357
+ }
358
+ ]
359
+ },
360
+ {
361
+ "wbs_path": "2",
362
+ "name": "Autoscaling & HA rollout",
363
+ "status": "COMPLETE",
364
+ "planned_start": "A-38",
365
+ "assignee": "malcolm",
366
+ "governance_class": "flow",
367
+ "duration": 8,
368
+ "delivery_mode": "waterfall",
369
+ "percent_complete": 100.0,
370
+ "labels": [
371
+ "critical-path"
372
+ ],
373
+ "assignments": [
374
+ {
375
+ "resource": "malcolm",
376
+ "units": 1.0
377
+ }
378
+ ]
379
+ },
380
+ {
381
+ "wbs_path": "3",
382
+ "name": "DB failover hardening",
383
+ "status": "COMPLETE",
384
+ "planned_start": "A-38",
385
+ "assignee": "sam",
386
+ "governance_class": "flow",
387
+ "duration": 6,
388
+ "delivery_mode": "waterfall",
389
+ "percent_complete": 100.0,
390
+ "assignments": [
391
+ {
392
+ "resource": "sam",
393
+ "units": 1.0
394
+ }
395
+ ]
396
+ },
397
+ {
398
+ "wbs_path": "4",
399
+ "name": "Observability & alerting",
400
+ "status": "COMPLETE",
401
+ "planned_start": "A-38",
402
+ "assignee": "malcolm",
403
+ "governance_class": "flow",
404
+ "duration": 4,
405
+ "delivery_mode": "waterfall",
406
+ "percent_complete": 100.0,
407
+ "assignments": [
408
+ {
409
+ "resource": "malcolm",
410
+ "units": 0.5
411
+ }
412
+ ]
413
+ },
414
+ {
415
+ "wbs_path": "5",
416
+ "name": "Platform GA-ready",
417
+ "status": "COMPLETE",
418
+ "planned_start": "A-22",
419
+ "assignee": "malcolm",
420
+ "governance_class": "gated",
421
+ "is_milestone": true,
422
+ "delivery_mode": "milestone",
423
+ "percent_complete": 100.0,
424
+ "labels": [
425
+ "gate"
426
+ ]
427
+ }
428
+ ],
429
+ "dependencies": [
430
+ {
431
+ "predecessor": "1",
432
+ "successor": "2",
433
+ "dep_type": "FS",
434
+ "lag": 0
435
+ },
436
+ {
437
+ "predecessor": "1",
438
+ "successor": "3",
439
+ "dep_type": "FS",
440
+ "lag": 0
441
+ },
442
+ {
443
+ "predecessor": "2",
444
+ "successor": "4",
445
+ "dep_type": "SS",
446
+ "lag": 0
447
+ },
448
+ {
449
+ "predecessor": "2",
450
+ "successor": "5",
451
+ "dep_type": "FS",
452
+ "lag": 0
453
+ },
454
+ {
455
+ "predecessor": "3",
456
+ "successor": "5",
457
+ "dep_type": "FS",
458
+ "lag": 0
459
+ },
460
+ {
461
+ "predecessor": "4",
462
+ "successor": "5",
463
+ "dep_type": "FS",
464
+ "lag": 0
465
+ }
466
+ ],
467
+ "members": [
468
+ {
469
+ "account": "malcolm",
470
+ "role": "OWNER"
471
+ },
472
+ {
473
+ "account": "dana",
474
+ "role": "ADMIN"
475
+ },
476
+ {
477
+ "account": "sam",
478
+ "role": "MEMBER"
479
+ },
480
+ {
481
+ "account": "janus",
482
+ "role": "VIEWER"
483
+ }
484
+ ],
485
+ "baselines": [
486
+ {
487
+ "name": "GA plan baseline",
488
+ "is_active": true,
489
+ "captured_at": "A-43",
490
+ "tasks": [
491
+ {
492
+ "task": "1",
493
+ "start": "A-45",
494
+ "finish": "A-40",
495
+ "duration": 5
496
+ },
497
+ {
498
+ "task": "2",
499
+ "start": "A-38",
500
+ "finish": "A-30",
501
+ "duration": 8
502
+ },
503
+ {
504
+ "task": "3",
505
+ "start": "A-38",
506
+ "finish": "A-34",
507
+ "duration": 4
508
+ },
509
+ {
510
+ "task": "4",
511
+ "start": "A-38",
512
+ "finish": "A-34",
513
+ "duration": 4
514
+ }
515
+ ]
516
+ }
517
+ ],
518
+ "risks": [
519
+ {
520
+ "slug": "load-ceiling",
521
+ "title": "Autoscaling ceiling below the GA load projection",
522
+ "status": "RESOLVED",
523
+ "probability": 3,
524
+ "impact": 5,
525
+ "category": "TECHNICAL",
526
+ "response": "MITIGATE",
527
+ "owner": "malcolm",
528
+ "trigger": "Load test sustains under 3x current peak without horizontal recovery.",
529
+ "contingency": "Pre-warm a second node pool for launch week and cap signup throughput until the autoscaler is proven.",
530
+ "notes": "Closed by the capacity baseline: held at 5x peak with recovery inside 90 seconds.",
531
+ "tasks": [
532
+ "1",
533
+ "2"
534
+ ]
535
+ },
536
+ {
537
+ "slug": "failover-untested",
538
+ "title": "DB failover never exercised under write load",
539
+ "status": "OPEN",
540
+ "probability": 2,
541
+ "impact": 5,
542
+ "category": "TECHNICAL",
543
+ "response": "MITIGATE",
544
+ "owner": "sam",
545
+ "trigger": "A failover drill has not run against production-shaped write volume within 30 days of GA.",
546
+ "contingency": "Declare GA with a documented manual failover runbook and a named on-call owner, rather than an untested automatic path.",
547
+ "tasks": [
548
+ "3"
549
+ ]
550
+ }
551
+ ]
552
+ },
553
+ {
554
+ "slug": "ga-soc2",
555
+ "name": "SOC 2 Type II Readiness",
556
+ "description": "Reach audit-ready: control gaps closed, policies written, evidence collected, and an internal readiness review passed.",
557
+ "methodology": "WATERFALL",
558
+ "start_date": "A-45",
559
+ "calendar": "standard",
560
+ "lead": "bob",
561
+ "default_view": "SCHEDULE",
562
+ "labels": [
563
+ {
564
+ "slug": "critical-path",
565
+ "name": "Critical path",
566
+ "color": "rose",
567
+ "position": 0
568
+ },
569
+ {
570
+ "slug": "cross-workstream",
571
+ "name": "Cross-workstream",
572
+ "color": "purple",
573
+ "position": 1
574
+ },
575
+ {
576
+ "slug": "gate",
577
+ "name": "Release gate",
578
+ "color": "amber",
579
+ "position": 2
580
+ },
581
+ {
582
+ "slug": "compliance",
583
+ "name": "Compliance evidence",
584
+ "color": "teal",
585
+ "position": 3
586
+ }
587
+ ],
588
+ "tasks": [
589
+ {
590
+ "wbs_path": "1",
591
+ "name": "Control gap assessment",
592
+ "status": "COMPLETE",
593
+ "planned_start": "A-45",
594
+ "assignee": "bob",
595
+ "governance_class": "flow",
596
+ "duration": 5,
597
+ "delivery_mode": "waterfall",
598
+ "percent_complete": 100.0,
599
+ "labels": [
600
+ "compliance"
601
+ ],
602
+ "assignments": [
603
+ {
604
+ "resource": "bob",
605
+ "units": 1.0
606
+ }
607
+ ]
608
+ },
609
+ {
610
+ "wbs_path": "2",
611
+ "name": "Policy authoring",
612
+ "status": "COMPLETE",
613
+ "planned_start": "A-38",
614
+ "assignee": "bob",
615
+ "governance_class": "flow",
616
+ "duration": 8,
617
+ "delivery_mode": "waterfall",
618
+ "percent_complete": 100.0,
619
+ "labels": [
620
+ "compliance"
621
+ ],
622
+ "assignments": [
623
+ {
624
+ "resource": "bob",
625
+ "units": 1.0
626
+ },
627
+ {
628
+ "resource": "lena",
629
+ "units": 0.5
630
+ },
631
+ {
632
+ "resource": "janus",
633
+ "units": 0.5
634
+ }
635
+ ],
636
+ "skill_requirements": [
637
+ {
638
+ "skill": "Policy writing",
639
+ "min_proficiency": "expert"
640
+ }
641
+ ]
642
+ },
643
+ {
644
+ "wbs_path": "3",
645
+ "name": "Evidence collection",
646
+ "status": "NOT_STARTED",
647
+ "planned_start": "A+11",
648
+ "assignee": "bob",
649
+ "governance_class": "flow",
650
+ "duration": 6,
651
+ "delivery_mode": "waterfall",
652
+ "labels": [
653
+ "compliance",
654
+ "cross-workstream"
655
+ ],
656
+ "assignments": [
657
+ {
658
+ "resource": "bob",
659
+ "units": 1.0
660
+ },
661
+ {
662
+ "resource": "janus",
663
+ "units": 0.5
664
+ }
665
+ ]
666
+ },
667
+ {
668
+ "wbs_path": "4",
669
+ "name": "Internal readiness review",
670
+ "status": "NOT_STARTED",
671
+ "planned_start": "A+19",
672
+ "assignee": "bob",
673
+ "governance_class": "flow",
674
+ "duration": 3,
675
+ "delivery_mode": "waterfall",
676
+ "assignments": [
677
+ {
678
+ "resource": "bob",
679
+ "units": 1.0
680
+ }
681
+ ]
682
+ },
683
+ {
684
+ "wbs_path": "5",
685
+ "name": "Audit-ready",
686
+ "status": "NOT_STARTED",
687
+ "planned_start": "A+23",
688
+ "assignee": "bob",
689
+ "governance_class": "gated",
690
+ "is_milestone": true,
691
+ "delivery_mode": "milestone",
692
+ "labels": [
693
+ "gate"
694
+ ]
695
+ }
696
+ ],
697
+ "dependencies": [
698
+ {
699
+ "predecessor": "1",
700
+ "successor": "2",
701
+ "dep_type": "FS",
702
+ "lag": 0
703
+ },
704
+ {
705
+ "predecessor": "2",
706
+ "successor": "3",
707
+ "dep_type": "FS",
708
+ "lag": 0
709
+ },
710
+ {
711
+ "predecessor": "3",
712
+ "successor": "4",
713
+ "dep_type": "FS",
714
+ "lag": 0
715
+ },
716
+ {
717
+ "predecessor": "4",
718
+ "successor": "5",
719
+ "dep_type": "FS",
720
+ "lag": 0
721
+ },
722
+ {
723
+ "predecessor": "ga-security:5",
724
+ "successor": "3",
725
+ "dep_type": "FS",
726
+ "lag": 0
727
+ }
728
+ ],
729
+ "members": [
730
+ {
731
+ "account": "bob",
732
+ "role": "OWNER"
733
+ },
734
+ {
735
+ "account": "dana",
736
+ "role": "ADMIN"
737
+ },
738
+ {
739
+ "account": "lena",
740
+ "role": "MEMBER"
741
+ },
742
+ {
743
+ "account": "janus",
744
+ "role": "MEMBER"
745
+ }
746
+ ],
747
+ "baselines": [
748
+ {
749
+ "name": "GA plan baseline",
750
+ "is_active": true,
751
+ "captured_at": "A-43",
752
+ "tasks": [
753
+ {
754
+ "task": "1",
755
+ "start": "A-45",
756
+ "finish": "A-40",
757
+ "duration": 5
758
+ },
759
+ {
760
+ "task": "2",
761
+ "start": "A-38",
762
+ "finish": "A-30",
763
+ "duration": 8
764
+ },
765
+ {
766
+ "task": "3",
767
+ "start": "A+9",
768
+ "finish": "A+15",
769
+ "duration": 6
770
+ },
771
+ {
772
+ "task": "4",
773
+ "start": "A+17",
774
+ "finish": "A+20",
775
+ "duration": 3
776
+ }
777
+ ]
778
+ }
779
+ ],
780
+ "risks": [
781
+ {
782
+ "slug": "evidence-window",
783
+ "title": "Evidence window opens after the audit date is booked",
784
+ "description": "Evidence collection is gated on security sign-off across the workstream boundary, so any slip in remediation lands directly on the audit.",
785
+ "status": "MITIGATING",
786
+ "probability": 4,
787
+ "impact": 4,
788
+ "category": "ORGANIZATIONAL",
789
+ "response": "MITIGATE",
790
+ "owner": "bob",
791
+ "mitigation_due_date": "A+5",
792
+ "trigger": "Security sign-off (ga-security:5) forecasts later than day 54.",
793
+ "contingency": "Collect the control evidence that does not depend on the pen-test remediation first, and hold only the security controls for the sign-off — splitting the dependency rather than waiting on all of it.",
794
+ "tasks": [
795
+ "3"
796
+ ]
797
+ },
798
+ {
799
+ "slug": "writer-contention",
800
+ "title": "Shared technical writer is the constraint on two workstreams",
801
+ "status": "OPEN",
802
+ "probability": 4,
803
+ "impact": 3,
804
+ "category": "ORGANIZATIONAL",
805
+ "response": "ACCEPT",
806
+ "owner": "dana",
807
+ "trigger": "Policy authoring and launch content need the writer in the same week.",
808
+ "contingency": "Launch content wins; the policy narrative is drafted by the control owners and edited after GA.",
809
+ "notes": "Accepted deliberately: Lena is at 0.6 capacity across both, and backfilling a writer mid-program costs more ramp than it returns.",
810
+ "tasks": [
811
+ "2"
812
+ ]
813
+ }
814
+ ]
815
+ },
816
+ {
817
+ "slug": "ga-security",
818
+ "name": "Security Pen-Test & Remediation",
819
+ "description": "Third-party pen test, triage, remediation of the criticals, and a verified sign-off the launch and the audit both gate on.",
820
+ "methodology": "HYBRID",
821
+ "start_date": "A-45",
822
+ "calendar": "standard",
823
+ "lead": "janus",
824
+ "default_view": "BOARD",
825
+ "labels": [
826
+ {
827
+ "slug": "critical-path",
828
+ "name": "Critical path",
829
+ "color": "rose",
830
+ "position": 0
831
+ },
832
+ {
833
+ "slug": "cross-workstream",
834
+ "name": "Cross-workstream",
835
+ "color": "purple",
836
+ "position": 1
837
+ },
838
+ {
839
+ "slug": "gate",
840
+ "name": "Release gate",
841
+ "color": "amber",
842
+ "position": 2
843
+ },
844
+ {
845
+ "slug": "compliance",
846
+ "name": "Compliance evidence",
847
+ "color": "teal",
848
+ "position": 3
849
+ }
850
+ ],
851
+ "tasks": [
852
+ {
853
+ "wbs_path": "1",
854
+ "name": "Pen-test execution",
855
+ "status": "COMPLETE",
856
+ "planned_start": "A-21",
857
+ "assignee": "janus",
858
+ "governance_class": "flow",
859
+ "duration": 5,
860
+ "delivery_mode": "waterfall",
861
+ "percent_complete": 100.0,
862
+ "labels": [
863
+ "critical-path"
864
+ ],
865
+ "assignments": [
866
+ {
867
+ "resource": "janus",
868
+ "units": 1.0
869
+ }
870
+ ]
871
+ },
872
+ {
873
+ "wbs_path": "2",
874
+ "name": "Findings triage",
875
+ "status": "COMPLETE",
876
+ "planned_start": "A-14",
877
+ "assignee": "janus",
878
+ "governance_class": "flow",
879
+ "duration": 2,
880
+ "delivery_mode": "waterfall",
881
+ "percent_complete": 100.0,
882
+ "assignments": [
883
+ {
884
+ "resource": "janus",
885
+ "units": 1.0
886
+ }
887
+ ]
888
+ },
889
+ {
890
+ "wbs_path": "3",
891
+ "name": "Remediate critical findings",
892
+ "status": "IN_PROGRESS",
893
+ "planned_start": "A-5",
894
+ "assignee": "janus",
895
+ "governance_class": "flow",
896
+ "duration": 7,
897
+ "delivery_mode": "waterfall",
898
+ "percent_complete": 65.0,
899
+ "labels": [
900
+ "critical-path"
901
+ ],
902
+ "assignments": [
903
+ {
904
+ "resource": "janus",
905
+ "units": 1.0
906
+ },
907
+ {
908
+ "resource": "malcolm",
909
+ "units": 0.5
910
+ },
911
+ {
912
+ "resource": "sam",
913
+ "units": 0.5
914
+ }
915
+ ],
916
+ "skill_requirements": [
917
+ {
918
+ "skill": "Auth systems",
919
+ "min_proficiency": "expert"
920
+ }
921
+ ]
922
+ },
923
+ {
924
+ "wbs_path": "4",
925
+ "name": "Re-test & verification",
926
+ "status": "NOT_STARTED",
927
+ "planned_start": "A+5",
928
+ "assignee": "janus",
929
+ "governance_class": "flow",
930
+ "duration": 3,
931
+ "delivery_mode": "waterfall",
932
+ "assignments": [
933
+ {
934
+ "resource": "janus",
935
+ "units": 1.0
936
+ }
937
+ ]
938
+ },
939
+ {
940
+ "wbs_path": "5",
941
+ "name": "Security sign-off",
942
+ "status": "NOT_STARTED",
943
+ "planned_start": "A+9",
944
+ "assignee": "janus",
945
+ "governance_class": "gated",
946
+ "is_milestone": true,
947
+ "delivery_mode": "milestone",
948
+ "labels": [
949
+ "gate",
950
+ "cross-workstream"
951
+ ]
952
+ }
953
+ ],
954
+ "dependencies": [
955
+ {
956
+ "predecessor": "1",
957
+ "successor": "2",
958
+ "dep_type": "FS",
959
+ "lag": 0
960
+ },
961
+ {
962
+ "predecessor": "2",
963
+ "successor": "3",
964
+ "dep_type": "FS",
965
+ "lag": 0
966
+ },
967
+ {
968
+ "predecessor": "3",
969
+ "successor": "4",
970
+ "dep_type": "FS",
971
+ "lag": 0
972
+ },
973
+ {
974
+ "predecessor": "4",
975
+ "successor": "5",
976
+ "dep_type": "FS",
977
+ "lag": 0
978
+ }
979
+ ],
980
+ "board_columns": [
981
+ {
982
+ "status": "BACKLOG",
983
+ "label": "Backlog",
984
+ "visible": true
985
+ },
986
+ {
987
+ "status": "NOT_STARTED",
988
+ "label": "Not started",
989
+ "visible": true
990
+ },
991
+ {
992
+ "status": "IN_PROGRESS",
993
+ "label": "In progress",
994
+ "visible": true,
995
+ "wip_limit": 3
996
+ },
997
+ {
998
+ "status": "REVIEW",
999
+ "label": "Review",
1000
+ "visible": true,
1001
+ "wip_limit": 2
1002
+ },
1003
+ {
1004
+ "status": "COMPLETE",
1005
+ "label": "Complete",
1006
+ "visible": true
1007
+ }
1008
+ ],
1009
+ "members": [
1010
+ {
1011
+ "account": "janus",
1012
+ "role": "OWNER"
1013
+ },
1014
+ {
1015
+ "account": "dana",
1016
+ "role": "ADMIN"
1017
+ },
1018
+ {
1019
+ "account": "malcolm",
1020
+ "role": "SCHEDULER"
1021
+ },
1022
+ {
1023
+ "account": "sam",
1024
+ "role": "MEMBER"
1025
+ },
1026
+ {
1027
+ "account": "bob",
1028
+ "role": "VIEWER"
1029
+ }
1030
+ ],
1031
+ "baselines": [
1032
+ {
1033
+ "name": "GA plan baseline",
1034
+ "is_active": true,
1035
+ "captured_at": "A-25",
1036
+ "tasks": [
1037
+ {
1038
+ "task": "1",
1039
+ "start": "A-21",
1040
+ "finish": "A-16",
1041
+ "duration": 5
1042
+ },
1043
+ {
1044
+ "task": "2",
1045
+ "start": "A-14",
1046
+ "finish": "A-12",
1047
+ "duration": 2
1048
+ },
1049
+ {
1050
+ "task": "3",
1051
+ "start": "A-10",
1052
+ "finish": "A-5",
1053
+ "duration": 5
1054
+ },
1055
+ {
1056
+ "task": "4",
1057
+ "start": "A+0",
1058
+ "finish": "A+3",
1059
+ "duration": 3
1060
+ }
1061
+ ]
1062
+ }
1063
+ ],
1064
+ "risks": [
1065
+ {
1066
+ "slug": "critical-findings",
1067
+ "title": "Pen test surfaces more criticals than the window absorbs",
1068
+ "status": "MITIGATING",
1069
+ "probability": 4,
1070
+ "impact": 5,
1071
+ "category": "TECHNICAL",
1072
+ "response": "MITIGATE",
1073
+ "owner": "janus",
1074
+ "mitigation_due_date": "A+5",
1075
+ "trigger": "More than five critical findings, or any critical needing an architectural change rather than a patch.",
1076
+ "contingency": "Ship GA with the criticals fixed and the highs documented as known issues with compensating controls, rather than moving the date.",
1077
+ "notes": "Realized in triage: seven criticals against a plan sized for four. Remediation re-estimated 5 days to 7 — the variance the GA plan baseline shows.",
1078
+ "tasks": [
1079
+ "2",
1080
+ "3"
1081
+ ]
1082
+ },
1083
+ {
1084
+ "slug": "retest-capacity",
1085
+ "title": "Re-test slot depends on the external tester's calendar",
1086
+ "status": "OPEN",
1087
+ "probability": 3,
1088
+ "impact": 4,
1089
+ "category": "EXTERNAL",
1090
+ "response": "TRANSFER",
1091
+ "owner": "janus",
1092
+ "trigger": "The tester cannot confirm a re-test slot within five working days of remediation completing.",
1093
+ "contingency": "The retainer carries a contractual 5-day re-test SLA with a fee credit; the fallback is an internal verification pass signed by the security lead, which the auditor accepts as interim evidence.",
1094
+ "notes": "The schedule exposure is transferred by contract, not removed — a credit does not buy back the launch date, which is why this stays open.",
1095
+ "tasks": [
1096
+ "4",
1097
+ "5"
1098
+ ]
1099
+ }
1100
+ ]
1101
+ },
1102
+ {
1103
+ "slug": "ga-marketing",
1104
+ "name": "GA Marketing & Launch",
1105
+ "description": "Positioning, the launch site, blog and docs, press outreach, and the go-live itself — gated on the platform and the security sign-off.",
1106
+ "methodology": "AGILE",
1107
+ "start_date": "A-45",
1108
+ "calendar": "standard",
1109
+ "lead": "jane",
1110
+ "default_view": "BOARD",
1111
+ "labels": [
1112
+ {
1113
+ "slug": "critical-path",
1114
+ "name": "Critical path",
1115
+ "color": "rose",
1116
+ "position": 0
1117
+ },
1118
+ {
1119
+ "slug": "cross-workstream",
1120
+ "name": "Cross-workstream",
1121
+ "color": "purple",
1122
+ "position": 1
1123
+ },
1124
+ {
1125
+ "slug": "gate",
1126
+ "name": "Release gate",
1127
+ "color": "amber",
1128
+ "position": 2
1129
+ },
1130
+ {
1131
+ "slug": "compliance",
1132
+ "name": "Compliance evidence",
1133
+ "color": "teal",
1134
+ "position": 3
1135
+ }
1136
+ ],
1137
+ "tasks": [
1138
+ {
1139
+ "wbs_path": "1",
1140
+ "name": "Messaging & positioning",
1141
+ "status": "COMPLETE",
1142
+ "planned_start": "A-45",
1143
+ "assignee": "jane",
1144
+ "governance_class": "flow",
1145
+ "duration": 3,
1146
+ "delivery_mode": "scrum",
1147
+ "type": "story",
1148
+ "story_points": 5,
1149
+ "sprint": "ga-s1",
1150
+ "percent_complete": 100.0,
1151
+ "assignments": [
1152
+ {
1153
+ "resource": "jane",
1154
+ "units": 1.0
1155
+ }
1156
+ ],
1157
+ "acceptance_criteria": [
1158
+ {
1159
+ "text": "Positioning is approved by the launch lead",
1160
+ "met": true,
1161
+ "met_by": "dana",
1162
+ "met_at": "A-30T10:00"
1163
+ }
1164
+ ],
1165
+ "dor": "ready"
1166
+ },
1167
+ {
1168
+ "wbs_path": "2",
1169
+ "name": "Website & landing pages",
1170
+ "status": "COMPLETE",
1171
+ "planned_start": "A-41",
1172
+ "assignee": "jane",
1173
+ "governance_class": "flow",
1174
+ "duration": 5,
1175
+ "delivery_mode": "scrum",
1176
+ "type": "story",
1177
+ "story_points": 8,
1178
+ "sprint": "ga-s1",
1179
+ "percent_complete": 100.0,
1180
+ "assignments": [
1181
+ {
1182
+ "resource": "jane",
1183
+ "units": 1.0
1184
+ },
1185
+ {
1186
+ "resource": "lena",
1187
+ "units": 0.5
1188
+ }
1189
+ ],
1190
+ "dor": "ready"
1191
+ },
1192
+ {
1193
+ "wbs_path": "3",
1194
+ "name": "Launch blog & docs",
1195
+ "status": "IN_PROGRESS",
1196
+ "planned_start": "A-5",
1197
+ "assignee": "lena",
1198
+ "governance_class": "flow",
1199
+ "duration": 3,
1200
+ "delivery_mode": "scrum",
1201
+ "type": "story",
1202
+ "story_points": 5,
1203
+ "sprint": "ga-s2",
1204
+ "remaining_points": 2,
1205
+ "percent_complete": 60.0,
1206
+ "assignments": [
1207
+ {
1208
+ "resource": "lena",
1209
+ "units": 0.5
1210
+ }
1211
+ ],
1212
+ "acceptance_criteria": [
1213
+ {
1214
+ "text": "Blog and docs describe only what ships in GA"
1215
+ },
1216
+ {
1217
+ "text": "The security-disclosure paragraph is reviewed by the security lead"
1218
+ }
1219
+ ],
1220
+ "dor": "ready"
1221
+ },
1222
+ {
1223
+ "wbs_path": "4",
1224
+ "name": "Press & analyst outreach",
1225
+ "status": "NOT_STARTED",
1226
+ "planned_start": "A-1",
1227
+ "assignee": "jane",
1228
+ "governance_class": "flow",
1229
+ "duration": 3,
1230
+ "delivery_mode": "scrum",
1231
+ "type": "story",
1232
+ "story_points": 5,
1233
+ "sprint": "ga-s2",
1234
+ "assignments": [
1235
+ {
1236
+ "resource": "jane",
1237
+ "units": 1.0
1238
+ }
1239
+ ],
1240
+ "acceptance_criteria": [
1241
+ {
1242
+ "text": "Every briefing uses the approved positioning"
1243
+ },
1244
+ {
1245
+ "text": "No outreach goes out before the embargo lifts"
1246
+ }
1247
+ ],
1248
+ "dor": "ready"
1249
+ },
1250
+ {
1251
+ "wbs_path": "5",
1252
+ "name": "GA announcement go-live",
1253
+ "status": "NOT_STARTED",
1254
+ "planned_start": "A+13",
1255
+ "assignee": "jane",
1256
+ "governance_class": "gated",
1257
+ "is_milestone": true,
1258
+ "delivery_mode": "milestone",
1259
+ "type": "task",
1260
+ "sprint": "ga-s2",
1261
+ "labels": [
1262
+ "gate",
1263
+ "critical-path",
1264
+ "cross-workstream"
1265
+ ]
1266
+ },
1267
+ {
1268
+ "wbs_path": "6",
1269
+ "name": "Marketing standup",
1270
+ "status": "NOT_STARTED",
1271
+ "duration": 1,
1272
+ "assignee": "dana",
1273
+ "delivery_mode": "scrum",
1274
+ "recurrence": {
1275
+ "frequency": "WEEKLY",
1276
+ "weekdays": [
1277
+ "tue",
1278
+ "thu"
1279
+ ],
1280
+ "time_of_day": "10:00"
1281
+ }
1282
+ },
1283
+ {
1284
+ "wbs_path": "4.1",
1285
+ "name": "Analyst briefing deck",
1286
+ "status": "NOT_STARTED",
1287
+ "duration": 1,
1288
+ "assignee": "jane",
1289
+ "is_subtask": true,
1290
+ "delivery_mode": "scrum"
1291
+ },
1292
+ {
1293
+ "wbs_path": "4.2",
1294
+ "name": "Press list and embargo notes",
1295
+ "status": "NOT_STARTED",
1296
+ "duration": 1,
1297
+ "assignee": "jane",
1298
+ "is_subtask": true,
1299
+ "delivery_mode": "scrum"
1300
+ }
1301
+ ],
1302
+ "dependencies": [
1303
+ {
1304
+ "predecessor": "1",
1305
+ "successor": "3",
1306
+ "dep_type": "FS",
1307
+ "lag": 0
1308
+ },
1309
+ {
1310
+ "predecessor": "1",
1311
+ "successor": "4",
1312
+ "dep_type": "FS",
1313
+ "lag": 0
1314
+ },
1315
+ {
1316
+ "predecessor": "ga-platform:5",
1317
+ "successor": "5",
1318
+ "dep_type": "FS",
1319
+ "lag": 0
1320
+ },
1321
+ {
1322
+ "predecessor": "ga-security:5",
1323
+ "successor": "5",
1324
+ "dep_type": "FS",
1325
+ "lag": 0
1326
+ }
1327
+ ],
1328
+ "board_columns": [
1329
+ {
1330
+ "status": "BACKLOG",
1331
+ "label": "Backlog",
1332
+ "visible": true
1333
+ },
1334
+ {
1335
+ "status": "NOT_STARTED",
1336
+ "label": "Not started",
1337
+ "visible": true
1338
+ },
1339
+ {
1340
+ "status": "IN_PROGRESS",
1341
+ "label": "In progress",
1342
+ "visible": true
1343
+ },
1344
+ {
1345
+ "status": "REVIEW",
1346
+ "label": "Review",
1347
+ "visible": true
1348
+ },
1349
+ {
1350
+ "status": "COMPLETE",
1351
+ "label": "Complete",
1352
+ "visible": true
1353
+ }
1354
+ ],
1355
+ "members": [
1356
+ {
1357
+ "account": "jane",
1358
+ "role": "OWNER"
1359
+ },
1360
+ {
1361
+ "account": "dana",
1362
+ "role": "ADMIN"
1363
+ },
1364
+ {
1365
+ "account": "lena",
1366
+ "role": "MEMBER"
1367
+ },
1368
+ {
1369
+ "account": "bob",
1370
+ "role": "VIEWER"
1371
+ }
1372
+ ],
1373
+ "baselines": [
1374
+ {
1375
+ "name": "GA plan baseline",
1376
+ "is_active": true,
1377
+ "captured_at": "A-43",
1378
+ "tasks": [
1379
+ {
1380
+ "task": "1",
1381
+ "start": "A-45",
1382
+ "finish": "A-42",
1383
+ "duration": 3
1384
+ },
1385
+ {
1386
+ "task": "2",
1387
+ "start": "A-41",
1388
+ "finish": "A-36",
1389
+ "duration": 5
1390
+ },
1391
+ {
1392
+ "task": "3",
1393
+ "start": "A-39",
1394
+ "finish": "A-36",
1395
+ "duration": 3
1396
+ },
1397
+ {
1398
+ "task": "4",
1399
+ "start": "A-36",
1400
+ "finish": "A-33",
1401
+ "duration": 3
1402
+ }
1403
+ ]
1404
+ }
1405
+ ],
1406
+ "sprints": [
1407
+ {
1408
+ "slug": "ga-s1",
1409
+ "name": "Launch Readiness",
1410
+ "goal": "Land the messaging and the launch site so everything after this is content, not positioning.",
1411
+ "state": "COMPLETED",
1412
+ "start_date": "A-45",
1413
+ "finish_date": "A-34",
1414
+ "capacity_points": 18,
1415
+ "committed_points": 18,
1416
+ "completed_points": 13
1417
+ },
1418
+ {
1419
+ "slug": "ga-s2",
1420
+ "name": "Launch Week",
1421
+ "goal": "Finish the launch content and execute the GA go-live behind the platform and security gates.",
1422
+ "state": "ACTIVE",
1423
+ "start_date": "A-5",
1424
+ "finish_date": "A+6",
1425
+ "capacity_points": 12,
1426
+ "committed_points": 10,
1427
+ "target_milestone": "5"
1428
+ }
1429
+ ],
1430
+ "risks": [
1431
+ {
1432
+ "slug": "announce-before-signoff",
1433
+ "title": "Announcement date set before the security gate clears",
1434
+ "status": "MITIGATING",
1435
+ "probability": 3,
1436
+ "impact": 5,
1437
+ "category": "PROJECT_MANAGEMENT",
1438
+ "response": "AVOID",
1439
+ "mitigation_due_date": "A+9",
1440
+ "owner": "jane",
1441
+ "trigger": "Press embargo time is committed to an outlet before security sign-off is forecast to clear.",
1442
+ "contingency": "Avoided by construction rather than managed: the go-live milestone is a hard successor of both the platform and security gates, so the date cannot be promised ahead of them without breaking the schedule.",
1443
+ "tasks": [
1444
+ "5"
1445
+ ]
1446
+ }
1447
+ ],
1448
+ "team": {
1449
+ "name": "Launch Marketing",
1450
+ "members": [
1451
+ {
1452
+ "account": "dana",
1453
+ "scrum_master": true
1454
+ },
1455
+ {
1456
+ "account": "jane",
1457
+ "product_owner": true
1458
+ }
1459
+ ]
1460
+ }
1461
+ }
1462
+ ],
1463
+ "events": [
1464
+ {
1465
+ "at": "A-42T09:00",
1466
+ "action": "task.status",
1467
+ "target": "task:ga-platform:1",
1468
+ "actor": "malcolm",
1469
+ "to": "IN_PROGRESS"
1470
+ },
1471
+ {
1472
+ "at": "A-40T16:00",
1473
+ "action": "task.comment",
1474
+ "target": "task:ga-platform:1",
1475
+ "actor": "malcolm",
1476
+ "body": "Capacity baseline is in: we held 5x observed peak with autoscaler recovery inside 90 seconds. That is well past the GA projection."
1477
+ },
1478
+ {
1479
+ "at": "A-40T16:30",
1480
+ "action": "risk.note",
1481
+ "target": "risk:load-ceiling",
1482
+ "actor": "malcolm",
1483
+ "body": "Load test cleared the ceiling we were worried about. Closing this — the remaining platform exposure is failover, not scale."
1484
+ },
1485
+ {
1486
+ "at": "A-40T17:00",
1487
+ "action": "risk.status",
1488
+ "target": "risk:load-ceiling",
1489
+ "actor": "malcolm",
1490
+ "to": "RESOLVED"
1491
+ },
1492
+ {
1493
+ "at": "A-39T09:00",
1494
+ "action": "task.status",
1495
+ "target": "task:ga-platform:1",
1496
+ "actor": "malcolm",
1497
+ "to": "COMPLETE"
1498
+ },
1499
+ {
1500
+ "at": "A-25T11:00",
1501
+ "action": "risk.status",
1502
+ "target": "risk:failover-untested",
1503
+ "actor": "sam",
1504
+ "to": "OPEN"
1505
+ },
1506
+ {
1507
+ "at": "A-25T11:15",
1508
+ "action": "risk.note",
1509
+ "target": "risk:failover-untested",
1510
+ "actor": "sam",
1511
+ "body": "The load test that closed load-ceiling exercised the autoscaler, not a failover — we still haven't forced a primary loss under production-shaped write volume. Keeping this open; the manual runbook in the contingency is the fallback if a drill doesn't land before GA."
1512
+ },
1513
+ {
1514
+ "at": "A-22T15:00",
1515
+ "action": "task.comment",
1516
+ "target": "task:ga-platform:5",
1517
+ "actor": "malcolm",
1518
+ "body": "Platform is GA-ready: autoscaling, failover hardening and alerting are all in. The go-live milestone can stop waiting on us."
1519
+ },
1520
+ {
1521
+ "at": "A-33T10:00",
1522
+ "action": "task.comment",
1523
+ "target": "task:ga-soc2:2",
1524
+ "actor": "bob",
1525
+ "body": "Policy authoring needs @ga-lena for the control narratives, but launch content needs her the same week. Flagging it rather than quietly double-booking."
1526
+ },
1527
+ {
1528
+ "at": "A-33T14:00",
1529
+ "action": "task.assign",
1530
+ "target": "task:ga-soc2:2",
1531
+ "actor": "dana",
1532
+ "assignee": "bob"
1533
+ },
1534
+ {
1535
+ "at": "A-32T09:30",
1536
+ "action": "risk.note",
1537
+ "target": "risk:writer-contention",
1538
+ "actor": "dana",
1539
+ "body": "Decision: launch content wins the week. Control owners draft their own narratives and Lena edits after GA. Backfilling a writer now costs more ramp than it buys — accepting this rather than pretending we solved it."
1540
+ },
1541
+ {
1542
+ "at": "A-32T10:00",
1543
+ "action": "risk.status",
1544
+ "target": "risk:writer-contention",
1545
+ "actor": "dana",
1546
+ "to": "OPEN"
1547
+ },
1548
+ {
1549
+ "at": "A-21T09:00",
1550
+ "action": "task.status",
1551
+ "target": "task:ga-security:1",
1552
+ "actor": "janus",
1553
+ "to": "IN_PROGRESS"
1554
+ },
1555
+ {
1556
+ "at": "A-16T17:00",
1557
+ "action": "task.status",
1558
+ "target": "task:ga-security:1",
1559
+ "actor": "janus",
1560
+ "to": "COMPLETE"
1561
+ },
1562
+ {
1563
+ "at": "A-14T09:00",
1564
+ "action": "task.status",
1565
+ "target": "task:ga-security:2",
1566
+ "actor": "janus",
1567
+ "to": "IN_PROGRESS"
1568
+ },
1569
+ {
1570
+ "at": "A-13T16:00",
1571
+ "action": "task.comment",
1572
+ "target": "task:ga-security:2",
1573
+ "actor": "janus",
1574
+ "body": "Triage done: seven criticals, not the four we planned for. Two of them are auth-path issues that need a real fix, not a patch. @ga-dana",
1575
+ "slug": "pentest-triage"
1576
+ },
1577
+ {
1578
+ "at": "A-13T16:30",
1579
+ "action": "risk.note",
1580
+ "target": "risk:critical-findings",
1581
+ "actor": "janus",
1582
+ "body": "Re-estimating remediation from 5 days to 7. The GA plan baseline keeps the 5 so the slip stays visible instead of becoming the plan."
1583
+ },
1584
+ {
1585
+ "at": "A-13T17:00",
1586
+ "action": "risk.status",
1587
+ "target": "risk:critical-findings",
1588
+ "actor": "janus",
1589
+ "to": "MITIGATING"
1590
+ },
1591
+ {
1592
+ "at": "A-12T09:00",
1593
+ "action": "task.status",
1594
+ "target": "task:ga-security:2",
1595
+ "actor": "janus",
1596
+ "to": "COMPLETE"
1597
+ },
1598
+ {
1599
+ "at": "A-5T09:00",
1600
+ "action": "task.status",
1601
+ "target": "task:ga-security:3",
1602
+ "actor": "janus",
1603
+ "to": "IN_PROGRESS"
1604
+ },
1605
+ {
1606
+ "at": "A-4T09:00",
1607
+ "action": "task.comment",
1608
+ "target": "task:ga-security:3",
1609
+ "actor": "dana",
1610
+ "body": "Pulling @ga-malcolm onto the auth-path criticals at half time. He is still carrying the platform rollout, so this is a real over-allocation, not a spare-capacity reassignment — it is the trade we are choosing."
1611
+ },
1612
+ {
1613
+ "at": "A-4T09:30",
1614
+ "action": "task.assign",
1615
+ "target": "task:ga-security:3",
1616
+ "actor": "dana",
1617
+ "assignee": "janus"
1618
+ },
1619
+ {
1620
+ "at": "A-4T09:45",
1621
+ "action": "risk.note",
1622
+ "target": "risk:shared-people",
1623
+ "actor": "dana",
1624
+ "body": "The Malcolm reassignment above is this risk firing, not a new problem — he's now over 100% between the platform rollout and security remediation. Accepting it and sequencing rather than pulling in a fourth person: security remediation gets his time first since it's on the critical path to sign-off."
1625
+ },
1626
+ {
1627
+ "at": "A-2T15:00",
1628
+ "action": "task.comment",
1629
+ "target": "task:ga-security:3",
1630
+ "actor": "janus",
1631
+ "body": "Five of seven criticals closed and verified locally. The two auth-path fixes are in review."
1632
+ },
1633
+ {
1634
+ "at": "A-2T15:15",
1635
+ "action": "risk.note",
1636
+ "target": "risk:retest-capacity",
1637
+ "actor": "janus",
1638
+ "body": "With five of seven criticals closed, we'll be requesting the re-test slot inside two weeks. Calling the tester now to hold a slot ahead of remediation actually finishing, rather than waiting and testing the five-day SLA for real."
1639
+ },
1640
+ {
1641
+ "at": "A-1T10:00",
1642
+ "action": "risk.status",
1643
+ "target": "risk:evidence-window",
1644
+ "actor": "bob",
1645
+ "to": "MITIGATING"
1646
+ },
1647
+ {
1648
+ "at": "A-1T10:30",
1649
+ "action": "risk.note",
1650
+ "target": "risk:evidence-window",
1651
+ "actor": "bob",
1652
+ "body": "Splitting evidence collection: everything that does not depend on the pen-test result starts now, and only the security controls wait for sign-off. That takes the audit date off the remediation critical path."
1653
+ },
1654
+ {
1655
+ "at": "A-45T09:00",
1656
+ "action": "sprint.activate",
1657
+ "target": "sprint:ga-marketing:ga-s1",
1658
+ "actor": "jane"
1659
+ },
1660
+ {
1661
+ "at": "A-43T10:00",
1662
+ "action": "task.status",
1663
+ "target": "task:ga-marketing:1",
1664
+ "actor": "jane",
1665
+ "to": "IN_PROGRESS"
1666
+ },
1667
+ {
1668
+ "at": "A-41T16:00",
1669
+ "action": "task.status",
1670
+ "target": "task:ga-marketing:1",
1671
+ "actor": "jane",
1672
+ "to": "COMPLETE"
1673
+ },
1674
+ {
1675
+ "at": "A-40T09:00",
1676
+ "action": "task.status",
1677
+ "target": "task:ga-marketing:2",
1678
+ "actor": "jane",
1679
+ "to": "IN_PROGRESS"
1680
+ },
1681
+ {
1682
+ "at": "A-36T15:00",
1683
+ "action": "task.comment",
1684
+ "target": "task:ga-marketing:3",
1685
+ "actor": "lena",
1686
+ "body": "Blog and docs are not going to land this sprint — the policy narratives took the days. Carrying it to Launch Week."
1687
+ },
1688
+ {
1689
+ "at": "A-35T17:00",
1690
+ "action": "task.status",
1691
+ "target": "task:ga-marketing:2",
1692
+ "actor": "jane",
1693
+ "to": "COMPLETE"
1694
+ },
1695
+ {
1696
+ "at": "A-34T17:00",
1697
+ "action": "sprint.close",
1698
+ "target": "sprint:ga-marketing:ga-s1",
1699
+ "actor": "jane",
1700
+ "goal_outcome": "MET"
1701
+ },
1702
+ {
1703
+ "at": "A-34T17:30",
1704
+ "action": "retro.action",
1705
+ "target": "sprint:ga-marketing:ga-s1",
1706
+ "actor": "jane",
1707
+ "assignee": "jane",
1708
+ "points": 1,
1709
+ "body": "Stop committing Lena's stories at full points while she is split across two workstreams — size them at her real availability."
1710
+ },
1711
+ {
1712
+ "at": "A-34T17:45",
1713
+ "action": "retro.action",
1714
+ "target": "sprint:ga-marketing:ga-s1",
1715
+ "actor": "lena",
1716
+ "assignee": "lena",
1717
+ "points": 2,
1718
+ "notes": "Sprint 1 closed MET, but only just — Lena's stories were sized at full points despite her being split across policy authoring and launch content, and the blog draft was serialized behind final site copy instead of running in parallel against the messaging doc. Both go into how Sprint 2 is planned.",
1719
+ "body": "Draft the launch blog against the messaging doc before the site copy is final, so the two are not serialized."
1720
+ },
1721
+ {
1722
+ "at": "A-5T09:00",
1723
+ "action": "sprint.activate",
1724
+ "target": "sprint:ga-marketing:ga-s2",
1725
+ "actor": "jane"
1726
+ },
1727
+ {
1728
+ "at": "A-5T09:30",
1729
+ "action": "task.status",
1730
+ "target": "task:ga-marketing:3",
1731
+ "actor": "lena",
1732
+ "to": "IN_PROGRESS"
1733
+ },
1734
+ {
1735
+ "at": "A-3T11:00",
1736
+ "action": "task.comment",
1737
+ "target": "task:ga-marketing:4",
1738
+ "actor": "dana",
1739
+ "body": "Adding a security-disclosure paragraph to press outreach — with seven criticals found and fixed, the announcement has to say so."
1740
+ },
1741
+ {
1742
+ "at": "A-3T11:15",
1743
+ "action": "sprint.scope_inject",
1744
+ "target": "task:ga-marketing:4",
1745
+ "actor": "dana",
1746
+ "goal_impact": false
1747
+ },
1748
+ {
1749
+ "at": "A-3T11:30",
1750
+ "action": "sprint.scope_resolve",
1751
+ "target": "task:ga-marketing:4",
1752
+ "actor": "jane",
1753
+ "to": "ACCEPTED",
1754
+ "body": "Accepted. It is a paragraph, not a story, and shipping the announcement without it would be the bigger problem."
1755
+ },
1756
+ {
1757
+ "at": "A-1T14:00",
1758
+ "action": "task.comment",
1759
+ "target": "task:ga-marketing:3",
1760
+ "actor": "lena",
1761
+ "body": "Blog draft is up and the docs diff is open for review. Two points left."
1762
+ },
1763
+ {
1764
+ "at": "A+0T09:00",
1765
+ "action": "task.comment",
1766
+ "target": "task:ga-marketing:5",
1767
+ "actor": "dana",
1768
+ "body": "Go-live still gates on both the platform milestone (clear) and security sign-off (in remediation). Holding the embargo time until sign-off forecasts."
1769
+ },
1770
+ {
1771
+ "at": "A+0T09:15",
1772
+ "action": "risk.note",
1773
+ "target": "risk:announce-before-signoff",
1774
+ "actor": "jane",
1775
+ "body": "No embargo time has gone to an outlet, and it won't until Dana's note above turns into an actual sign-off forecast — the schedule dependency is doing the avoiding for us. Holding at mitigating until security clears."
1776
+ },
1777
+ {
1778
+ "at": "A+0T09:30",
1779
+ "action": "risk.note",
1780
+ "target": "risk:gate-convergence",
1781
+ "actor": "dana",
1782
+ "body": "Same convergence Jane just flagged above, one level up: platform is clear, security sign-off is the one gate still in remediation, and it's what SOC 2 evidence and the marketing embargo are both waiting on too. If it slips past day 54 the decouple-and-hold plan in the contingency is what fires, not a date change."
1783
+ },
1784
+ {
1785
+ "at": "A-12T09:00",
1786
+ "action": "task.comment",
1787
+ "target": "task:ga-security:2",
1788
+ "actor": "dana",
1789
+ "reply_to": "pentest-triage",
1790
+ "slug": "triage-ask",
1791
+ "body": "Seven is the number we plan against now. @ga-malcolm can you take the two auth-path criticals?"
1792
+ },
1793
+ {
1794
+ "at": "A-12T11:00",
1795
+ "action": "task.comment",
1796
+ "target": "task:ga-security:2",
1797
+ "actor": "malcolm",
1798
+ "reply_to": "pentest-triage",
1799
+ "body": "Yes, half time from Monday. Platform on-call stays with me."
1800
+ },
1801
+ {
1802
+ "at": "A-13T16:30",
1803
+ "action": "task.ack",
1804
+ "target": "comment:pentest-triage",
1805
+ "actor": "malcolm"
1806
+ },
1807
+ {
1808
+ "at": "A-12T09:30",
1809
+ "action": "task.react",
1810
+ "target": "comment:triage-ask",
1811
+ "actor": "janus",
1812
+ "emoji": "👍"
1813
+ },
1814
+ {
1815
+ "at": "A-30T10:00",
1816
+ "action": "task.comment",
1817
+ "target": "task:ga-soc2:2",
1818
+ "actor": "bob",
1819
+ "body": "@ga-lena the control narratives for CC6 and CC7 are the two I need first; the rest can follow."
1820
+ },
1821
+ {
1822
+ "at": "A-20T14:00",
1823
+ "action": "task.comment",
1824
+ "target": "task:ga-soc2:3",
1825
+ "actor": "bob",
1826
+ "body": "Evidence collection is gated on security sign-off, so I am starting with the controls that do not depend on it."
1827
+ },
1828
+ {
1829
+ "at": "A-8T10:00",
1830
+ "action": "task.comment",
1831
+ "target": "task:ga-soc2:3",
1832
+ "actor": "bob",
1833
+ "body": "Access-review evidence is pulled for the quarter. Change-management evidence waits on the remediation tickets."
1834
+ },
1835
+ {
1836
+ "at": "A-6T15:00",
1837
+ "action": "task.comment",
1838
+ "target": "task:ga-soc2:4",
1839
+ "actor": "malcolm",
1840
+ "body": "Readiness review slot is held with the auditor. It moves if sign-off moves."
1841
+ },
1842
+ {
1843
+ "at": "A-1T16:00",
1844
+ "action": "task.comment",
1845
+ "target": "task:ga-marketing:4",
1846
+ "actor": "jane",
1847
+ "body": "@ga-lena @ga-dana press outreach waits on the blog draft. I would rather slip outreach a day than send it without the disclosure paragraph."
1848
+ },
1849
+ {
1850
+ "at": "A-33T10:05",
1851
+ "action": "task.note",
1852
+ "target": "task:ga-soc2:2",
1853
+ "actor": "bob",
1854
+ "body": "Decision: Lena drafts the control narratives first and launch content second. The blog slips rather than the audit.",
1855
+ "decision": true
1856
+ },
1857
+ {
1858
+ "at": "A-4T09:05",
1859
+ "action": "task.note",
1860
+ "target": "task:ga-security:3",
1861
+ "actor": "dana",
1862
+ "body": "Decision: Malcolm splits half time onto the two auth-path criticals; platform on-call stays with him rather than rotating mid-launch.",
1863
+ "decision": true,
1864
+ "pinned": true
1865
+ },
1866
+ {
1867
+ "at": "A-1T15:00",
1868
+ "action": "task.ac_met",
1869
+ "target": "task:ga-marketing:3",
1870
+ "actor": "jane",
1871
+ "criterion": 0
1872
+ },
1873
+ {
1874
+ "at": "A-2T14:00",
1875
+ "action": "time.log",
1876
+ "target": "task:ga-security:3",
1877
+ "actor": "janus",
1878
+ "minutes": 300,
1879
+ "note": "Verify the auth-path critical fixes"
1880
+ },
1881
+ {
1882
+ "at": "A-1T13:30",
1883
+ "action": "time.log",
1884
+ "target": "task:ga-marketing:3",
1885
+ "actor": "lena",
1886
+ "minutes": 240,
1887
+ "note": "Blog draft and docs diff"
1888
+ },
1889
+ {
1890
+ "at": "A-3T11:30",
1891
+ "action": "task.block",
1892
+ "target": "task:ga-marketing:4",
1893
+ "actor": "jane",
1894
+ "body": "No embargo time yet, so outreach cannot be scheduled with anyone.",
1895
+ "blocker_type": "other"
1896
+ },
1897
+ {
1898
+ "at": "A-2T10:00",
1899
+ "action": "task.unblock",
1900
+ "target": "task:ga-marketing:4",
1901
+ "actor": "dana",
1902
+ "body": "Embargo set for go-live morning."
1903
+ }
1904
+ ]
1905
+ }