Skip to main content

Jira Project Setup — Ghasi Melmastoon

Companion: JIRA_TICKET_TEMPLATE.md · REQUIREMENTS_GUARD_RAILS.md · docs/07-epics-and-user-stories.md · docs/roadmap/jira-epic-based-sprint-ruleset.md · docs/roadmap/jira-sprint-distribution-rules.md · docs/roadmap/team-capacity-model.md

This document is the single, authoritative configuration of the Jira project that backs Ghasi Melmastoon execution. It exists so that (a) every human contributor sees the same fields and workflows, (b) every AI agent (Cursor, Claude, Copilot) can map a Jira ticket to a spec entity deterministically, and (c) PRs and Jira tickets stay in lockstep automatically.

If this document and the live Jira instance disagree, the document wins. Reconcile in the same PR — change the Jira config, update this doc.


1. Project basics

FieldValue
Project nameGhasi Melmastoon
Project keyMEL
Project typeTeam-managed Software (Atlassian Cloud)
LeadEngineering Director (rotating per quarter; see team-capacity-model.md)
Default assigneeComponent lead (per service ownership table)
URLhttps://ghasitech.atlassian.net/jira/software/projects/MEL
Time zoneUTC (single, fixed; locale displays adjust)
Working weekSun–Thu (Afghanistan) + Mon–Fri (international) — calendars per assignee

The key MEL is the ticket prefix. Commit subjects, branch names, PR titles, and audit trails reference MEL-<n>. The branded ID prefix in the codebase is independent (tnt_, rsv_, …) — Jira IDs and entity IDs never collide because Jira is MEL-1234 and entity IDs are <prefix>_<ulid>.


2. Issue types (closed set)

Issue typePurposeHierarchy parentSpec source of truth
EpicOne-to-one with EP-MEL-NN from 07-epics-and-user-stories.md. Twenty in total.(root)docs/07-epics-and-user-stories.md §3+
StoryOne-to-one with US-MEL-NNNN. Engineering deliverable.EpicSame doc, story sections
TaskEngineering work that does not map to a US-MEL-NNNN (e.g., refactor, infra, tooling, ADR follow-up).Epic (or none)None
BugDefect against a shipped story. Mandatory regression test.Story (or Epic if cross-story)None
SpikeTime-boxed investigation. Output is an ADR or a sized story.Epic (or none)None
ADRArchitecture decision record. Captures a tradeoff before code lands.Epic (or none)docs/architecture/ADR-NNNN-*.md
Sub-taskDecomposition of a Story or Task only when needed for parallel work; never to bypass story sizing.Story / TaskNone

Forbidden: "Improvement", "Change Request", "Initiative" (use Epic), "Theme" (use Component / Label).


3. Components (one per service + one per surface + one cross-cutting)

A component pins ownership and routes work to the right squad. Components mirror the canonical service catalog and the four user surfaces.

ComponentOwns
iam-serviceIdentity, auth, MFA, SSO, device binding
tenant-serviceTenants, memberships, roles
property-serviceProperties, room types, rooms
reservation-serviceBookings, reservations, holds, stays
inventory-serviceAllocation, availability
pricing-serviceRate plans, dynamic pricing, FX
billing-serviceFolios, charges, invoices, taxes
payment-gateway-serviceCard, PayPal, MFS, cash, refunds
lock-integration-serviceMobile keys, RFID, PIN, vendor adapters
housekeeping-serviceCleaning tasks, board, kiosk
maintenance-serviceWork orders, assets
notification-serviceEmail, SMS, WhatsApp, push, templates
file-storage-serviceUploads, signed URLs, virus scan, lifecycle
staff-serviceStaff members, shifts, schedules
theme-config-serviceThemes, layouts, content blocks, branding
search-aggregation-serviceMeta search index
analytics-serviceEvent ingestion, marts, query API
reporting-serviceOperational, financial, regulatory reports
ai-orchestrator-serviceAll AI calls, HITL, provenance, evals
bff-consumer-serviceMeta web BFF
bff-tenant-booking-serviceTenant booking web/mobile BFF
bff-backoffice-serviceElectron backoffice BFF
app-web-metaapps/web-meta (Next.js)
app-web-tenant-bookingapps/web-tenant-booking (Next.js)
app-mobileapps/mobile (Expo / React Native)
app-desktop-backofficeapps/desktop-backoffice (Electron)
pkg-ui-melmastoon@ghasi/ui-melmastoon design system package
pkg-domain-primitives@ghasi/domain-primitives
pkg-event-envelope@ghasi/event-envelope
pkg-event-schemasEvent JSON schemas registry
pkg-api-contractsOpenAPI + zod contracts
pkg-sync-protocolDesktop ↔ cloud sync protocol
pkg-telemetryTelemetry primitives
pkg-configShared env + config
infra-cloud-runTerraform + Cloud Run
infra-pubsubTopic / sub registry
infra-cloud-sqlPostgres provisioning, RLS audit
infra-secret-kmsSecret Manager + KMS
infra-observabilityOTEL, dashboards, alerts
cross-cuttingAnything truly cross-cutting (rules, docs, governance)

