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