Gitlab workflows & board specific to the AI's Marketing Initiative
>>> [!note] Migrated issue <!-- Drupal.org comment --> <!-- Migrated from issue #3582480. --> Reported by: [jjchinquist](https://www.drupal.org/user/286806) >>> ## Problem / Motivation The AI Initiative Marketing component uses GitLab issue templates (#3581782) for structured content like blog entries and videos. Templates alone aren't enough — we also need a **defined workflow** with states and transitions tailored to marketing content production. Marketing tasks follow a drafting → review → approval → publication → promotion lifecycle that doesn't map cleanly to the default GitLab issue workflow. ## Context / research Drupal GitLab supports issue boards, scoped labels, and custom workflows (see [workflow for migrated projects](https://www.drupal.org/drupalorg/blog/gitlab-issue-migration-the-new-workflow-for-migrated-projects), [how to use the new workflow](https://www.drupal.org/drupalorg/blog/gitlab-issue-migration-how-to-use-the-new-workflow)). **Existing state on `project/ai_initiative` (reviewed 2026-04-23):** - `state::*` scoped labels already in heavy use from the drupal.org dev-lifecycle migration: `accepted` (100+), `closed` (100+), `postponed` (24), `needsReview` (14), `fixed` (9), `needsWork` (9), `rtbc` (2), `toBePorted` (0). - Scoped labels enforce one-per-scope — a ticket can carry only ONE `state::*` label at a time. - Existing board **"AI Marketing Initiative Current Sprint (Iteration)"** (id 75) already filters by `AI Marketing` label + started milestone. **Sprints are managed as milestones**; the `AI Marketing` label marks a ticket as relevant to marketing boards. - Team convention: **"In progress = open and assigned"** — no dedicated `state::in-progress` label required. - **API restriction:** drupal.org's edge config blocks `POST /api/v4/projects/:id/labels` and `POST /api/v4/projects/:id/boards/:board_id/lists` (both return 301 → drupal.org/git-error). Label creation and board-column configuration must be done via the GitLab web UI by a Maintainer. ## Proposed Resolution (revised) Reuse existing `state::*` labels where semantically close; add only where the content lifecycle extends beyond the dev lifecycle. Keeps the vocabulary small and respects the drupal.org-wide convention. ### State mapping | # | Content phase | Label / mechanism | Status | |---|---|---|---| | 1 | Backlog | *(no label — open, unaccepted)* OR `state::postponed` | falls into default **Open** column | | 2 | Accepted / Planning | `state::accepted` | existing | | 3 | Needs Work (back to planning) | `state::needsWork` | existing; board column sits next to Accepted | | 4 | In Progress | *(open + assigned — team convention)* | — | | 5 | In Review | `state::needsReview` | existing | | 6 | Approval | `state::rtbc` | existing | | 7 | **Ready to Publish** | `state::ready-to-publish` | **NEW** | | 8 | **Published** | `state::published` | **NEW** | | 9 | **Promotion** | `state::promotion` | **NEW** | | 10 | Fixed (handoff / final-review) | `state::fixed` | existing; kept between promotion and closed — practice may refine later | | 11 | Done | `state::closed` + issue closed | existing | ### Typical transitions Primary path: `accepted` → *(in progress)* → `needsReview` → `rtbc` → `ready-to-publish` → `published` → `promotion` → `fixed` → `closed`. Rework branches back to `needsWork` (or `needsReview`) from any review/approval step. ### Board columns (left to right) Default **Open** (backlog: unlabeled tickets + `state::postponed`), then label-based columns in this order, then default **Closed** (done): 1. Accepted — `state::accepted` 2. Needs Work — `state::needsWork` *(adjacent to Accepted — same "back to planning" phase)* 3. In Review — `state::needsReview` 4. Approval — `state::rtbc` 5. Ready to Publish — `state::ready-to-publish` 6. Published — `state::published` 7. Promotion — `state::promotion` 8. Fixed — `state::fixed` Note: `state::toBePorted` is unused (0 issues) and not represented on the board — revisit if that changes. ## Acceptance Criteria - [x] **AC-1: State mapping approved** with the Marketing sub-group (mapping table above). *Split to [#3586409](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586409) — sub-group sign-off tracked there.* - [x] **AC-2: Three new scoped labels created** on `project/ai_initiative` (via GitLab web UI — API blocked by drupal.org): - `state::ready-to-publish` (teal, `#1abc9c`, id 1873) - `state::published` (green, `#28a745`, id 1874) - `state::promotion` (light green, `#8bc34a`, id 1875) - [x] **AC-3: Existing board updated** — `"AI Marketing Initiative Current Sprint (Iteration)"` (id 75) augmented with 8 Kanban columns per the "Board columns" list above. Existing filter (`AI Marketing` label + started milestone) stays. Verified 2026-04-23. - [x] **AC-4: Issue templates** from [#3581782](https://www.drupal.org/project/ai_initiative/issues/3581782) updated to auto-apply `state::accepted` on creation. *Split to [#3586409](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586409) — follow-up MR tracked there.* - [x] **AC-5: Reporter role** granted to regular Marketing contributors. *(Done 2026-04-23 via [#3586381](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586381) — 11 new Reporter memberships.)* - [x] **AC-6: Contribution workflow documentation** — split into its own ticket: [#3586382](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586382) "Contribution workflow for the AI Marketing Initiative" (same Sprint 1 milestone). Tracked there rather than as an AC on this ticket. ## AI Usage - [x] AI Assisted Issue - [ ] AI Assisted Code - [ ] AI Generated Code > Related: [Issue #3581782](https://www.drupal.org/node/3581782) (templates), [#3586382](https://git.drupalcode.org/project/ai_initiative/-/work_items/3586382) (contribution attribution) --- *Drafted with the assistance of AI (Claude Code / Opus 4.7).* > Related issue: [Issue #3581782](https://www.drupal.org/node/3581782)
issue