> For the complete documentation index, see [llms.txt](https://docs.shiftiq.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.shiftiq.com/contributors/conventions/obsolete-timeline-changes.md).

# Obsolete timeline changes

We have two kinds of obsolete Changes:

1. The Change can be ignored (we either don't use it at all or we push new changes that replace the old one)
2. The Change should be upgraded to a newer version

## The Change can be ignored

1. Delete the obsolete C# Change class and the related C# code
2. Create the list of obsolete changes
3. Register this list in the Projector's class constructor:

   <figure><img src="/files/n3169QJnUJ69s59PtnsM" alt="Obsolete timeline 01"><figcaption></figcaption></figure>
4. Add a new Handle method for SerializedChange to the Projector class:

   <figure><img src="/files/QB3xA4wkx2KXRSEZWpDW" alt="Obsolete timeline 02"><figcaption></figcaption></figure>
5. Add a new When method to the State class, it will intercept all obsolete changes:

   <figure><img src="/files/EISTUkaF1DStEkgXzk2j" alt="Obsolete timeline 03"><figcaption></figcaption></figure>

## The Change should be upgraded to a new version

Lets assume we have the change **AttemptStarted1** and it needs to be marked as obsolete because we introduced a new change **AttemptStarted2**

1. Make **AttemptStarted1** as a private nested class of **AttemptStarted2** and implement a new Upgrade method that will convert AttemptStarted1 to AttemptStarted2:

   <figure><img src="/files/h5KBJ10qrXjI8Exbqhr4" alt="Obsolete timeline 04"><figcaption></figcaption></figure>
2. Delete all functionality related to **AttemptStarted1**
3. In the AttemptChangeProjector register AttemptStarted1 as an obsolete change:

   <figure><img src="/files/viesRi5zFLls23qLcG1w" alt="Obsolete timeline 05"><figcaption></figcaption></figure>
4. Add a new Handle method in the Projector class that will upgrade **AttemptStarted1** to **AttemptStarted2** and call Handle for **AttemptStarted2**:

   <figure><img src="/files/qQlRSht1xCJGc6FAWNi0" alt="Obsolete timeline 06"><figcaption></figcaption></figure>
5. Add a new When method to AttemptState that will upgrade **AttemptStarted1** to **AttemptStarted2** and call When for **AttemptStarted2**:

   <figure><img src="/files/DsPVL4gxP0QdakaJgtbI" alt="Obsolete timeline 07"><figcaption></figcaption></figure>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.shiftiq.com/contributors/conventions/obsolete-timeline-changes.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