A ticket carries one or more components. Stories that span services list every service involved (matches Services field in the spec story). Multi-component stories are routed by primary component = first listed service.


4. Labels (free-form, but with a controlled vocabulary)

Labels are additive classifiers; they don't replace components. Use the following controlled vocabulary; do not invent new ones without raising a ticket on cross-cutting.

LabelMeaning
surface:web-meta, surface:web-tenant-booking, surface:mobile, surface:desktopFrontend surface(s) the work touches
wave:r1, wave:r2, wave:r3Roadmap wave assignment
priority:p0, priority:p1, priority:p2, priority:p3Priority (mirrors the field; label exists for JQL ergonomics)
type:feature, type:tech-debt, type:perf, type:security, type:a11y, type:i18n, type:offline, type:ai, type:observability, type:ux-polishCross-cutting work type
risk:lock-vendor, risk:payment-vendor, risk:offline-sync, risk:multi-tenant-leak, risk:ai-cost, risk:localeRisk register linkage
dor:incompleteDefinition-of-Ready failed (see §8) — blocks sprint pull
dod:waivedOne DoD bullet waived in this PR with explicit ADR (rare; mandatory ADR link in description)
needs-adrWill produce an ADR before merge
spec-driftImplementation does not match spec; will be reconciled in this ticket
agent-drivenCreated or executed primarily by an AI agent (Cursor / Claude background, Copilot prompt)
quarantine-flakeFlaky E2E quarantined; deadline in description

5. Mandatory custom fields

