•  
     
    story #21368 create mirrored iteration
Summary
Program Manager
create mirrored iteration
Empty

Overview

Iterations are optional in Program Management, if they are used, it's the downstream level of Program Increment. A Program Increment is made of N iterations however there is not strict enforcement of dates (ie. a Program Manager might define timeframe for Iterations that are outside of the boundaries of Program Increment).

Program Increments artifacts have an _is_child "forward" link to Iteration artifacts:

graph LR
    pi["Program Increment"] -->|_is_child| iteration["Iteration"]

Terms

For the sake of clarity, there should be some renaming:

  • What is called "Mirrored Milestones" as of today should be known as "Mirrored Program Increments"
  • The new concept will be called "Mirrored Iterations"
  • The shared concepts between "Program Increments" and "Iterations" should be called "Timebox"
  • The shared concepts between "Mirrored Program Increments" and "Mirrored Iterations" should be called "Mirrored Timebox" (the type of artifact link is not renamed)

Expected behaviour

The existing REST route PUT /projects/{id}/program_plan is modified to allow configuration of the "Iteration" level:

  • Which tracker is selected as Iteration
  • What are the custom labels (if any)

Creation preconditions

The creation of a new Iteration is done in the corresponding "Iteration" tracker. There are guards to ensure the consistency of the creation. It's the same that applies for Program Increment:

  • The following tracker semantics must be compatible:
    • Title
    • Description
    • Status
    • Timeframe (either all trackers have start / end dates or they all have start date / duration)
  • Synchronized fields are derived from those semantics.
  • There are no required fields outside of synchronized fields.
  • "Open" values for Status semantic are compatible (all Team trackers can have more "open" values than Program tracker but not fewer)
  • Tracker workflows are compatible = no synchronized field is used in workflow, no synchronized field is used in date rules and no synchronized field is used in list rules.
  • The current user (the user who is creating the Iteration) must have permission to submit in all mirrored trackers
  • All synchronized fields can be "submit" and "updated" by the current user.
  • Iteration and Mirrored Iteration trackers all have an Artifact link field, and it can be "submit" and "updated" by the current user.

In addition to that, the Agile Dashboard configuration of each Team project must have at least one "2nd level" planning (eg. Sprint planning). If there is more than 2 level it's not a blocker (but it will not be used FWIW).

If one of those checks fails, the user will not be allowed to create an Iteration

Creation of iteration

When all the preconditions are met, the creation of an artifact in the Iteration tracker will automatically create the mirrored iteration in associated Teams projects. The mirrored iteration is created as a child of the mirrored program increments (⚠️ this is an additional step when compared to the behaviour of Mirrored Program Increments).

Modification of Parent Milestones

This was a forgotten AC in the previous implementation. When a Parent Timebox (Program Increment or Iteration) is modified at the Program level, the mirrored timeboxes must be "re-synchronized" (if necessary) on the following semantics:

  • Title
  • Description
  • Status
  • Timeframe
Empty
Empty
Status
Empty
Done
Development
  • [ ] Does it involves User Interface? 
  • [ ] Are there any mockups?
  • [ ] Are permissions checked?
  • [ ] Does it need Javascript development?
  • [ ] Does it need a forge upgrade bucket?
  • [ ] Does it need to execute things in system events?
  • [ ] Does it impact project creation (templates)?
  • [ ] Is it exploratory?
Empty
Details
#21368
Manuel Vacelet (vaceletm)
2022-01-03 16:43
2021-05-18 17:18
3743

References
Referencing story #21368

Git commit

tuleap/tuleap/stable