FieldTypeRequired onValidation
Spec IDShort textStory, TaskRegex `^(US-MEL-\d{4}
Service(s)Multi-select (Components)Story, Task, BugAt least one.
Surface(s)Multi-selectStoryEmpty allowed for backend-only stories.
WaveSingle-select (R1, R2, R3)Epic, StoryRequired for stories pulled into a sprint.
Acceptance CriteriaLong text (Markdown)Story, BugGherkin (Given/When/Then). 2–5 clauses.
DoD applicabilityMulti-select (Universal, Data, API, Events, Security, AI, Frontend, Observability)StoryAt least Universal. Drives the PR template checklist.
Test types requiredMulti-select (Unit, Integration, Contract, E2E, Offline, AI-eval, Perf, Security)StoryAt least Unit + Integration.
ComplexitySingle-select (S, M, L)StoryXL is forbidden — split.
Story PointsNumberStory, TaskOptional but recommended; mapped from Complexity (S=2, M=5, L=8).
Linked Epic IDShort textStoryAuto-populated from Epic link; format EP-MEL-NN.
Linked Journey ID(s)Short text (comma-list)StoryOptional; format J-NN.
Linked Workflow ID(s)Short text (comma-list)StoryOptional; format W-NN.
Linked ADR(s)URLAnyOptional.
Branch nameShort textStory, Task, BugAuto-populated by commands/jira-pull-story.md to features/MEL-<n>-<slug>.
PR URLURLStory, Task, BugAuto-populated by GitHub action on PR open.
Risk scoreNumber 0–10StoryOptional; threshold ≥ 7 forces a security-reviewer subagent run.

Fields not in this table are forbidden unless added in a PR against this document.


6. Workflow (states + transitions)

StateMeaningWho can move it in
BacklogNot yet groomed. May lack AC, DoD applicability, complexity.Anyone (creator).
RefinedDefinition-of-Ready met (see §8). Eligible for sprint pull.Tech lead or product owner.
To DoPulled into the active sprint.Sprint planner.
In ProgressBranch open and active commits.Assignee (or commands/jira-sync-status.md).
In ReviewPR open, awaiting review.Assignee (or GitHub action on PR open).
In QAPR merged into a release branch; QA validation underway (only if a separate QA gate exists for this slice).QA lead.
BlockedCannot proceed; description must list the blocker(s).Anyone, with required Blocker field.
DoneMerged into develop, all DoD bullets ticked, telemetry live.Reviewer on PR merge (action).
Won't DoDecided not to ship.Product owner. Mandatory rationale.
DeferredExplicitly punted to a later sprint or wave. Mandatory Deferred to wave field.Tech lead or product owner.

Allowed transitions:

Backlog -> Refined -> To Do -> In Progress -> In Review -> [In QA ->] Done
^ failed -> In Progress
^ Blocked <-> any active state
Refined -> Won't Do
Refined -> Deferred

A ticket cannot skip from Backlog directly to In Progress. The DoR gate (§8) is enforced at Refined → To Do.


7. Epic mapping (live)

Jira EpicSpec IDTitleWavePrimary component
MEL- (created on first refinement)EP-MEL-01Tenant Onboarding & ConfigurationR1tenant-service
EP-MEL-02Consumer Meta Search LayerR1search-aggregation-service
EP-MEL-03Tenant-Branded Booking ExperienceR1bff-tenant-booking-service
EP-MEL-04Reservation LifecycleR1reservation-service
EP-MEL-05Payment GatewayR1payment-gateway-service
EP-MEL-06Front-Desk Operations on Electron DesktopR1bff-backoffice-service
EP-MEL-07Housekeeping CoordinationR1housekeeping-service
EP-MEL-08Maintenance & Asset ManagementR2maintenance-service
EP-MEL-09Lock & Key IntegrationR1lock-integration-service
EP-MEL-10Offline-First Desktop with Sync EngineR1bff-backoffice-service
EP-MEL-11AI-Assisted OperationsR2ai-orchestrator-service
EP-MEL-12Multi-Tenant Theming & Booking Flow ConfigR1theme-config-service
EP-MEL-13Reporting (Op / Financial / Regulatory)R1reporting-service
EP-MEL-14Analytics PipelineR2analytics-service
EP-MEL-15Multi-Channel NotificationR1notification-service
EP-MEL-16File StorageR1file-storage-service
EP-MEL-17Identity, Auth, RBAC, MFA, SSO, Device BindingR1iam-service
EP-MEL-18Multi-Language & RTL/LTRR1pkg-ui-melmastoon
EP-MEL-19Compliance & RegulatoryR1cross-cutting
EP-MEL-20Observability, Reliability, Cost ControlsR1infra-observability

The first time an epic is refined, an agent (or human) runs commands/jira-create-from-spec.md (Wave 2 deliverable) which creates the Jira Epic, populates Spec ID + Wave + Primary component, and seeds child stories from the spec section.


8. Definition of Ready (DoR) — gate at Refined → To Do

A ticket cannot move into To Do unless every box is true:

  • Spec ID present and resolves to a real US-MEL-NNNN (or, for Task/Bug, a clear technical scope).
  • Acceptance Criteria in Gherkin, 2–5 clauses, no ambiguity.
  • Service(s) populated.
  • Surface(s) populated (or "none" for backend-only).
  • DoD applicability populated.
  • Test types required populated.
  • Complexity = S, M, or L (XL → split).
  • Wave = the wave the sprint belongs to.
  • All linked tickets (blockers, dependencies) are at least Refined.
  • No dor:incomplete label.
  • If risk score ≥ 7, an ADR or security-reviewer subagent run is queued.

Tickets failing DoR are sent back to Refined → Backlog with a dor:incomplete label and a comment listing the gaps.


9. Definition of Done (DoD) — gate at In Review → Done

DoD is the merge checklist in DEFINITION_OF_DONE.md, enforced by the PR template. Jira automation moves the ticket to Done when the PR is merged AND every DoD box ticked AND CI green. A ticket moved to Done without a merged PR raises an alert.


10. JQL filter library (curated)

Saved filters live under My filters and are owned by team-jira-admin. The following are mandatory and must always exist:

Filter nameJQL
MEL: My current workassignee = currentUser() AND status in ("In Progress", "In Review", "Blocked")
MEL: Backlog ready for refinementproject = MEL AND status = Backlog AND issuetype = Story
MEL: Refined awaiting sprintproject = MEL AND status = Refined AND sprint is EMPTY
MEL: Active sprintproject = MEL AND sprint in openSprints()
MEL: DoR-incompleteproject = MEL AND labels = "dor:incomplete"
MEL: Blocked > 24hproject = MEL AND status = Blocked AND updated < -1d
MEL: PR open > 3dproject = MEL AND status = "In Review" AND updated < -3d
MEL: Wave R1 remainingproject = MEL AND "Wave" = R1 AND status not in (Done, "Won't Do", Deferred)
MEL: Service <name>project = MEL AND component = "<service>" AND status not in (Done, "Won't Do") (one per component)
MEL: Spec driftproject = MEL AND labels = "spec-drift"
MEL: Agent-drivenproject = MEL AND labels = "agent-driven"
MEL: Security-reviewed requiredproject = MEL AND ("Risk score" >= 7 OR "DoD applicability" = "Security") AND status not in (Done, "Won't Do")
MEL: Audit close-loop targetsproject = MEL AND labels = "spec-drift" AND status = "Refined"

11. Sprints

  • Cadence: 2 weeks, Sun–Thu primary calendar.
  • Sprint name: R<N>-S<NN> (e.g., R1-S03).
  • Capacity model and per-component allocation: see team-capacity-model.md.
  • Distribution rules: see jira-sprint-distribution-rules.md.
  • Sprint goal: 1–3 sentences referencing the Wave's outcome and the dominant epic(s).
  • Sprint pull policy: only Refined tickets with the same Wave label as the sprint.
  • Mid-sprint scope changes: allowed only if a ticket already in the sprint is descoped to make room (1-for-1 capacity swap), and the change is logged as a comment on both tickets.

12. Boards

BoardTypeFilter
MEL Active SprintScrumproject = MEL AND sprint in openSprints()
MEL RefinementKanbanproject = MEL AND status in (Backlog, Refined)
MEL BugsKanbanproject = MEL AND issuetype = Bug
MEL Per-ServiceKanban (one per service)project = MEL AND component = "<service>"
MEL RoadmapRoadmapAll Epics, grouped by Wave
MEL Risk registerKanbanproject = MEL AND labels in (risk:*)

Columns mirror the workflow states; WIP limits are set per board (default: In Progress ≤ 3 per assignee, In Review ≤ 5 per service).


13. GitHub ↔ Jira automation (mandatory)

TriggerAction
Branch push matching `^(featuresfix
First commit on a MEL-<n> branchMove ticket to In Progress.
PR opened referencing MEL-<n> (in title or body)Set Jira PR URL field. Move ticket to In Review.
PR mergedMove Jira ticket to Done. Add a comment with the merge SHA + author + merged-into branch.
PR closed without mergeMove ticket back to In Progress. Add comment "PR closed without merge".
Comment on PR by security-reviewer agent with BLOCKAdd dod:waived: false and a comment to the Jira ticket; do not move state.
CI failure on a PRAdd a Jira comment with the failing job.

The actions live in .github/workflows/jira-sync.yml (Wave 3 deliverable) and use a service-account API token stored in GitHub Secrets.


14. AI-agent integration (Cursor / Claude / Copilot)

  • The Atlassian MCP server is registered in .cursor/mcp.json and the Claude allowlist (Wave 2 deliverable). Agents can read tickets, post comments, and transition status.
  • commands/jira-pull-story.md — fetch ticket → write planning/ghasi-multi-agent/runs/<slug>/story-from-jira.md → seed the multi-agent workflow.
  • commands/jira-sync-status.md — at each multi-agent stage boundary, comment the stage outcome on the Jira ticket.
  • commands/jira-create-from-spec.md — given an EP-MEL-NN, create the Jira Epic + child stories with all custom fields populated from the spec.
  • commands/jira-sprint-plan.md — apply jira-sprint-distribution-rules.md to assign Refined tickets to the next sprint.
  • The agent-driven label is added automatically by any of the above commands.

Hard rule for agents: never create a Jira ticket without a populated Spec ID unless the issue type is Task, Spike, or ADR. A Story or Bug without a Spec ID fails the Jira automation gate.


15. Provisioning checklist (one-time, by Atlassian admin)

  • Create project Ghasi Melmastoon with key MEL, type Team-managed Software.
  • Disable issue types: Initiative, Improvement, Change, Theme.
  • Add issue types in §2 if missing (ADR is custom).
  • Create components in §3.
  • Add custom fields in §5 (or the closest Atlassian-Cloud equivalent).
  • Configure the workflow in §6 (transition rules, validators on Refined → To Do for §8).
  • Create the saved filters in §10.
  • Create the boards in §12.
  • Provision a service-account API token; store in GitHub Secrets as JIRA_API_TOKEN and JIRA_USER_EMAIL.
  • Install the GitHub-Jira native integration; configure smart-commit prefixes.
  • Install the Atlassian MCP server; verify from a Cursor session.
  • Create the 20 Epics from §7 via commands/jira-create-from-spec.md once Wave 2 lands.
  • Document the configuration drift policy in this file (PR + reconcile in same commit).

16. Anti-patterns (auto-flagged in standups / retros)

  • A Story with no Spec ID.
  • A Story with > 5 acceptance criteria (likely too big — split).
  • A Story with Complexity = XL (forbidden).
  • A Story with no Acceptance Criteria but Refined.
  • An Epic with no child stories after sprint planning starts.
  • A Sub-task that exists only to bypass story sizing.
  • A Bug with no linked PR after merge.
  • A Done ticket with no merged PR.
  • A ticket that bounces Refined ↔ Backlog more than 3 times (likely a spec gap — escalate).
  • More than 30 % of In Progress tickets without a branch link (likely shadow work).

17. Cross-references


18. Versioning of this document

Same governance as CODING_STANDARDS.md §19. Material change to issue types, custom fields, or workflow transitions requires an ADR.