Replace MirroredMilestone to MirroredProgramIncrement to be compliant with terms 548a540bed
Change custom_label names in REST payload a7d98f34c5
Program Increment cards does not respect the user locale when formatting dates b0feac4ecc
Add an ADR to explain mirror milestones bc50d2c912
Modify PUT REST route to allow configuration of Iterations 6a05f39b24
Move ProgramIncrementId in program table and add ProjectId in plan table ce5b0e3734
Merge program increment labels in our new table dd8a736973
Refacto - ProgramIncrementArtifactCreatorChecker becomes generic 310ec2908a
Update glossary to sort term alphabetically c74bbf0c96
Rename MirroredMilestone to MirroredTimebox bb02b5a0dc
refactoring: use named constructor pattern for ProgramTracker and TrackerCollection aa70d107ee
refactoring: interface VerifyIsProgramIncrementTracker cc82fa0e06
Move Program Increments configuration to dedicated DAO e3fa6a942c
Refacto - Add logger in SemanticChecker b0bf03c250
Refacto - Retrieve team trackers collection out of TimeboxCreatorChecker 8a38471c82
Use createStub instead of createMock in TimeboxCreatorChecker fa55f07fee
Give ProgramIdentifier to PI builder instead of Project f4949e5468
Refacto - Rename RetrieveRootPlanningMilestoneTracker and retrieve second planning milestone tracker 7cab81a28f
Refactoring: build SourceTrackerCollection with named constructor pattern 8e108ea4e2
Refacto - Build teams project in CanSubmitNewArtifactHandler 5f1780a716
Refactoring: build Program Increment tracker with named constructor pattern 1149bee47e
Ensure to check that is an iteration tracker 5f84b25c62
Prevent deletion of Iteration and Mirrored Iteration Trackers 763818c7b3
Run all the checks before creating iterations b60da0aca6
Also run Semantic checks on Timebox tracker 8021487c55
Refactoring: build TeamProjectBuilder with a named consctrutor pattern aefaad494a
Change "New" PI button and PI empty state 7ff78d4ed5
Team with 2 programs references only 1 program 8663d71f24
Remove planning disabling event fdd016aa00
Reveert tracker::userCanView() in BacklogItemCollectionFactory 3b880d864b
Extract ArtifactUpdatedHandler ea641bb5cb
Detect an update of program increment artifact 6b7be87431
Search iterations of a Program Increment 8510fc7c41
Detect that the P.I. has a new link to an Iteration f2a0bf9c56
Add checks on artifact link field and trackers deletion 5c9054ac02
Retrieve Iteration Last changeset fe4eb0105c
Store Iteration replications in DB e4ac3515f3
Write log when replication is processed by Redis e797b4cbdd
Rebuild IterationCreation from DB 1d7ac97f5d
Set Interfaces before Proxies 165b4f1eeb
Enforce checks on User::fromId afd6d0a946
Enforce checks on IterationIdentifier::fromId 38e8815e6b
Enforce checks on ChangesetIdentifier::fromId b56d2c1cc4
Write an ADR on ⬡ Hexagonal architecture 3be6df7161
Write an ADR on static factory method pattern ac187fef4f
Build ProgramIdentifier from ProgramIncrement fbca65a7d9
Add ArtifactIdentifier and TrackerIdentifier Proxies d0e407b656
Use ProgramIncrementCreation instead of ReplicationData 5f6d8705a8
Add a common Interface for Replication of Timeboxes 0bd521510e
Kill ReplicationData ? a8a4797a2b
Use asynchronous event as the only source for Program Increment updates 51914ab7c7
Use asynchronous event as the only source for Iteration creations a25a8fd477
Gather source changeset values from iteration 3aca508882
Do not require UserReference in BuildProgram 2d2a123a55
Retrieve Teams of current Program d56a3767bd
Retrieve Mirrored Iterations trackers b353dd9d7a
Give a Changeset object to CreateArtifact 5c328a05ab
Split interface for milestone retrieval e73da86005
Add a builder for TeamProjectsCollection 3fd8b14412
Create mirrored iteration artifacts 29bf8863ba
Harden SearchMirroredTimeboxes 3855e66a8f
Separate formatting from data objects f532d03c20
Retrieve the artifact ID of the just created mirrored iterations b798b21fa8
Retrieve the Mirrored Program Increment of our Mirrored Iteration 58df9c06fa
Build changeset for _is_child link to Mirrored Iterations 6738b14855
Add link from Mirrored PI to Mirrored Iteration a29bb33215
Explain buildCollection() static methods 9c50f2f2dd

Follow-ups

User avatar
Joris MASSON (jmasson)2021-07-29 14:45
  • Acceptance criteria
    Something went wrong, the follow up content couldn't be loaded
    Only formatting have been changed, you should switch to markup to see the changes
User avatar
Joris MASSON (jmasson)2021-07-29 14:44

Explain the link type between Program Increment and Iteration


  • Acceptance criteria
    Something went wrong, the follow up content couldn't be loaded
    Only formatting have been changed, you should switch to markup to see the changes
User avatar
Joris MASSON (jmasson)2021-06-11 12:36

Adjust naming to what has been used throughout the codebase:

  • Milestone -> Timebox
  • Mirrored Milestone -> Mirrored Timebox

"Milestone" is used in Agile Dashboard context. In order to distinguish and have a precise named in Program Management, we have chosen "Timebox" which can designate either a "Program Increment" or an "Iteration". Both of them represents "periods of time".


  • Acceptance criteria
    Something went wrong, the follow up content couldn't be loaded
    Only formatting have been changed, you should switch to markup to see the changes
User avatar
Joris MASSON (jmasson)2021-05-21 11:11

Explain that the existing route for configuration is modified to allow to configure Iterations


  • Acceptance criteria
    Something went wrong, the follow up content couldn't be loaded
    Only formatting have been changed, you should switch to markup to see the changes
User avatar
  • Acceptance criteria
    Something went wrong, the follow up content couldn't be loaded
    Only formatting have been changed, you should switch to markup to see the changes
User avatar
Joris MASSON (jmasson)2021-05-20 11:41

Explain in details which checks are made before creating an Iteration


  • Acceptance criteria
    Something went wrong, the follow up content couldn't be loaded
    Only formatting have been changed, you should switch to markup to see the changes
User avatar
  • Acceptance criteria
    Something went wrong, the follow up content couldn't be loaded
    Only formatting have been changed, you should switch to markup to see the changes