<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://docs.delftsolutions.nl/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jakobbuis</id>
	<title>Delft Solutions - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://docs.delftsolutions.nl/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jakobbuis"/>
	<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/wiki/Special:Contributions/Jakobbuis"/>
	<updated>2026-10-18T09:08:33Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=789</id>
		<title>Modeling projects</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=789"/>
		<updated>2026-10-13T12:01:39Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: /* Sanity checking the project before release */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Basic guide to modelling projects in A-Dato Lynx. &lt;br /&gt;
&lt;br /&gt;
== Sanity checking the project before release ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Project is configured as just-in-time (JIT):&lt;br /&gt;
        &amp;lt;ol&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;Project start date is &amp;quot;Use current date&amp;quot; (Properties &amp;gt; Project dates &amp;gt; Project start date).&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;Project has an end date (Properties &amp;gt; Project Dates &amp;gt; Project end date)&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;Schedule engine is configured as JIT for both the main chain and feeding chains (Properties &amp;gt; Scheduling &amp;gt; Schedule engine):&lt;br /&gt;
                &amp;lt;ol&amp;gt;&lt;br /&gt;
                    &amp;lt;li&amp;gt;Schedule tasks &#039;just in time&#039; selected.&amp;lt;/li&amp;gt;&lt;br /&gt;
                    &amp;lt;li&amp;gt;Activate CCPM schedule engine On.&amp;lt;/li&amp;gt;&lt;br /&gt;
                    &amp;lt;li&amp;gt;Schedule feeding chains &#039;just in time&#039; selected.&amp;lt;/li&amp;gt;&lt;br /&gt;
                &amp;lt;/ol&amp;gt;&lt;br /&gt;
            &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
ℹ️ ASAP projects are rare, but there can be legitimate reasons to prefer ASAP scheduling for a project, such as training or onboarding projects.&lt;br /&gt;
    &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;The project is feasible: the start date of the first task is today, or later.&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;There are no completed tasks&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;All tasks have story points&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;If you intend to have all tasks done by a single person, assign that person as the resource to every task. If the tasks can be distributed, leave the DevTeam skill on the tasks, so that Lynx can distribute the work.&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;There are no tasks with a duration of [0 days]&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;There are no tasks that run past the deadline, shown as the blue area in the project timeline.&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;CCPM compliance checks (top right checkmark button in the project overview) report no issues, specifically:&lt;br /&gt;
        &amp;lt;ol&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;A project buffer is part of the plan.&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;The project network is closed, all tasks lead to a single endpoint.&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;All tasks have resources and/or skills assigned.&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Project performance on the overview page is 0% for both values, &#039;&#039;after releasing&#039;&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Lynx issues ==&lt;br /&gt;
&lt;br /&gt;
=== Assigning resources before assigning story points ===&lt;br /&gt;
Conversion of story points to durations is done when and only when the resources are first assigned. If you create a task, do not set a story point estimate, and assign a resource, Lynx will set the duration to &amp;quot;[0 days]&amp;quot;. This value will not update when you enter a new story point estimate. &lt;br /&gt;
&lt;br /&gt;
Avoid this by assigning resources after you add story point estimates. As the only resource we generally use is &amp;quot;DevTeam&amp;quot; this is fairly easy. &lt;br /&gt;
&lt;br /&gt;
Fix this problem by unassigning the resource and reassigning it.&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=788</id>
		<title>Modeling projects</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=788"/>
		<updated>2026-10-13T09:38:16Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: /* Sanity checking the project before release */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Basic guide to modelling projects in A-Dato Lynx. &lt;br /&gt;
&lt;br /&gt;
== Sanity checking the project before release ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Project is configured as just-in-time (JIT):&lt;br /&gt;
        &amp;lt;ol&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;Project start date is &amp;quot;Use current date&amp;quot; (Properties &amp;gt; Project dates &amp;gt; Project start date).&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;Project has an end date (Properties &amp;gt; Project Dates &amp;gt; Project end date)&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;Schedule engine is configured as JIT for both the main chain and feeding chains (Properties &amp;gt; Scheduling &amp;gt; Schedule engine):&lt;br /&gt;
                &amp;lt;ol&amp;gt;&lt;br /&gt;
                    &amp;lt;li&amp;gt;Schedule tasks &#039;just in time&#039; selected.&amp;lt;/li&amp;gt;&lt;br /&gt;
                    &amp;lt;li&amp;gt;Activate CCPM schedule engine On.&amp;lt;/li&amp;gt;&lt;br /&gt;
                    &amp;lt;li&amp;gt;Schedule feeding chains &#039;just in time&#039; selected.&amp;lt;/li&amp;gt;&lt;br /&gt;
                &amp;lt;/ol&amp;gt;&lt;br /&gt;
            &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
ℹ️ ASAP projects are rare, but there can be legitimate reasons to prefer ASAP scheduling for a project, such as training or onboarding projects.&lt;br /&gt;
    &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;The project is feasible: the start date of the first task is today, or later.&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;There are no completed tasks&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;All tasks have story points&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;There are no tasks with a duration of [0 days]&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;There are no tasks that run past the deadline, shown as the blue area in the project timeline.&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;CCPM compliance checks (top right checkmark button in the project overview) report no issues, specifically:&lt;br /&gt;
        &amp;lt;ol&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;A project buffer is part of the plan.&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;The project network is closed, all tasks lead to a single endpoint.&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;All tasks have resources and/or skills assigned.&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Project performance on the overview page is 0% for both values, &#039;&#039;after releasing&#039;&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Lynx issues ==&lt;br /&gt;
&lt;br /&gt;
=== Assigning resources before assigning story points ===&lt;br /&gt;
Conversion of story points to durations is done when and only when the resources are first assigned. If you create a task, do not set a story point estimate, and assign a resource, Lynx will set the duration to &amp;quot;[0 days]&amp;quot;. This value will not update when you enter a new story point estimate. &lt;br /&gt;
&lt;br /&gt;
Avoid this by assigning resources after you add story point estimates. As the only resource we generally use is &amp;quot;DevTeam&amp;quot; this is fairly easy. &lt;br /&gt;
&lt;br /&gt;
Fix this problem by unassigning the resource and reassigning it.&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Annual_leave&amp;diff=777</id>
		<title>Annual leave</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Annual_leave&amp;diff=777"/>
		<updated>2026-10-06T17:26:32Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: /* Management */ spelling&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Everyone is entitled to annual leave and Delft Solutions encourages everyone to take their vacation days.&lt;br /&gt;
&lt;br /&gt;
== General ==&lt;br /&gt;
&lt;br /&gt;
* Vacation hours are automatically calculated by Kimai based on the registered hours and a 32 hours work week.&lt;br /&gt;
* When you use vacation by being out of office, you do not register any hours in Kimai. The vacation hours will automatically deducted from your available vacation hours&lt;br /&gt;
* Writing hours on Delft Solutions &amp;gt; Paid time off &amp;gt; Personal day is reserved for e.g Calamity leave.&lt;br /&gt;
* You should not go under 0 vacation hours unless there is a good reason and you have discussed this with the team and management.&lt;br /&gt;
&lt;br /&gt;
== Process ==&lt;br /&gt;
&lt;br /&gt;
In general everything will be approved, as long as we can ensure SLOs (Service Level Objectives). In case of a conflict meeting the SLOs, if no one is willing to give up the overlap, the first one who made the request following this process will be able to take their annual leave that moment.&lt;br /&gt;
&lt;br /&gt;
* Please request your annual leave via the [https://chat.dsinternal.net/#narrow/channel/13-Organisational/topic/Annual.20Leave.202026/with/101897 ~Organisational channel]. &lt;br /&gt;
* When your annual leave is coming up, please ensure a handover of all outstanding tasks. &lt;br /&gt;
* When someone is on annual leave, please ensure you try everything else before contacting them. This time is supposed to be sacred. If we treat it as such for everyone, we also know that getting a call during annual leave can be considered a last effort.&lt;br /&gt;
* When you are on annual leave and you get a call, &#039;&#039;&#039;you are entitled to ignore it&#039;&#039;&#039;, and emergency work done during annual leave is reimbursed as holiday not taken.&lt;br /&gt;
* When you are on annual leave and you fall ill, please communicate this to management so we can reimburse the sick days.&lt;br /&gt;
&lt;br /&gt;
== Accumulating too many vacation hours ==&lt;br /&gt;
&lt;br /&gt;
When working overtime, e.g. when you are first responder, vacation hours can add up quickly.&lt;br /&gt;
&lt;br /&gt;
This can potentially be a problem because:&lt;br /&gt;
* If the employee takes up all his accumulated vacation hours at once, this could put project planning and meeting deadlines at risk&lt;br /&gt;
* This can also be a (health) risk for the employee because regular rest is needed for the employee&#039;s well-being&lt;br /&gt;
* Vacation hours/days are valid for a limited time, employees might loose their well-deserved vacation time when not used on time&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In order to prevent such a situation the following internal alert system is used:&lt;br /&gt;
* The Weekly Report sums up the expected vacation hours for each employee in 8 weeks&lt;br /&gt;
* Alert signal: When this amount approaches 100 vacation hours, the employee will be asked to consider making plans for using up some of the vacation hours&lt;br /&gt;
* Maximum: 150 vacation hours is considered the maximum amount of vacation hours. Approaching 150 vacation will require discussing this with management to solve this issue.&lt;br /&gt;
&lt;br /&gt;
== Management ==&lt;br /&gt;
&lt;br /&gt;
Max and Derk-Jan will not be taking leave at the same time.&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Internal&amp;diff=773</id>
		<title>Internal</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Internal&amp;diff=773"/>
		<updated>2026-10-06T13:30:57Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: /* Projects */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Strategy ==&lt;br /&gt;
* [[Flow metrics|Flow metrics]]&lt;br /&gt;
* [[12%-time|12%-time]]&lt;br /&gt;
&lt;br /&gt;
== Finance ==&lt;br /&gt;
&lt;br /&gt;
=== Exact ===&lt;br /&gt;
&lt;br /&gt;
* [[booking bonus|Booking bonus]]&lt;br /&gt;
* [[booking wages|Booking wages]]&lt;br /&gt;
* [[booking quarterly hosting invoice|Booking quarterly hosting invoice]]&lt;br /&gt;
* [[new receipt|Enter a new receipt]]&lt;br /&gt;
* [[reconciliation|Reconciliation of transaction]]&lt;br /&gt;
* [[invoicing|Send an invoice]]&lt;br /&gt;
* [[payment reminders|Send payment reminder]]&lt;br /&gt;
* [[invoice approval|Process for approving invoices (/filed receipts)]]&lt;br /&gt;
&lt;br /&gt;
=== Bunq ===&lt;br /&gt;
&lt;br /&gt;
* [[top up account|Top up expense account]]&lt;br /&gt;
&lt;br /&gt;
== Work Process ==&lt;br /&gt;
&lt;br /&gt;
* [[Definition of done|Definition of Done]]&lt;br /&gt;
* [[Incident Handling|Incident Handling]]&lt;br /&gt;
* [[SRE Maintenance|SRE Maintenance]]&lt;br /&gt;
* [[Release checklist|Release checklist]]&lt;br /&gt;
* [[Handover]]&lt;br /&gt;
* [[Measuring uptime]]&lt;br /&gt;
* [[Planning]]&lt;br /&gt;
** [[Planning parameters]]&lt;br /&gt;
&lt;br /&gt;
== Internal Process ==&lt;br /&gt;
* [[timetracking|Timetracking process]]&lt;br /&gt;
* [[Starting work for a new client]]&lt;br /&gt;
* [[12 percent|12% time]]&lt;br /&gt;
* [[Annual leave|Annual leave]]&lt;br /&gt;
* [[Bonus allocation|Bonus allocation]]&lt;br /&gt;
* [[Calamity leave|Calamity leave]]&lt;br /&gt;
* [[Overtime|Overtime]]&lt;br /&gt;
* [[Retrospectives|Retrospectives]]&lt;br /&gt;
* [[Sick leave|Sick leave]]&lt;br /&gt;
* [[Training and self-study|Training and Self-Study]]&lt;br /&gt;
* [[Daily|Daily]]&lt;br /&gt;
* [[Weekly report]]&lt;br /&gt;
&lt;br /&gt;
== Projects ==&lt;br /&gt;
&lt;br /&gt;
* [[Modeling projects]]&lt;br /&gt;
* Era Inventory [[project_era_inventory_api|API Description]]&lt;br /&gt;
&lt;br /&gt;
== SRE ==&lt;br /&gt;
&#039;&#039;To be further populated with guides from drive&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Updates ===&lt;br /&gt;
&lt;br /&gt;
* [[policy|General update policy]]&lt;br /&gt;
* [[border update|Updating a border]]&lt;br /&gt;
* [[update-sentry|Update Sentry]]&lt;br /&gt;
* [[Update Zulip Server version]]&lt;br /&gt;
&lt;br /&gt;
=== SLA ===&lt;br /&gt;
* [[Response for Backup Service being down for an extended period of time]]&lt;br /&gt;
* [[postgres issues|Analyzing postgres performance]]&lt;br /&gt;
&lt;br /&gt;
=== Uncategorized ===&lt;br /&gt;
* [[create gitlab runner host|Create a GitLab runner host]]&lt;br /&gt;
* [[vm setup|Create a (Debian) VM]]&lt;br /&gt;
* [[border reboot|Reboot border without downtime]]&lt;br /&gt;
* [[ceph|Common Ceph commands]]&lt;br /&gt;
* [[WS Proxmox node reboot|Reboot WS Proxmox node without downtime]]&lt;br /&gt;
* [[Resize VM Disk]]&lt;br /&gt;
* [[SRE tools]]&lt;br /&gt;
* [[Enroll Mac in Kerberos]]&lt;br /&gt;
* [[New Mac Setup]]&lt;br /&gt;
* [[Creating a VM on Hetzner]]&lt;br /&gt;
* [[Rebooting VM]]&lt;br /&gt;
* [[Rebooting Offsite]]&lt;br /&gt;
* [[ssh-fingerprints|Verifying SSH fingerprints]]&lt;br /&gt;
* [[Removing VM]]&lt;br /&gt;
* [[Install a new Disk in Server]]&lt;br /&gt;
* [[Setting Up Wildcard Subdomains with SSL on a Debian Application]]&lt;br /&gt;
* [[s3 bucket backup|Get credentials to backup S3 bucket to Zombie]]&lt;br /&gt;
* [[Hardware Incident Response: Memory Slot Failure on banshee]]&lt;br /&gt;
* [[Hardware Incident Response: Switch failure in DC]]&lt;br /&gt;
* [[dfz switch setup|DFZ Switch setup]]&lt;br /&gt;
* [[iDRAC: Upload a new pem certificate for automatic updates]]&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
* [[stack|Greenfield stack]]&lt;br /&gt;
* [[standard tools|Standard Tools]]&lt;br /&gt;
* [[list of unfurl debuggers|List of unfurl debuggers]]&lt;br /&gt;
* [[Recommended suppliers]]&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=765</id>
		<title>Modeling projects</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=765"/>
		<updated>2026-09-27T16:19:51Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: /* Sanity checking the project before release */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Basic guide to modelling projects in A-Dato Lynx. &lt;br /&gt;
&lt;br /&gt;
== Sanity checking the project before release ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Project is configured as just-in-time (JIT):&lt;br /&gt;
        &amp;lt;ol&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;Project start date is &amp;quot;Use current date&amp;quot; (Properties &amp;gt; Project dates &amp;gt; Project start date).&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;Project has an end date (Properties &amp;gt; Project Dates &amp;gt; Project end date)&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;Schedule engine is configured as JIT for both the main chain and feeding chains (Properties &amp;gt; Scheduling &amp;gt; Schedule engine):&lt;br /&gt;
                &amp;lt;ol&amp;gt;&lt;br /&gt;
                    &amp;lt;li&amp;gt;Schedule tasks &#039;just in time&#039; selected.&amp;lt;/li&amp;gt;&lt;br /&gt;
                    &amp;lt;li&amp;gt;Activate CCPM schedule engine On.&amp;lt;/li&amp;gt;&lt;br /&gt;
                    &amp;lt;li&amp;gt;Schedule feeding chains &#039;just in time&#039; selected.&amp;lt;/li&amp;gt;&lt;br /&gt;
                &amp;lt;/ol&amp;gt;&lt;br /&gt;
            &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
ℹ️ ASAP projects are rare, but there can be legitimate reasons to prefer ASAP scheduling for a project, such as training or onboarding projects.&lt;br /&gt;
    &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;There are no completed tasks&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;All tasks have story points&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;There are no tasks with a duration of [0 days]&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;There are no tasks that run past the deadline, shown as the blue area in the project timeline.&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;CCPM compliance checks (top right checkmark button in the project overview) report no issues, specifically:&lt;br /&gt;
        &amp;lt;ol&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;A project buffer is part of the plan.&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;The project network is closed, all tasks lead to a single endpoint.&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;All tasks have resources and/or skills assigned.&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Project performance on the overview page is 0% for both values, &#039;&#039;after releasing&#039;&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Lynx issues ==&lt;br /&gt;
&lt;br /&gt;
=== Assigning resources before assigning story points ===&lt;br /&gt;
Conversion of story points to durations is done when and only when the resources are first assigned. If you create a task, do not set a story point estimate, and assign a resource, Lynx will set the duration to &amp;quot;[0 days]&amp;quot;. This value will not update when you enter a new story point estimate. &lt;br /&gt;
&lt;br /&gt;
Avoid this by assigning resources after you add story point estimates. As the only resource we generally use is &amp;quot;DevTeam&amp;quot; this is fairly easy. &lt;br /&gt;
&lt;br /&gt;
Fix this problem by unassigning the resource and reassigning it.&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=764</id>
		<title>Modeling projects</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=764"/>
		<updated>2026-09-27T16:19:26Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: /* Sanity checking the project before release */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Basic guide to modelling projects in A-Dato Lynx. &lt;br /&gt;
&lt;br /&gt;
== Sanity checking the project before release ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Project is configured as just-in-time (JIT):&lt;br /&gt;
        &amp;lt;ol&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;Project start date is &amp;quot;Use current date&amp;quot; (Properties &amp;gt; Project dates &amp;gt; Project start date).&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;Project has an end date (Properties &amp;gt; Project Dates &amp;gt; Project end date)&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;Schedole engine is configured as JIT for both the main chain and feeding chains (Properties &amp;gt; Scheduling &amp;gt; Schedule engine):&lt;br /&gt;
                &amp;lt;ol&amp;gt;&lt;br /&gt;
                    &amp;lt;li&amp;gt;Schedole tasks &#039;just in time&#039; selected.&amp;lt;/li&amp;gt;&lt;br /&gt;
                    &amp;lt;li&amp;gt;Activate CCPM schedule engine On.&amp;lt;/li&amp;gt;&lt;br /&gt;
                    &amp;lt;li&amp;gt;Schedole feeding chains &#039;just in time&#039; selected.&amp;lt;/li&amp;gt;&lt;br /&gt;
                &amp;lt;/ol&amp;gt;&lt;br /&gt;
            &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
ℹ️ ASAP projects are rare, but there can be legitimate reasons to prefer ASAP scheduling for a project, such as training or onboarding projects.&lt;br /&gt;
    &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;There are no completed tasks&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;All tasks have story points&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;There are no tasks with a duration of [0 days]&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;There are no tasks that run past the deadline, shown as the blue area in the project timeline.&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;CCPM compliance checks (top right checkmark button in the project overview) report no issues, specifically:&lt;br /&gt;
        &amp;lt;ol&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;A project buffer is part of the plan.&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;The project network is closed, all tasks lead to a single endpoint.&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;All tasks have resources and/or skills assigned.&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Project performance on the overview page is 0% for both values, &#039;&#039;after releasing&#039;&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Lynx issues ==&lt;br /&gt;
&lt;br /&gt;
=== Assigning resources before assigning story points ===&lt;br /&gt;
Conversion of story points to durations is done when and only when the resources are first assigned. If you create a task, do not set a story point estimate, and assign a resource, Lynx will set the duration to &amp;quot;[0 days]&amp;quot;. This value will not update when you enter a new story point estimate. &lt;br /&gt;
&lt;br /&gt;
Avoid this by assigning resources after you add story point estimates. As the only resource we generally use is &amp;quot;DevTeam&amp;quot; this is fairly easy. &lt;br /&gt;
&lt;br /&gt;
Fix this problem by unassigning the resource and reassigning it.&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=763</id>
		<title>Modeling projects</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=763"/>
		<updated>2026-09-27T16:19:02Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Basic guide to modelling projects in A-Dato Lynx. &lt;br /&gt;
&lt;br /&gt;
== Sanity checking the project before release ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Project is configured as just-in-time (JIT):&lt;br /&gt;
        &amp;lt;ol&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;Project start date is &amp;quot;Use current date&amp;quot; (Properties &amp;gt; Project dates &amp;gt; Project start date).&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;Project has an end date (Properties &amp;gt; Project Dates &amp;gt; Project end date)&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;Schedole engine is configured as JIT for both the main chain and feeding chains (Properties &amp;gt; Schedoling &amp;gt; Schedole engine):&lt;br /&gt;
                &amp;lt;ol&amp;gt;&lt;br /&gt;
                    &amp;lt;li&amp;gt;Schedole tasks &#039;just in time&#039; selected.&amp;lt;/li&amp;gt;&lt;br /&gt;
                    &amp;lt;li&amp;gt;Activate CCPM schedole engine On.&amp;lt;/li&amp;gt;&lt;br /&gt;
                    &amp;lt;li&amp;gt;Schedole feeding chains &#039;just in time&#039; selected.&amp;lt;/li&amp;gt;&lt;br /&gt;
                &amp;lt;/ol&amp;gt;&lt;br /&gt;
            &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
ℹ️ ASAP projects are rare, but there can be legitimate reasons to prefer ASAP schedoling for a project, such as training or onboarding projects.&lt;br /&gt;
    &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;There are no completed tasks&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;All tasks have story points&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;There are no tasks with a duration of [0 days]&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;There are no tasks that run past the deadline, shown as the blue area in the project timeline.&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;CCPM compliance checks (top right checkmark button in the project overview) reports no issues, specifically:&lt;br /&gt;
        &amp;lt;ol&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;A project buffer is part of the plan.&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;The project network is closed, all tasks lead to a single endpoint.&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;All tasks have resources and/or skills assigned.&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Project performance on the overview page is 0% for both values, &#039;&#039;after releasing&#039;&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Lynx issues ==&lt;br /&gt;
&lt;br /&gt;
=== Assigning resources before assigning story points ===&lt;br /&gt;
Conversion of story points to durations is done when and only when the resources are first assigned. If you create a task, do not set a story point estimate, and assign a resource, Lynx will set the duration to &amp;quot;[0 days]&amp;quot;. This value will not update when you enter a new story point estimate. &lt;br /&gt;
&lt;br /&gt;
Avoid this by assigning resources after you add story point estimates. As the only resource we generally use is &amp;quot;DevTeam&amp;quot; this is fairly easy. &lt;br /&gt;
&lt;br /&gt;
Fix this problem by unassigning the resource and reassigning it.&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=762</id>
		<title>Modeling projects</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=762"/>
		<updated>2026-09-27T16:18:27Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: /* Sanity checking the project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Basic guide to modelling projects in A-Dato Lynx. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Project is configured as just-in-time (JIT):&lt;br /&gt;
        &amp;lt;ol&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;Project start date is &amp;quot;Use current date&amp;quot; (Properties &amp;gt; Project dates &amp;gt; Project start date).&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;Project has an end date (Properties &amp;gt; Project Dates &amp;gt; Project end date)&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;Schedole engine is configured as JIT for both the main chain and feeding chains (Properties &amp;gt; Schedoling &amp;gt; Schedole engine):&lt;br /&gt;
                &amp;lt;ol&amp;gt;&lt;br /&gt;
                    &amp;lt;li&amp;gt;Schedole tasks &#039;just in time&#039; selected.&amp;lt;/li&amp;gt;&lt;br /&gt;
                    &amp;lt;li&amp;gt;Activate CCPM schedole engine On.&amp;lt;/li&amp;gt;&lt;br /&gt;
                    &amp;lt;li&amp;gt;Schedole feeding chains &#039;just in time&#039; selected.&amp;lt;/li&amp;gt;&lt;br /&gt;
                &amp;lt;/ol&amp;gt;&lt;br /&gt;
            &amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
ℹ️ ASAP projects are rare, but there can be legitimate reasons to prefer ASAP schedoling for a project, such as training or onboarding projects.&lt;br /&gt;
    &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;There are no completed tasks&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;All tasks have story points&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;There are no tasks with a duration of [0 days]&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;There are no tasks that run past the deadline, shown as the blue area in the project timeline.&amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;CCPM compliance checks (top right checkmark button in the project overview) reports no issues, specifically:&lt;br /&gt;
        &amp;lt;ol&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;A project buffer is part of the plan.&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;The project network is closed, all tasks lead to a single endpoint.&amp;lt;/li&amp;gt;&lt;br /&gt;
            &amp;lt;li&amp;gt;All tasks have resources and/or skills assigned.&amp;lt;/li&amp;gt;&lt;br /&gt;
        &amp;lt;/ol&amp;gt;&lt;br /&gt;
    &amp;lt;/li&amp;gt;&lt;br /&gt;
    &amp;lt;li&amp;gt;Project performance on the overview page is 0% for both values, &#039;&#039;after releasing&#039;&#039;&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Lynx issues ==&lt;br /&gt;
&lt;br /&gt;
=== Assigning resources before assigning story points ===&lt;br /&gt;
Conversion of story points to durations is done when and only when the resources are first assigned. If you create a task, do not set a story point estimate, and assign a resource, Lynx will set the duration to &amp;quot;[0 days]&amp;quot;. This value will not update when you enter a new story point estimate. &lt;br /&gt;
&lt;br /&gt;
Avoid this by assigning resources after you add story point estimates. As the only resource we generally use is &amp;quot;DevTeam&amp;quot; this is fairly easy. &lt;br /&gt;
&lt;br /&gt;
Fix this problem by unassigning the resource and reassigning it.&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=761</id>
		<title>Modeling projects</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=761"/>
		<updated>2026-09-27T16:13:48Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: /* Sanity checking the project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Basic guide to modelling projects in A-Dato Lynx. &lt;br /&gt;
&lt;br /&gt;
== Sanity checking the project ==&lt;br /&gt;
When releasing a project for the first time, you should sanity-check the project: &lt;br /&gt;
&lt;br /&gt;
# Project is configured as just-in-time (JIT): &amp;lt;br&amp;gt;ℹ️ ASAP projects are rare, but there can be legitimate reasons to prefer ASAP scheduling for a project, such as training or onboarding projects. &lt;br /&gt;
## Project start date is &amp;quot;Use current date&amp;quot; (Properties &amp;gt; Project dates &amp;gt; Project start date). &lt;br /&gt;
## Project has an end date (Properties &amp;gt; Project Dates &amp;gt; Project end date).&lt;br /&gt;
## Schedule engine is configured as JIT for both the main chain and feeding chains (Properties &amp;gt; Scheduling &amp;gt; Schedule engine): &lt;br /&gt;
### Schedule tasks &#039;just in time&#039; selected.&lt;br /&gt;
### Activate CCPM schedule engine On.&lt;br /&gt;
### Schedule feeding chains &#039;just in time&#039; selected.&lt;br /&gt;
# There are no completed tasks.&lt;br /&gt;
# All tasks have story points.&lt;br /&gt;
# There are no tasks with a duration of [0 days].&lt;br /&gt;
# There are no tasks that run past the deadline, shown as the blue area in the project timeline. &lt;br /&gt;
# CCPM compliance checks (top right checkmark button in the project overview) reports no issues, specifically:&lt;br /&gt;
## A project buffer is part of the plan. &lt;br /&gt;
## The project network is closed, all tasks lead to a single endpoint. &lt;br /&gt;
## All tasks have resources and/or skills assigned. &lt;br /&gt;
# Project performance on the overview page is 0% for both values, &#039;&#039;after releasing&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Lynx issues ==&lt;br /&gt;
&lt;br /&gt;
=== Assigning resources before assigning story points ===&lt;br /&gt;
Conversion of story points to durations is done when and only when the resources are first assigned. If you create a task, do not set a story point estimate, and assign a resource, Lynx will set the duration to &amp;quot;[0 days]&amp;quot;. This value will not update when you enter a new story point estimate. &lt;br /&gt;
&lt;br /&gt;
Avoid this by assigning resources after you add story point estimates. As the only resource we generally use is &amp;quot;DevTeam&amp;quot; this is fairly easy. &lt;br /&gt;
&lt;br /&gt;
Fix this problem by unassigning the resource and reassigning it.&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=760</id>
		<title>Modeling projects</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=760"/>
		<updated>2026-09-27T16:12:52Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: /* Sanity checking the project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Basic guide to modelling projects in A-Dato Lynx. &lt;br /&gt;
&lt;br /&gt;
== Sanity checking the project ==&lt;br /&gt;
When releasing a project for the first time, you should sanity-check the project: &lt;br /&gt;
&lt;br /&gt;
# Project is configured as just-in-time (JIT): ℹ️ ASAP projects are rare, but there can be legitimate reasons to prefer ASAP scheduling for a project, such as training or onboarding projects. &lt;br /&gt;
## Project start date is &amp;quot;Use current date&amp;quot; (Properties &amp;gt; Project dates &amp;gt; Project start date). &lt;br /&gt;
## Project has an end date (Properties &amp;gt; Project Dates &amp;gt; Project end date).&lt;br /&gt;
## Schedule engine is configured as JIT for both the main chain and feeding chains (Properties &amp;gt; Scheduling &amp;gt; Schedule engine): &lt;br /&gt;
### Schedule tasks &#039;just in time&#039; selected.&lt;br /&gt;
### Activate CCPM schedule engine On.&lt;br /&gt;
### Schedule feeding chains &#039;just in time&#039; selected.&lt;br /&gt;
# There are no completed tasks.&lt;br /&gt;
# All tasks have story points.&lt;br /&gt;
# There are no tasks with a duration of [0 days].&lt;br /&gt;
# There are no tasks that run past the deadline, shown as the blue area in the project timeline. &lt;br /&gt;
# CCPM compliance checks (top right checkmark button in the project overview) reports no issues, specifically:&lt;br /&gt;
## A project buffer is part of the plan. &lt;br /&gt;
## The project network is closed, all tasks lead to a single endpoint. &lt;br /&gt;
## All tasks have resources and/or skills assigned. &lt;br /&gt;
# Project performance on the overview page is 0% for both values, &#039;&#039;after releasing&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Lynx issues ==&lt;br /&gt;
&lt;br /&gt;
=== Assigning resources before assigning story points ===&lt;br /&gt;
Conversion of story points to durations is done when and only when the resources are first assigned. If you create a task, do not set a story point estimate, and assign a resource, Lynx will set the duration to &amp;quot;[0 days]&amp;quot;. This value will not update when you enter a new story point estimate. &lt;br /&gt;
&lt;br /&gt;
Avoid this by assigning resources after you add story point estimates. As the only resource we generally use is &amp;quot;DevTeam&amp;quot; this is fairly easy. &lt;br /&gt;
&lt;br /&gt;
Fix this problem by unassigning the resource and reassigning it.&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=A-Dato_Lynx&amp;diff=759</id>
		<title>A-Dato Lynx</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=A-Dato_Lynx&amp;diff=759"/>
		<updated>2026-09-27T15:54:48Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Lynx is the planning tool we use to do Critical Chain Project Management (CCPM) to our work. &lt;br /&gt;
&lt;br /&gt;
https://lynxonline.a-dato.com/&lt;br /&gt;
&lt;br /&gt;
You might be interested in [[Modeling projects|modeling projects in Lynx]] or the [[Planning parameters]].&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Modelling_projects&amp;diff=758</id>
		<title>Modelling projects</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Modelling_projects&amp;diff=758"/>
		<updated>2026-09-27T15:54:02Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: Jakobbuis moved page Modelling projects to Modeling projects: Misspelled title&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Modeling projects]]&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=757</id>
		<title>Modeling projects</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=757"/>
		<updated>2026-09-27T15:54:02Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: Jakobbuis moved page Modelling projects to Modeling projects: Misspelled title&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Basic guide to modelling projects in A-Dato Lynx. &lt;br /&gt;
&lt;br /&gt;
== Sanity checking the project ==&lt;br /&gt;
When releasing a project for the first time, you should sanity-check the project: &lt;br /&gt;
&lt;br /&gt;
# Project is configured as just-in-time (JIT): ℹ️ ASAP projects are rare, but there can be legitimate reasons to prefer ASAP scheduling for a project, such as training or onboarding projects. &lt;br /&gt;
## Project has an end date (Properties &amp;gt; Project Dates)&lt;br /&gt;
## Schedule engine is configured as JIT for both the main chain and feeding chains (Properties &amp;gt; Scheduling &amp;gt; Schedule engine): &lt;br /&gt;
### Schedule tasks &#039;just in time&#039; selected.&lt;br /&gt;
### Activate CCPM schedule engine On.&lt;br /&gt;
### Schedule feeding chains &#039;just in time&#039; selected.&lt;br /&gt;
# There are no completed tasks.&lt;br /&gt;
# All tasks have story points.&lt;br /&gt;
# There are no tasks with a duration of [0 days].&lt;br /&gt;
# There are no tasks that run past the deadline, shown as the blue area in the project timeline. &lt;br /&gt;
# CCPM compliance checks (top right checkmark button in the project overview) reports no issues, specifically:&lt;br /&gt;
## A project buffer is part of the plan. &lt;br /&gt;
## The project network is closed, all tasks lead to a single endpoint. &lt;br /&gt;
## All tasks have resources and/or skills assigned. &lt;br /&gt;
# Project performance on the overview page is 0% for both values, &#039;&#039;after releasing&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Lynx issues ==&lt;br /&gt;
&lt;br /&gt;
=== Assigning resources before assigning story points ===&lt;br /&gt;
Conversion of story points to durations is done when and only when the resources are first assigned. If you create a task, do not set a story point estimate, and assign a resource, Lynx will set the duration to &amp;quot;[0 days]&amp;quot;. This value will not update when you enter a new story point estimate. &lt;br /&gt;
&lt;br /&gt;
Avoid this by assigning resources after you add story point estimates. As the only resource we generally use is &amp;quot;DevTeam&amp;quot; this is fairly easy. &lt;br /&gt;
&lt;br /&gt;
Fix this problem by unassigning the resource and reassigning it.&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=756</id>
		<title>Modeling projects</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=756"/>
		<updated>2026-09-27T15:52:48Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Basic guide to modelling projects in A-Dato Lynx. &lt;br /&gt;
&lt;br /&gt;
== Sanity checking the project ==&lt;br /&gt;
When releasing a project for the first time, you should sanity-check the project: &lt;br /&gt;
&lt;br /&gt;
# Project is configured as just-in-time (JIT): ℹ️ ASAP projects are rare, but there can be legitimate reasons to prefer ASAP scheduling for a project, such as training or onboarding projects. &lt;br /&gt;
## Project has an end date (Properties &amp;gt; Project Dates)&lt;br /&gt;
## Schedule engine is configured as JIT for both the main chain and feeding chains (Properties &amp;gt; Scheduling &amp;gt; Schedule engine): &lt;br /&gt;
### Schedule tasks &#039;just in time&#039; selected.&lt;br /&gt;
### Activate CCPM schedule engine On.&lt;br /&gt;
### Schedule feeding chains &#039;just in time&#039; selected.&lt;br /&gt;
# There are no completed tasks.&lt;br /&gt;
# All tasks have story points.&lt;br /&gt;
# There are no tasks with a duration of [0 days].&lt;br /&gt;
# There are no tasks that run past the deadline, shown as the blue area in the project timeline. &lt;br /&gt;
# CCPM compliance checks (top right checkmark button in the project overview) reports no issues, specifically:&lt;br /&gt;
## A project buffer is part of the plan. &lt;br /&gt;
## The project network is closed, all tasks lead to a single endpoint. &lt;br /&gt;
## All tasks have resources and/or skills assigned. &lt;br /&gt;
# Project performance on the overview page is 0% for both values, &#039;&#039;after releasing&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Lynx issues ==&lt;br /&gt;
&lt;br /&gt;
=== Assigning resources before assigning story points ===&lt;br /&gt;
Conversion of story points to durations is done when and only when the resources are first assigned. If you create a task, do not set a story point estimate, and assign a resource, Lynx will set the duration to &amp;quot;[0 days]&amp;quot;. This value will not update when you enter a new story point estimate. &lt;br /&gt;
&lt;br /&gt;
Avoid this by assigning resources after you add story point estimates. As the only resource we generally use is &amp;quot;DevTeam&amp;quot; this is fairly easy. &lt;br /&gt;
&lt;br /&gt;
Fix this problem by unassigning the resource and reassigning it.&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=755</id>
		<title>Modeling projects</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=755"/>
		<updated>2026-09-27T15:52:00Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Basic guide to modelling projects in A-Dato Lynx. &lt;br /&gt;
&lt;br /&gt;
== Sanity checking the project ==&lt;br /&gt;
When releasing a project for the first time, you should sanity-check the project: &lt;br /&gt;
&lt;br /&gt;
# Project is configured as just-in-time (JIT): ℹ️ ASAP projects are rare, but there can be legitimate reasons to prefer ASAP scheduling for a project, such as training or onboarding projects. &lt;br /&gt;
## Project has an end date (Properties &amp;gt; Project Dates)&lt;br /&gt;
## Schedule engine is configured as JIT for both the main chain and feeding chains (Properties &amp;gt; Scheduling &amp;gt; Schedule engine): &lt;br /&gt;
### Schedule tasks &#039;just in time&#039; selected.&lt;br /&gt;
### Activate CCPM schedule engine On.&lt;br /&gt;
### Schedule feeding chains &#039;just in time&#039; selected.&lt;br /&gt;
# There are no completed tasks.&lt;br /&gt;
# All tasks have story points.&lt;br /&gt;
# There are no tasks with a duration of [0 days].&lt;br /&gt;
# There are no tasks that run past the deadline, shown as the blue area in the project timeline. &lt;br /&gt;
# CCPM compliance checks (top right checkmark button in the project overview) reports no issues, specifically:&lt;br /&gt;
## A project buffer is part of the plan. &lt;br /&gt;
## The project network is closed, all tasks lead to a single endpoint. &lt;br /&gt;
## All tasks have resources and/or skills assigned. &lt;br /&gt;
# Project performance on the overview page is 0% for both values.&lt;br /&gt;
&lt;br /&gt;
== Lynx issues ==&lt;br /&gt;
&lt;br /&gt;
=== Assigning resources before assigning story points ===&lt;br /&gt;
Conversion of story points to durations is done when and only when the resources are first assigned. If you create a task, do not set a story point estimate, and assign a resource, Lynx will set the duration to &amp;quot;[0 days]&amp;quot;. This value will not update when you enter a new story point estimate. &lt;br /&gt;
&lt;br /&gt;
Avoid this by assigning resources after you add story point estimates. As the only resource we generally use is &amp;quot;DevTeam&amp;quot; this is fairly easy. &lt;br /&gt;
&lt;br /&gt;
Fix this problem by unassigning the resource and reassigning it.&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=754</id>
		<title>Modeling projects</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=754"/>
		<updated>2026-09-27T15:51:21Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: /* Sanity checking the project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Basic guide to modelling projects in A-Dato Lynx. &lt;br /&gt;
&lt;br /&gt;
== Sanity checking the project ==&lt;br /&gt;
When releasing a project for the first time, you should sanity-check the project: &lt;br /&gt;
&lt;br /&gt;
# Project has an end date (Properties &amp;gt; Project Dates)&lt;br /&gt;
# Schedule engine is configured as JIT for both the main chain and feeding chains (Properties &amp;gt; Scheduling &amp;gt; Schedule engine): &lt;br /&gt;
## Schedule tasks &#039;just in time&#039; selected.&lt;br /&gt;
## Activate CCPM schedule engine On.&lt;br /&gt;
## Schedule feeding chains &#039;just in time&#039; selected.&lt;br /&gt;
&lt;br /&gt;
ℹ️ ASAP projects are rare, but there can be legitimate reasons to prefer ASAP scheduling for a project, such as training or onboarding projects. &lt;br /&gt;
&lt;br /&gt;
# There are no completed tasks.&lt;br /&gt;
# All tasks have story points.&lt;br /&gt;
# There are no tasks with a duration of [0 days].&lt;br /&gt;
# There are no tasks that run past the deadline, shown as the blue area in the project timeline. &lt;br /&gt;
# CCPM compliance checks (top right checkmark button in the project overview) reports no issues, specifically:&lt;br /&gt;
## A project buffer is part of the plan. &lt;br /&gt;
## The project network is closed, all tasks lead to a single endpoint. &lt;br /&gt;
## All tasks have resources and/or skills assigned. &lt;br /&gt;
# Project performance on the overview page is 0% for both values.&lt;br /&gt;
&lt;br /&gt;
== Lynx issues ==&lt;br /&gt;
&lt;br /&gt;
=== Assigning resources before assigning story points ===&lt;br /&gt;
Conversion of story points to durations is done when and only when the resources are first assigned. If you create a task, do not set a story point estimate, and assign a resource, Lynx will set the duration to &amp;quot;[0 days]&amp;quot;. This value will not update when you enter a new story point estimate. &lt;br /&gt;
&lt;br /&gt;
Avoid this by assigning resources after you add story point estimates. As the only resource we generally use is &amp;quot;DevTeam&amp;quot; this is fairly easy. &lt;br /&gt;
&lt;br /&gt;
Fix this problem by unassigning the resource and reassigning it.&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=A-Dato_Lynx&amp;diff=753</id>
		<title>A-Dato Lynx</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=A-Dato_Lynx&amp;diff=753"/>
		<updated>2026-09-27T15:49:31Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Lynx is the planning tool we use to do Critical Chain Project Management (CCPM) to our work. &lt;br /&gt;
&lt;br /&gt;
https://lynxonline.a-dato.com/&lt;br /&gt;
&lt;br /&gt;
You might be interested in [[Modelling projects|modelling projects in Lynx]] or the [[Planning parameters]].&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=752</id>
		<title>Modeling projects</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=752"/>
		<updated>2026-09-27T15:47:33Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Basic guide to modelling projects in A-Dato Lynx. &lt;br /&gt;
&lt;br /&gt;
== Sanity checking the project ==&lt;br /&gt;
When releasing a project for the first time, you should sanity-check the project: &lt;br /&gt;
&lt;br /&gt;
# Project has an end date (Properties &amp;gt; Project Dates)&lt;br /&gt;
# Schedule engine is configured as JIT for both the main chain and feeding chains (Properties &amp;gt; Scheduling &amp;gt; Schedule engine): &lt;br /&gt;
## Schedule tasks &#039;just in time&#039; selected.&lt;br /&gt;
## Activate CCPM schedule engine On.&lt;br /&gt;
## Schedule feeding chains &#039;just in time&#039; selected.&lt;br /&gt;
# There are no completed tasks.&lt;br /&gt;
# All tasks have story points.&lt;br /&gt;
# There are no tasks with a duration of [0 days].&lt;br /&gt;
# There are no tasks that run past the deadline, shown as the blue area in the project timeline. &lt;br /&gt;
# CCPM compliance checks (top right checkmark button in the project overview) reports no issues, specifically:&lt;br /&gt;
## A project buffer is part of the plan. &lt;br /&gt;
## The project network is closed, all tasks lead to a single endpoint. &lt;br /&gt;
## All tasks have resources and/or skills assigned. &lt;br /&gt;
# Project performance on the overview page is 0% for both values.&lt;br /&gt;
&lt;br /&gt;
== Lynx issues ==&lt;br /&gt;
&lt;br /&gt;
=== Assigning resources before assigning story points ===&lt;br /&gt;
Conversion of story points to durations is done when and only when the resources are first assigned. If you create a task, do not set a story point estimate, and assign a resource, Lynx will set the duration to &amp;quot;[0 days]&amp;quot;. This value will not update when you enter a new story point estimate. &lt;br /&gt;
&lt;br /&gt;
Avoid this by assigning resources after you add story point estimates. As the only resource we generally use is &amp;quot;DevTeam&amp;quot; this is fairly easy. &lt;br /&gt;
&lt;br /&gt;
Fix this problem by unassigning the resource and reassigning it.&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=751</id>
		<title>Modeling projects</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=751"/>
		<updated>2026-09-27T15:47:11Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Sanity checking the project ==&lt;br /&gt;
When releasing a project for the first time, you should sanity-check the project: &lt;br /&gt;
&lt;br /&gt;
# Project has an end date (Properties &amp;gt; Project Dates)&lt;br /&gt;
# Schedule engine is configured as JIT for both the main chain and feeding chains (Properties &amp;gt; Scheduling &amp;gt; Schedule engine): &lt;br /&gt;
## Schedule tasks &#039;just in time&#039; selected.&lt;br /&gt;
## Activate CCPM schedule engine On.&lt;br /&gt;
## Schedule feeding chains &#039;just in time&#039; selected.&lt;br /&gt;
# There are no completed tasks.&lt;br /&gt;
# All tasks have story points.&lt;br /&gt;
# There are no tasks with a duration of [0 days].&lt;br /&gt;
# There are no tasks that run past the deadline, shown as the blue area in the project timeline. &lt;br /&gt;
# CCPM compliance checks (top right checkmark button in the project overview) reports no issues, specifically:&lt;br /&gt;
## A project buffer is part of the plan. &lt;br /&gt;
## The project network is closed, all tasks lead to a single endpoint. &lt;br /&gt;
## All tasks have resources and/or skills assigned. &lt;br /&gt;
# Project performance on the overview page is 0% for both values.&lt;br /&gt;
&lt;br /&gt;
== Lynx issues ==&lt;br /&gt;
&lt;br /&gt;
=== Assigning resources before assigning story points ===&lt;br /&gt;
Conversion of story points to durations is done when and only when the resources are first assigned. If you create a task, do not set a story point estimate, and assign a resource, Lynx will set the duration to &amp;quot;[0 days]&amp;quot;. This value will not update when you enter a new story point estimate. &lt;br /&gt;
&lt;br /&gt;
Avoid this by assigning resources after you add story point estimates. As the only resource we generally use is &amp;quot;DevTeam&amp;quot; this is fairly easy. &lt;br /&gt;
&lt;br /&gt;
Fix this problem by unassigning the resource and reassigning it.&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=750</id>
		<title>Modeling projects</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=750"/>
		<updated>2026-09-27T15:46:41Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: /* Sanity checking the project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Default project configuration ==&lt;br /&gt;
# Project has an end date (Properties &amp;gt; Project Dates)&lt;br /&gt;
# Schedule engine is configured as JIT for both the main chain and feeding chains (Properties &amp;gt; Scheduling &amp;gt; Schedule engine): &lt;br /&gt;
## Schedule tasks &#039;just in time&#039; selected.&lt;br /&gt;
## Activate CCPM schedule engine On.&lt;br /&gt;
## Schedule feeding chains &#039;just in time&#039; selected. &lt;br /&gt;
&lt;br /&gt;
== Sanity checking the project ==&lt;br /&gt;
When releasing a project for the first time, you should sanity-check the project: &lt;br /&gt;
&lt;br /&gt;
# There are no completed tasks.&lt;br /&gt;
# All tasks have story points.&lt;br /&gt;
# There are no tasks with a duration of [0 days].&lt;br /&gt;
# There are no tasks that run past the deadline, shown as the blue area in the project timeline. &lt;br /&gt;
# CCPM compliance checks (top right checkmark button in the project overview) reports no issues, specifically:&lt;br /&gt;
## A project buffer is part of the plan. &lt;br /&gt;
## The project network is closed, all tasks lead to a single endpoint. &lt;br /&gt;
## All tasks have resources and/or skills assigned. &lt;br /&gt;
# Project performance on the overview page is 0% for both values.&lt;br /&gt;
&lt;br /&gt;
== Lynx issues ==&lt;br /&gt;
&lt;br /&gt;
=== Assigning resources before assigning story points ===&lt;br /&gt;
Conversion of story points to durations is done when and only when the resources are first assigned. If you create a task, do not set a story point estimate, and assign a resource, Lynx will set the duration to &amp;quot;[0 days]&amp;quot;. This value will not update when you enter a new story point estimate. &lt;br /&gt;
&lt;br /&gt;
Avoid this by assigning resources after you add story point estimates. As the only resource we generally use is &amp;quot;DevTeam&amp;quot; this is fairly easy. &lt;br /&gt;
&lt;br /&gt;
Fix this problem by unassigning the resource and reassigning it.&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=749</id>
		<title>Modeling projects</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=749"/>
		<updated>2026-09-27T15:45:37Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: /* Sanity checking the project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Default project configuration ==&lt;br /&gt;
# Project has an end date (Properties &amp;gt; Project Dates)&lt;br /&gt;
# Schedule engine is configured as JIT for both the main chain and feeding chains (Properties &amp;gt; Scheduling &amp;gt; Schedule engine): &lt;br /&gt;
## Schedule tasks &#039;just in time&#039; selected.&lt;br /&gt;
## Activate CCPM schedule engine On.&lt;br /&gt;
## Schedule feeding chains &#039;just in time&#039; selected. &lt;br /&gt;
&lt;br /&gt;
== Sanity checking the project ==&lt;br /&gt;
When releasing a project for the first time, you should sanity-check the project: &lt;br /&gt;
&lt;br /&gt;
# All tasks have story points.&lt;br /&gt;
# There are no tasks with a duration of [0 days].&lt;br /&gt;
# There are no tasks that run past the deadline, shown as the blue area in the project timeline. &lt;br /&gt;
# CCPM compliance checks (top right checkmark button in the project overview) reports no issues, specifically:&lt;br /&gt;
## A project buffer is part of the plan. &lt;br /&gt;
## The project network is closed, all tasks lead to a single endpoint. &lt;br /&gt;
## All tasks have resources and/or skills assigned. &lt;br /&gt;
# Project performance on the overview page is 0% for both values.&lt;br /&gt;
&lt;br /&gt;
== Lynx issues ==&lt;br /&gt;
&lt;br /&gt;
=== Assigning resources before assigning story points ===&lt;br /&gt;
Conversion of story points to durations is done when and only when the resources are first assigned. If you create a task, do not set a story point estimate, and assign a resource, Lynx will set the duration to &amp;quot;[0 days]&amp;quot;. This value will not update when you enter a new story point estimate. &lt;br /&gt;
&lt;br /&gt;
Avoid this by assigning resources after you add story point estimates. As the only resource we generally use is &amp;quot;DevTeam&amp;quot; this is fairly easy. &lt;br /&gt;
&lt;br /&gt;
Fix this problem by unassigning the resource and reassigning it.&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=748</id>
		<title>Modeling projects</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=748"/>
		<updated>2026-09-27T15:43:40Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: /* Sanity checking the project */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Default project configuration ==&lt;br /&gt;
# Project has an end date (Properties &amp;gt; Project Dates)&lt;br /&gt;
# Schedule engine is configured as JIT for both the main chain and feeding chains (Properties &amp;gt; Scheduling &amp;gt; Schedule engine): &lt;br /&gt;
## Schedule tasks &#039;just in time&#039; selected.&lt;br /&gt;
## Activate CCPM schedule engine On.&lt;br /&gt;
## Schedule feeding chains &#039;just in time&#039; selected. &lt;br /&gt;
&lt;br /&gt;
== Sanity checking the project ==&lt;br /&gt;
When releasing a project for the first time, you should sanity-check the project: &lt;br /&gt;
&lt;br /&gt;
# All tasks have story points.&lt;br /&gt;
# All tasks have a skill or a resource assigned. &lt;br /&gt;
# There are no tasks with a duration of [0 days].&lt;br /&gt;
# Project performance on the overview page is 0% for both values.&lt;br /&gt;
&lt;br /&gt;
== Lynx issues ==&lt;br /&gt;
&lt;br /&gt;
=== Assigning resources before assigning story points ===&lt;br /&gt;
Conversion of story points to durations is done when and only when the resources are first assigned. If you create a task, do not set a story point estimate, and assign a resource, Lynx will set the duration to &amp;quot;[0 days]&amp;quot;. This value will not update when you enter a new story point estimate. &lt;br /&gt;
&lt;br /&gt;
Avoid this by assigning resources after you add story point estimates. As the only resource we generally use is &amp;quot;DevTeam&amp;quot; this is fairly easy. &lt;br /&gt;
&lt;br /&gt;
Fix this problem by unassigning the resource and reassigning it.&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=747</id>
		<title>Modeling projects</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=747"/>
		<updated>2026-09-27T15:43:22Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Default project configuration ==&lt;br /&gt;
# Project has an end date (Properties &amp;gt; Project Dates)&lt;br /&gt;
# Schedule engine is configured as JIT for both the main chain and feeding chains (Properties &amp;gt; Scheduling &amp;gt; Schedule engine): &lt;br /&gt;
## Schedule tasks &#039;just in time&#039; selected.&lt;br /&gt;
## Activate CCPM schedule engine On.&lt;br /&gt;
## Schedule feeding chains &#039;just in time&#039; selected. &lt;br /&gt;
&lt;br /&gt;
== Sanity checking the project ==&lt;br /&gt;
Before &amp;amp; after releasing the project for the first time, you should sanity check the project: &lt;br /&gt;
&lt;br /&gt;
# All tasks have story points.&lt;br /&gt;
# All tasks have a skill or a resource assigned. &lt;br /&gt;
# There are no tasks with a duration of [0 days].&lt;br /&gt;
# Project performance on the overview page is 0% for both values. &lt;br /&gt;
&lt;br /&gt;
== Lynx issues ==&lt;br /&gt;
&lt;br /&gt;
=== Assigning resources before assigning story points ===&lt;br /&gt;
Conversion of story points to durations is done when and only when the resources are first assigned. If you create a task, do not set a story point estimate, and assign a resource, Lynx will set the duration to &amp;quot;[0 days]&amp;quot;. This value will not update when you enter a new story point estimate. &lt;br /&gt;
&lt;br /&gt;
Avoid this by assigning resources after you add story point estimates. As the only resource we generally use is &amp;quot;DevTeam&amp;quot; this is fairly easy. &lt;br /&gt;
&lt;br /&gt;
Fix this problem by unassigning the resource and reassigning it.&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=746</id>
		<title>Modeling projects</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Modeling_projects&amp;diff=746"/>
		<updated>2026-09-27T15:41:14Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: Created page with &amp;quot; == Sanity checking the project == Before &amp;amp; after releasing the project for the first time, you should sanity check the project:   # Project has an end date (Properties &amp;gt; Project Dates) # Schedule engine is configured as JIT for both the main chain and feeding chains (Properties &amp;gt; Scheduling &amp;gt; Schedule engine):  ## Schedule tasks &amp;#039;just in time&amp;#039; selected. ## Activate CCPM schedule engine On. ## Schedule feeding chains &amp;#039;just in time&amp;#039; selected.  # All tasks have story point...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
== Sanity checking the project ==&lt;br /&gt;
Before &amp;amp; after releasing the project for the first time, you should sanity check the project: &lt;br /&gt;
&lt;br /&gt;
# Project has an end date (Properties &amp;gt; Project Dates)&lt;br /&gt;
# Schedule engine is configured as JIT for both the main chain and feeding chains (Properties &amp;gt; Scheduling &amp;gt; Schedule engine): &lt;br /&gt;
## Schedule tasks &#039;just in time&#039; selected.&lt;br /&gt;
## Activate CCPM schedule engine On.&lt;br /&gt;
## Schedule feeding chains &#039;just in time&#039; selected. &lt;br /&gt;
# All tasks have story points.&lt;br /&gt;
# All tasks have a skill assigned, default DevTeam. &lt;br /&gt;
# There are no tasks with a duration of [0 days].&lt;br /&gt;
&lt;br /&gt;
== Lynx issues ==&lt;br /&gt;
&lt;br /&gt;
=== Assigning resources before assigning story points ===&lt;br /&gt;
Conversion of story points to durations is done when and only when the resources are first assigned. If you create a task, do not set a story point estimate, and assign a resource, Lynx will set the duration to &amp;quot;[0 days]&amp;quot;. This value will not update when you enter a new story point estimate. &lt;br /&gt;
&lt;br /&gt;
Avoid this by assigning resources after you add story point estimates. As the only resource we generally use is &amp;quot;DevTeam&amp;quot; this is fairly easy. &lt;br /&gt;
&lt;br /&gt;
Fix this problem by unassigning the resource and reassigning it.&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Internal&amp;diff=745</id>
		<title>Internal</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Internal&amp;diff=745"/>
		<updated>2026-09-27T15:30:59Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: /* Projects */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Strategy ==&lt;br /&gt;
* [[Flow metrics|Flow metrics]]&lt;br /&gt;
* [[12%-time|12%-time]]&lt;br /&gt;
&lt;br /&gt;
== Finance ==&lt;br /&gt;
&lt;br /&gt;
=== Exact ===&lt;br /&gt;
&lt;br /&gt;
* [[booking bonus|Booking bonus]]&lt;br /&gt;
* [[booking wages|Booking wages]]&lt;br /&gt;
* [[booking quarterly hosting invoice|Booking quarterly hosting invoice]]&lt;br /&gt;
* [[new receipt|Enter a new receipt]]&lt;br /&gt;
* [[reconciliation|Reconciliation of transaction]]&lt;br /&gt;
* [[invoicing|Send an invoice]]&lt;br /&gt;
* [[payment reminders|Send payment reminder]]&lt;br /&gt;
* [[invoice approval|Process for approving invoices (/filed receipts)]]&lt;br /&gt;
&lt;br /&gt;
=== Bunq ===&lt;br /&gt;
&lt;br /&gt;
* [[top up account|Top up expense account]]&lt;br /&gt;
&lt;br /&gt;
== Work Process ==&lt;br /&gt;
&lt;br /&gt;
* [[Definition of done|Definition of Done]]&lt;br /&gt;
* [[Incident Handling|Incident Handling]]&lt;br /&gt;
* [[SRE Maintenance|SRE Maintenance]]&lt;br /&gt;
* [[Release checklist|Release checklist]]&lt;br /&gt;
* [[Handover]]&lt;br /&gt;
* [[Measuring uptime]]&lt;br /&gt;
* [[Planning]]&lt;br /&gt;
** [[Planning parameters]]&lt;br /&gt;
&lt;br /&gt;
== Internal Process ==&lt;br /&gt;
* [[timetracking|Timetracking process]]&lt;br /&gt;
* [[Starting work for a new client]]&lt;br /&gt;
* [[12 percent|12% time]]&lt;br /&gt;
* [[Annual leave|Annual leave]]&lt;br /&gt;
* [[Bonus allocation|Bonus allocation]]&lt;br /&gt;
* [[Calamity leave|Calamity leave]]&lt;br /&gt;
* [[Overtime|Overtime]]&lt;br /&gt;
* [[Retrospectives|Retrospectives]]&lt;br /&gt;
* [[Sick leave|Sick leave]]&lt;br /&gt;
* [[Training and self-study|Training and Self-Study]]&lt;br /&gt;
* [[Daily|Daily]]&lt;br /&gt;
* [[Weekly report]]&lt;br /&gt;
&lt;br /&gt;
== Projects ==&lt;br /&gt;
&lt;br /&gt;
* [[Modelling projects]]&lt;br /&gt;
* Era Inventory [[project_era_inventory_api|API Description]]&lt;br /&gt;
&lt;br /&gt;
== SRE ==&lt;br /&gt;
&#039;&#039;To be further populated with guides from drive&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Updates ===&lt;br /&gt;
&lt;br /&gt;
* [[policy|General update policy]]&lt;br /&gt;
* [[border update|Updating a border]]&lt;br /&gt;
* [[update-sentry|Update Sentry]]&lt;br /&gt;
* [[Update Zulip Server version]]&lt;br /&gt;
&lt;br /&gt;
=== SLA ===&lt;br /&gt;
* [[Response for Backup Service being down for an extended period of time]]&lt;br /&gt;
* [[postgres issues|Analyzing postgres performance]]&lt;br /&gt;
&lt;br /&gt;
=== Uncategorized ===&lt;br /&gt;
* [[create gitlab runner host|Create a GitLab runner host]]&lt;br /&gt;
* [[vm setup|Create a (Debian) VM]]&lt;br /&gt;
* [[border reboot|Reboot border without downtime]]&lt;br /&gt;
* [[ceph|Common Ceph commands]]&lt;br /&gt;
* [[WS Proxmox node reboot|Reboot WS Proxmox node without downtime]]&lt;br /&gt;
* [[Resize VM Disk]]&lt;br /&gt;
* [[SRE tools]]&lt;br /&gt;
* [[Enroll Mac in Kerberos]]&lt;br /&gt;
* [[New Mac Setup]]&lt;br /&gt;
* [[Creating a VM on Hetzner]]&lt;br /&gt;
* [[Rebooting VM]]&lt;br /&gt;
* [[Rebooting Offsite]]&lt;br /&gt;
* [[ssh-fingerprints|Verifying SSH fingerprints]]&lt;br /&gt;
* [[Removing VM]]&lt;br /&gt;
* [[Install a new Disk in Server]]&lt;br /&gt;
* [[Setting Up Wildcard Subdomains with SSL on a Debian Application]]&lt;br /&gt;
* [[s3 bucket backup|Get credentials to backup S3 bucket to Zombie]]&lt;br /&gt;
* [[Hardware Incident Response: Memory Slot Failure on banshee]]&lt;br /&gt;
* [[Hardware Incident Response: Switch failure in DC]]&lt;br /&gt;
* [[dfz switch setup|DFZ Switch setup]]&lt;br /&gt;
* [[iDRAC: Upload a new pem certificate for automatic updates]]&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
* [[stack|Greenfield stack]]&lt;br /&gt;
* [[standard tools|Standard Tools]]&lt;br /&gt;
* [[list of unfurl debuggers|List of unfurl debuggers]]&lt;br /&gt;
* [[Recommended suppliers]]&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Planning_parameters&amp;diff=737</id>
		<title>Planning parameters</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Planning_parameters&amp;diff=737"/>
		<updated>2026-09-01T14:40:44Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: /* Known limitations */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Planning parameters =&lt;br /&gt;
&lt;br /&gt;
This article defines the numbers used for long-term capacity planning: planning work beyond the currently in-progress scope. It exists so that roadmap dates are derived from a shared, versioned set of parameters rather than re-argued each time.&lt;br /&gt;
&lt;br /&gt;
Scope: these parameters are for &#039;&#039;&#039;planning at the horizon level&#039;&#039;&#039; — sizing inbound work, projecting when a project can start, and testing whether a proposed commitment fits. They are not a substitute for a project plan once work is scheduled in [[A-Dato Lynx]].&lt;br /&gt;
&lt;br /&gt;
== Key numbers ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Parameter !! Value !!  Derivation&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Throughput&#039;&#039;&#039; || 55 pts/week || Story points completed per calendar week, averaged over the trailing six weeks. Includes SRE work.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;SRE inbound rate (λ&amp;lt;sub&amp;gt;SRE&amp;lt;/sub&amp;gt;)&#039;&#039;&#039; || 46 pts/week || Median story points of SRE work &#039;&#039;arriving&#039;&#039; per week across 2026. Measures demand, not completion.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Project capacity&#039;&#039;&#039; || 9 pts/week || Throughput minus SRE inbound rate. The capacity actually available for client and internal projects.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Unestimated overhead share&#039;&#039;&#039; || 25% of working hours || Meetings, administration, invoicing, supplies, and other work carried no story points. Stable across multiple years in [[Kimai]].&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Expected size — SRE item&#039;&#039;&#039; || 11 pts || Historical median story points for a single SRE item. Used to size an unscoped incident.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Expected size — client project&#039;&#039;&#039; || 122 pts || Historical median story points for a client project. Used to size an unscoped project without producing a project plan.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Expected size — other internal project&#039;&#039;&#039; || 56 pts || Historical median story points for an internal project.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Using the parameters ==&lt;br /&gt;
&lt;br /&gt;
=== Sizing unscoped work ===&lt;br /&gt;
&lt;br /&gt;
Multiply the count of expected items by the median size for its type. This gives a planning-grade estimate without a project plan. It is valid in aggregate, across several items; it is not a commitment for any single item.&lt;br /&gt;
&lt;br /&gt;
=== Projecting elapsed time ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;elapsed weeks ≈ project size ÷ project capacity&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At 9 pts/week, a 122-point client project is ≈14 weeks of elapsed time assuming it is the only project in flight. At the 2026 median (5.1 pts/week) it is ≈24 weeks. Two concurrent projects do not halve either figure — they share the same remainder.&lt;br /&gt;
&lt;br /&gt;
== Known limitations ==&lt;br /&gt;
&lt;br /&gt;
These are open issues, not settled parameters. Each affects the reliability of the numbers above.&lt;br /&gt;
&lt;br /&gt;
; Velocity is credited to the week work was completed. &lt;br /&gt;
: Story points are credited to the week in which the estimate was entered, not the week the work was performed. This creates artificial spikes in the rolling average.&lt;br /&gt;
&lt;br /&gt;
; Throughput is a level, not a rate&lt;br /&gt;
: 55 pts/week is valid only for the staffing and availability configuration that produced it. It cannot distinguish a slower team from a smaller available week. Normalising to &#039;&#039;&#039;points per available person-day&#039;&#039;&#039; would make time-off and headcount changes arithmetic rather than judgement.&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Planning_parameters&amp;diff=736</id>
		<title>Planning parameters</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Planning_parameters&amp;diff=736"/>
		<updated>2026-09-01T14:40:00Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Planning parameters =&lt;br /&gt;
&lt;br /&gt;
This article defines the numbers used for long-term capacity planning: planning work beyond the currently in-progress scope. It exists so that roadmap dates are derived from a shared, versioned set of parameters rather than re-argued each time.&lt;br /&gt;
&lt;br /&gt;
Scope: these parameters are for &#039;&#039;&#039;planning at the horizon level&#039;&#039;&#039; — sizing inbound work, projecting when a project can start, and testing whether a proposed commitment fits. They are not a substitute for a project plan once work is scheduled in [[A-Dato Lynx]].&lt;br /&gt;
&lt;br /&gt;
== Key numbers ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Parameter !! Value !!  Derivation&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Throughput&#039;&#039;&#039; || 55 pts/week || Story points completed per calendar week, averaged over the trailing six weeks. Includes SRE work.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;SRE inbound rate (λ&amp;lt;sub&amp;gt;SRE&amp;lt;/sub&amp;gt;)&#039;&#039;&#039; || 46 pts/week || Median story points of SRE work &#039;&#039;arriving&#039;&#039; per week across 2026. Measures demand, not completion.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Project capacity&#039;&#039;&#039; || 9 pts/week || Throughput minus SRE inbound rate. The capacity actually available for client and internal projects.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Unestimated overhead share&#039;&#039;&#039; || 25% of working hours || Meetings, administration, invoicing, supplies, and other work carried no story points. Stable across multiple years in [[Kimai]].&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Expected size — SRE item&#039;&#039;&#039; || 11 pts || Historical median story points for a single SRE item. Used to size an unscoped incident.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Expected size — client project&#039;&#039;&#039; || 122 pts || Historical median story points for a client project. Used to size an unscoped project without producing a project plan.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Expected size — other internal project&#039;&#039;&#039; || 56 pts || Historical median story points for an internal project.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Using the parameters ==&lt;br /&gt;
&lt;br /&gt;
=== Sizing unscoped work ===&lt;br /&gt;
&lt;br /&gt;
Multiply the count of expected items by the median size for its type. This gives a planning-grade estimate without a project plan. It is valid in aggregate, across several items; it is not a commitment for any single item.&lt;br /&gt;
&lt;br /&gt;
=== Projecting elapsed time ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;elapsed weeks ≈ project size ÷ project capacity&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At 9 pts/week, a 122-point client project is ≈14 weeks of elapsed time assuming it is the only project in flight. At the 2026 median (5.1 pts/week) it is ≈24 weeks. Two concurrent projects do not halve either figure — they share the same remainder.&lt;br /&gt;
&lt;br /&gt;
== Known limitations ==&lt;br /&gt;
&lt;br /&gt;
These are open issues, not settled parameters. Each affects the reliability of the numbers above.&lt;br /&gt;
&lt;br /&gt;
; Backfill is credited to the wrong week&lt;br /&gt;
: Backfilled points are credited to the week in which the estimate was entered, not the week the work was performed. This creates artificial spikes in the rolling average.&lt;br /&gt;
&lt;br /&gt;
; Throughput is a level, not a rate&lt;br /&gt;
: 55 pts/week is valid only for the staffing and availability configuration that produced it. It cannot distinguish a slower team from a smaller available week. Normalising to &#039;&#039;&#039;points per available person-day&#039;&#039;&#039; would make time-off and headcount changes arithmetic rather than judgement.&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Planning_parameters&amp;diff=735</id>
		<title>Planning parameters</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Planning_parameters&amp;diff=735"/>
		<updated>2026-09-01T14:38:29Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: Created page with &amp;quot;= Planning parameters =  This article defines the numbers used for long-term capacity planning: planning work beyond the currently in-progress scope. It exists so that roadmap dates are derived from a shared, versioned set of parameters rather than re-argued each time.  Scope: these parameters are for &amp;#039;&amp;#039;&amp;#039;planning at the horizon level&amp;#039;&amp;#039;&amp;#039; — sizing inbound work, projecting when a project can start, and testing whether a proposed commitment fits. They are not a substitute...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Planning parameters =&lt;br /&gt;
&lt;br /&gt;
This article defines the numbers used for long-term capacity planning: planning work beyond the currently in-progress scope. It exists so that roadmap dates are derived from a shared, versioned set of parameters rather than re-argued each time.&lt;br /&gt;
&lt;br /&gt;
Scope: these parameters are for &#039;&#039;&#039;planning at the horizon level&#039;&#039;&#039; — sizing inbound work, projecting when a project can start, and testing whether a proposed commitment fits. They are not a substitute for a project plan once work is scheduled in [[A-Dato Lynx]].&lt;br /&gt;
&lt;br /&gt;
== Key numbers ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Parameter !! Value !!  Derivation&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Throughput&#039;&#039;&#039; || 55 pts/week || Story points completed per calendar week, averaged over the trailing six weeks. Includes SRE work.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;SRE inbound rate (λ&amp;lt;sub&amp;gt;SRE&amp;lt;/sub&amp;gt;)&#039;&#039;&#039; || 46 pts/week || Median story points of SRE work &#039;&#039;arriving&#039;&#039; per week across 2026. Measures demand, not completion.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Project capacity&#039;&#039;&#039; || 9 pts/week || Throughput minus SRE inbound rate. The capacity actually available for client and internal projects.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Unestimated overhead share&#039;&#039;&#039; || 25% of working hours || Meetings, administration, invoicing, supplies, and other work carried no story points. Stable across multiple years in [[Kimai]].&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Expected size — SRE item&#039;&#039;&#039; || 11 pts || Historical median story points for a single SRE item. Used to size an unscoped incident.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Expected size — client project&#039;&#039;&#039; || 122 pts || Historical median story points for a client project. Used to size an unscoped project without producing a project plan.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Expected size — other internal project&#039;&#039;&#039; || 56 pts || Historical median story points for an internal project.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Using the parameters ==&lt;br /&gt;
&lt;br /&gt;
=== Sizing unscoped work ===&lt;br /&gt;
&lt;br /&gt;
Multiply the count of expected items by the median size for its type. This gives a planning-grade estimate without a project plan. It is valid in aggregate, across several items; it is not a commitment for any single item.&lt;br /&gt;
&lt;br /&gt;
=== Projecting elapsed time ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;elapsed weeks ≈ project size ÷ project capacity&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
At 9 pts/week, a 122-point client project is ≈14 weeks of elapsed time assuming it is the only project in flight. At the 2026 median (5.1 pts/week) it is ≈24 weeks. Two concurrent projects do not halve either figure — they share the same remainder.&lt;br /&gt;
&lt;br /&gt;
== Known limitations ==&lt;br /&gt;
&lt;br /&gt;
These are open issues, not settled parameters. Each affects the reliability of the numbers above.&lt;br /&gt;
&lt;br /&gt;
; Backfill is credited to the wrong week&lt;br /&gt;
: Backfilled points are credited to the week in which the estimate was entered, not the week the work was performed. This creates artificial spikes in the rolling average.&lt;br /&gt;
&lt;br /&gt;
; Throughput is a level, not a rate&lt;br /&gt;
: 55 pts/week is valid only for the staffing and availability configuration that produced it. It cannot distinguish a slower team from a smaller available week. Normalising to &#039;&#039;&#039;points per available person-day&#039;&#039;&#039; would make time-off and headcount changes arithmetic rather than judgement.&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Kimai&amp;diff=734</id>
		<title>Kimai</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Kimai&amp;diff=734"/>
		<updated>2026-09-01T14:37:43Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: Created page with &amp;quot;Time-tracking tool.   https://timetracking.delftsolutions.nl/&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Time-tracking tool. &lt;br /&gt;
&lt;br /&gt;
https://timetracking.delftsolutions.nl/&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=A-Dato_Lynx&amp;diff=733</id>
		<title>A-Dato Lynx</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=A-Dato_Lynx&amp;diff=733"/>
		<updated>2026-09-01T14:30:07Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: Created page with &amp;quot;Lynx is the planning tool we use to do Critical Chain Project Management (CCPM) to our work.   https://lynxonline.a-dato.com/&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Lynx is the planning tool we use to do Critical Chain Project Management (CCPM) to our work. &lt;br /&gt;
&lt;br /&gt;
https://lynxonline.a-dato.com/&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Internal&amp;diff=732</id>
		<title>Internal</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Internal&amp;diff=732"/>
		<updated>2026-09-01T14:22:28Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: /* Work Process */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Strategy ==&lt;br /&gt;
* [[Flow metrics|Flow metrics]]&lt;br /&gt;
* [[12%-time|12%-time]]&lt;br /&gt;
&lt;br /&gt;
== Finance ==&lt;br /&gt;
&lt;br /&gt;
=== Exact ===&lt;br /&gt;
&lt;br /&gt;
* [[booking bonus|Booking bonus]]&lt;br /&gt;
* [[booking wages|Booking wages]]&lt;br /&gt;
* [[booking quarterly hosting invoice|Booking quarterly hosting invoice]]&lt;br /&gt;
* [[new receipt|Enter a new receipt]]&lt;br /&gt;
* [[reconciliation|Reconciliation of transaction]]&lt;br /&gt;
* [[invoicing|Send an invoice]]&lt;br /&gt;
* [[payment reminders|Send payment reminder]]&lt;br /&gt;
* [[invoice approval|Process for approving invoices (/filed receipts)]]&lt;br /&gt;
&lt;br /&gt;
=== Bunq ===&lt;br /&gt;
&lt;br /&gt;
* [[top up account|Top up expense account]]&lt;br /&gt;
&lt;br /&gt;
== Work Process ==&lt;br /&gt;
&lt;br /&gt;
* [[Definition of done|Definition of Done]]&lt;br /&gt;
* [[Incident Handling|Incident Handling]]&lt;br /&gt;
* [[SRE Maintenance|SRE Maintenance]]&lt;br /&gt;
* [[Release checklist|Release checklist]]&lt;br /&gt;
* [[Handover]]&lt;br /&gt;
* [[Measuring uptime]]&lt;br /&gt;
* [[Planning]]&lt;br /&gt;
** [[Planning parameters]]&lt;br /&gt;
&lt;br /&gt;
== Internal Process ==&lt;br /&gt;
* [[timetracking|Timetracking process]]&lt;br /&gt;
* [[Starting work for a new client]]&lt;br /&gt;
* [[12 percent|12% time]]&lt;br /&gt;
* [[Annual leave|Annual leave]]&lt;br /&gt;
* [[Bonus allocation|Bonus allocation]]&lt;br /&gt;
* [[Calamity leave|Calamity leave]]&lt;br /&gt;
* [[Overtime|Overtime]]&lt;br /&gt;
* [[Retrospectives|Retrospectives]]&lt;br /&gt;
* [[Sick leave|Sick leave]]&lt;br /&gt;
* [[Training and self-study|Training and Self-Study]]&lt;br /&gt;
* [[Daily|Daily]]&lt;br /&gt;
* [[Weekly report]]&lt;br /&gt;
&lt;br /&gt;
== Projects ==&lt;br /&gt;
&lt;br /&gt;
* Era Inventory [[project_era_inventory_api|API Description]]&lt;br /&gt;
&lt;br /&gt;
== SRE ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;To be further populated with guide from drive&#039;&#039;&lt;br /&gt;
* [[create gitlab runner host|Create a GitLab runner host]]&lt;br /&gt;
* [[vm setup|Create a (Debian) VM]]&lt;br /&gt;
* [[border update|Process for updating a border]]&lt;br /&gt;
* [[border reboot|Reboot border without downtime]]&lt;br /&gt;
* [[ceph|Common Ceph commands]]&lt;br /&gt;
* [[WS Proxmox node reboot|Reboot WS Proxmox node without downtime]]&lt;br /&gt;
* [[Resize VM Disk]]&lt;br /&gt;
* [[SRE tools]]&lt;br /&gt;
* [[Enroll Mac in Kerberos]]&lt;br /&gt;
* [[New Mac Setup]]&lt;br /&gt;
* [[Creating a VM on Hetzner]]&lt;br /&gt;
* [[Rebooting VM]]&lt;br /&gt;
* [[Rebooting Offsite]]&lt;br /&gt;
* [[ssh-fingerprints|Verifying SSH fingerprints]]&lt;br /&gt;
* [[Removing VM]]&lt;br /&gt;
* [[Install a new Disk in Server]]&lt;br /&gt;
* [[Setting Up Wildcard Subdomains with SSL on a Debian Application]]&lt;br /&gt;
* [[s3 bucket backup|Get credentials to backup S3 bucket to Zombie]]&lt;br /&gt;
* [[Hardware Incident Response: Memory Slot Failure on banshee]]&lt;br /&gt;
* [[Hardware Incident Response: Switch failure in DC]]&lt;br /&gt;
* [[dfz switch setup|DFZ Switch setup]]&lt;br /&gt;
* [[Update Zulip Server version]]&lt;br /&gt;
* [[update-sentry|Update Sentry]]&lt;br /&gt;
* [[iDRAC: Upload a new pem certificate for automatic updates]]&lt;br /&gt;
=== SLA ===&lt;br /&gt;
* [[Response for Backup Service being down for an extended period of time]]&lt;br /&gt;
* [[postgres issues|Analyzing postgres performance]]&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
* [[stack|Greenfield stack]]&lt;br /&gt;
* [[standard tools|Standard Tools]]&lt;br /&gt;
* [[list of unfurl debuggers|List of unfurl debuggers]]&lt;br /&gt;
* [[Recommended suppliers]]&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Weekly_report&amp;diff=708</id>
		<title>Weekly report</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Weekly_report&amp;diff=708"/>
		<updated>2026-06-03T11:05:23Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Pre-checks ==&lt;br /&gt;
These should be handled by the First Responder or other meetings, but often aren&#039;t. We check them here to ensure we have an up to date view of what&#039;s happening: &lt;br /&gt;
&lt;br /&gt;
# There are no open topics in [https://chat.dsinternal.net/#narrow/channel/36-SRE---Report SRE - Report] channel. Every open topic is either moved to non-critical or critical status, or closed immediately. &lt;br /&gt;
# Every open topic in [https://chat.dsinternal.net/#narrow/channel/4-SRE-.23.23-Non-critical SRE ## Non-critical] has been added to the milestone sheet. &lt;br /&gt;
# There are no open topics in [https://chat.dsinternal.net/#narrow/channel/24-SRE-.23-Critical SRE # Critical], or they&#039;re being actively worked on by the First Responder. &lt;br /&gt;
# All rows in the [https://docs.google.com/spreadsheets/d/1jJGYax_1_drirEU26Tv-RP84Hx7doppKrR9dexU_0DI/edit?gid=0#gid=0&amp;amp;range=A1 Milestones sheet] are not completed. Any DOD that has been achieved should be closed immediately. &lt;br /&gt;
&lt;br /&gt;
== Creating the report ==&lt;br /&gt;
# Open weekly report folder: https://drive.google.com/drive/folders/1p6yWvxea_FkIiSGwjj-xAZ_4I3PRwVEi&lt;br /&gt;
# Copy the template&lt;br /&gt;
# Fill out the report sections&lt;br /&gt;
# Invite other team members to post comments&lt;br /&gt;
# Process all comments&lt;br /&gt;
# Post the weekly report to the [https://chat.dsinternal.net/#narrow/channel/19-Todo-The-Team Todo The Team] channel, titled &amp;quot;Weekly report - 2026-05-27 - Week 22&amp;quot;&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Weekly_report&amp;diff=707</id>
		<title>Weekly report</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Weekly_report&amp;diff=707"/>
		<updated>2026-06-03T11:03:24Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Pre-checks ==&lt;br /&gt;
These should be handled by the First Responder but often aren&#039;t. We check them here to ensure we have an up to date view of what&#039;s happening: &lt;br /&gt;
&lt;br /&gt;
# There are no open topics in [https://chat.dsinternal.net/#narrow/channel/36-SRE---Report SRE - Report] channel. Every open topic is either moved to non-critical or critical status, or closed immediately. &lt;br /&gt;
# Every open topic in [https://chat.dsinternal.net/#narrow/channel/4-SRE-.23.23-Non-critical SRE ## Non-critical] has been added to the milestone sheet. &lt;br /&gt;
# There are no open topics in [https://chat.dsinternal.net/#narrow/channel/24-SRE-.23-Critical SRE # Critical], or they&#039;re being actively worked on by the First Responder. &lt;br /&gt;
&lt;br /&gt;
== Creating the report ==&lt;br /&gt;
# Open weekly report folder: https://drive.google.com/drive/folders/1p6yWvxea_FkIiSGwjj-xAZ_4I3PRwVEi&lt;br /&gt;
# Copy the template&lt;br /&gt;
# Fill out the report sections&lt;br /&gt;
# Invite other team members to post comments&lt;br /&gt;
# Process all comments&lt;br /&gt;
# Post the weekly report to the [https://chat.dsinternal.net/#narrow/channel/19-Todo-The-Team Todo The Team] channel, titled &amp;quot;Weekly report - 2026-05-27 - Week 22&amp;quot;&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Weekly_report&amp;diff=706</id>
		<title>Weekly report</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Weekly_report&amp;diff=706"/>
		<updated>2026-06-03T11:00:14Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: Created page with &amp;quot;== Pre-checks ==  == Creating the report == # Open weekly report folder: https://drive.google.com/drive/folders/1p6yWvxea_FkIiSGwjj-xAZ_4I3PRwVEi # Copy the template # Fill out the report sections # Invite other team members to post comments # Process all comments # Post the weekly report to the [https://chat.dsinternal.net/#narrow/channel/19-Todo-The-Team Todo The Team] channel, titled &amp;quot;Weekly report - 2026-05-27 - Week 22&amp;quot;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Pre-checks ==&lt;br /&gt;
&lt;br /&gt;
== Creating the report ==&lt;br /&gt;
# Open weekly report folder: https://drive.google.com/drive/folders/1p6yWvxea_FkIiSGwjj-xAZ_4I3PRwVEi&lt;br /&gt;
# Copy the template&lt;br /&gt;
# Fill out the report sections&lt;br /&gt;
# Invite other team members to post comments&lt;br /&gt;
# Process all comments&lt;br /&gt;
# Post the weekly report to the [https://chat.dsinternal.net/#narrow/channel/19-Todo-The-Team Todo The Team] channel, titled &amp;quot;Weekly report - 2026-05-27 - Week 22&amp;quot;&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Internal&amp;diff=705</id>
		<title>Internal</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Internal&amp;diff=705"/>
		<updated>2026-06-03T10:55:37Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Strategy ==&lt;br /&gt;
* [[Flow metrics|Flow metrics]]&lt;br /&gt;
* [[12%-time|12%-time]]&lt;br /&gt;
&lt;br /&gt;
== Finance ==&lt;br /&gt;
&lt;br /&gt;
=== Exact ===&lt;br /&gt;
&lt;br /&gt;
* [[booking bonus|Booking bonus]]&lt;br /&gt;
* [[booking wages|Booking wages]]&lt;br /&gt;
* [[booking quarterly hosting invoice|Booking quarterly hosting invoice]]&lt;br /&gt;
* [[new receipt|Enter a new receipt]]&lt;br /&gt;
* [[reconciliation|Reconciliation of transaction]]&lt;br /&gt;
* [[invoicing|Send an invoice]]&lt;br /&gt;
* [[payment reminders|Send payment reminder]]&lt;br /&gt;
* [[invoice approval|Process for approving invoices (/filed receipts)]]&lt;br /&gt;
&lt;br /&gt;
=== Bunq ===&lt;br /&gt;
&lt;br /&gt;
* [[top up account|Top up expense account]]&lt;br /&gt;
&lt;br /&gt;
== Work Process ==&lt;br /&gt;
&lt;br /&gt;
* [[Definition of done|Definition of Done]]&lt;br /&gt;
* [[Incident Handling|Incident Handling]]&lt;br /&gt;
* [[SRE Maintenance|SRE Maintenance]]&lt;br /&gt;
* [[Release checklist|Release checklist]]&lt;br /&gt;
* [[Handover]]&lt;br /&gt;
&lt;br /&gt;
== Internal Process ==&lt;br /&gt;
* [[timetracking|Timetracking process]]&lt;br /&gt;
* [[Starting work for a new client]]&lt;br /&gt;
* [[12 percent|12% time]]&lt;br /&gt;
* [[Annual leave|Annual leave]]&lt;br /&gt;
* [[Bonus allocation|Bonus allocation]]&lt;br /&gt;
* [[Calamity leave|Calamity leave]]&lt;br /&gt;
* [[Overtime|Overtime]]&lt;br /&gt;
* [[Retrospectives|Retrospectives]]&lt;br /&gt;
* [[Sick leave|Sick leave]]&lt;br /&gt;
* [[Training and self-study|Training and Self-Study]]&lt;br /&gt;
* [[Daily|Daily]]&lt;br /&gt;
* [[Weekly report]]&lt;br /&gt;
&lt;br /&gt;
== Projects ==&lt;br /&gt;
&lt;br /&gt;
* Era Inventory [[project_era_inventory_api|API Description]]&lt;br /&gt;
&lt;br /&gt;
== SRE ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;To be further populated with guide from drive&#039;&#039;&lt;br /&gt;
* [[create gitlab runner host|Create a GitLab runner host]]&lt;br /&gt;
* [[vm setup|Create a (Debian) VM]]&lt;br /&gt;
* [[border update|Process for updating a border]]&lt;br /&gt;
* [[border reboot|Reboot border without downtime]]&lt;br /&gt;
* [[ceph|Common Ceph commands]]&lt;br /&gt;
* [[WS Proxmox node reboot|Reboot WS Proxmox node without downtime]]&lt;br /&gt;
* [[Resize VM Disk]]&lt;br /&gt;
* [[SRE tools]]&lt;br /&gt;
* [[Enroll Mac in Kerberos]]&lt;br /&gt;
* [[New Mac Setup]]&lt;br /&gt;
* [[Creating a VM on Hetzner]]&lt;br /&gt;
* [[Rebooting VM]]&lt;br /&gt;
* [[Rebooting Offsite]]&lt;br /&gt;
* [[ssh-fingerprints|Verifying SSH fingerprints]]&lt;br /&gt;
* [[Removing VM]]&lt;br /&gt;
* [[Install a new Disk in Server]]&lt;br /&gt;
* [[Setting Up Wildcard Subdomains with SSL on a Debian Application]]&lt;br /&gt;
* [[s3 bucket backup|Get credentials to backup S3 bucket to Zombie]]&lt;br /&gt;
* [[Hardware Incident Response: Memory Slot Failure on banshee]]&lt;br /&gt;
* [[dfz switch setup|DFZ Switch setup]]&lt;br /&gt;
* [[Update Zulip Server version]]&lt;br /&gt;
* [[update-sentry|Update Sentry]]&lt;br /&gt;
* [[iDRAC: Upload a new pem certificate for automatic updates]]&lt;br /&gt;
=== SLA ===&lt;br /&gt;
* [[Response for Backup Service being down for an extended period of time]]&lt;br /&gt;
* [[postgres issues|Analyzing postgres performance]]&lt;br /&gt;
&lt;br /&gt;
== Other ==&lt;br /&gt;
&lt;br /&gt;
* [[stack|Greenfield stack]]&lt;br /&gt;
* [[standard tools|Standard Tools]]&lt;br /&gt;
* [[list of unfurl debuggers|List of unfurl debuggers]]&lt;br /&gt;
* [[Recommended suppliers]]&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Incident_Handling&amp;diff=696</id>
		<title>Incident Handling</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Incident_Handling&amp;diff=696"/>
		<updated>2026-03-23T12:35:28Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: /* Non-Critical incidents */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= This is the process =&lt;br /&gt;
This document is an authoritative description of the process. This document supersedes all prior documents on the process. &lt;br /&gt;
&lt;br /&gt;
= Deviating from the process =&lt;br /&gt;
You may deviate from the process at any moment. A deviation should be communicated to the dev-team, preferably in the Zulip topic about the applicable incident, as soon as possible after deciding to deviate.&lt;br /&gt;
&lt;br /&gt;
= Checklist =&lt;br /&gt;
This checklist is a shorter, imperative version of [[Incident Handling#Full_procedure|the longer procedure below]]. You&#039;re encouraged to read the [[Incident Handling#Full_procedure|full procedure]] at least once to improve your understanding of the core material.&lt;br /&gt;
&lt;br /&gt;
=== Critical Incidents ===&lt;br /&gt;
Critical incidents must be resolved within 16 hours. &lt;br /&gt;
&lt;br /&gt;
# Acknowledge trigger in Zabbix.&lt;br /&gt;
# Check if the incident is still ongoing.&lt;br /&gt;
# Determine whether the incident is ongoing&lt;br /&gt;
# If this report came in via SRE - Report:&lt;br /&gt;
## keep that thread open until the incident is resolved&lt;br /&gt;
## post a link to the SRE - Report thread to any underlying technical threads in SRE # Critical, SRE ## Non-critical, or SRE ### Informational that is related&lt;br /&gt;
# Determine whether clients are potentially affected, if so:&lt;br /&gt;
## notify the affected clients (Slack preferred if available)&lt;br /&gt;
## share the message sent to the client in the incident Zulip thread&lt;br /&gt;
# Document all actions taken in the Zulip topic.&lt;br /&gt;
# Create a plan of action.&lt;br /&gt;
# Execute plan and document results in Zabbix thread. &lt;br /&gt;
# If unresolved, create a new plan.&lt;br /&gt;
# When resolved:&lt;br /&gt;
## Verify trigger is no longer firing.&lt;br /&gt;
## Decide on when to notify affected clients (that you have notified of the incident), the incident has been resolved, and communicate this internally&lt;br /&gt;
## Mark Zulip topic as resolved if no other incidents for the host.&lt;br /&gt;
## Check for related triggers and resolve them.&lt;br /&gt;
## If there were any SRE - Report threads:&lt;br /&gt;
### post a summary describing the high-level incident, that it is resolved, and how it was resolved. &lt;br /&gt;
### post that summary message to any client channels such as Slack too. &lt;br /&gt;
### close the thread in SRE - Report&lt;br /&gt;
&lt;br /&gt;
Note: we do not accept discussions on the how or why of incident response in the SRE - Report channel; those should be redirected to either Retro or Organisational channels. The only reason to reopen a thread in SRE - Report should be to report that there&#039;s still impact and the incident has been resolved prematurely. &lt;br /&gt;
&lt;br /&gt;
=== Non-Critical Incidents ===&lt;br /&gt;
Non-critical incidents must be acknowledged within one working day and resolved within 3 weeks. &lt;br /&gt;
&lt;br /&gt;
# Acknowledge in Zabbix thread&lt;br /&gt;
# Check metrics sheet for existing milestone&lt;br /&gt;
## If a milestone exists:&lt;br /&gt;
### Add Lynx project ID to Zulip topic&lt;br /&gt;
### Add 🔁 emoji if ID already reported&lt;br /&gt;
## If no milestone exists:&lt;br /&gt;
### Add to metrics sheet&lt;br /&gt;
### Create Lynx project (priority 99, then 20 after estimation)&lt;br /&gt;
### Create Kimai activity&lt;br /&gt;
### Document IDs in Zulip topic&lt;br /&gt;
&lt;br /&gt;
=== Informational Incidents ===&lt;br /&gt;
Informational incidents must be acknowledged within 72 hours.&lt;br /&gt;
&lt;br /&gt;
# Acknowledge in Zabbix&lt;br /&gt;
# Verify issue&lt;br /&gt;
# Take action if needed&lt;br /&gt;
&lt;br /&gt;
=== External Reports ===&lt;br /&gt;
&lt;br /&gt;
# Acknowledge receipt&lt;br /&gt;
# Classify report as critical, non-critical or informational. &lt;br /&gt;
# Create a Zulip topic in SRE # Critical, SRE ## Non-critical or SRE ### Informational (depending on classification) and add sufficient details. &lt;br /&gt;
# Proceed with checklist above for the type of incident.&lt;br /&gt;
&lt;br /&gt;
= Full procedure =&lt;br /&gt;
&lt;br /&gt;
== General Rules ==&lt;br /&gt;
&lt;br /&gt;
# When an incident is in progress, and person A is handling it, then all incidents in area X, are handled by person A, rather than the FR. Unless working day ends. Person A should communicate clearly to FR when their day is over.&lt;br /&gt;
# FR always has the last word on what solution to apply for resolving an incident.&lt;br /&gt;
&lt;br /&gt;
== Critical incidents ==&lt;br /&gt;
&#039;&#039;&#039;Critical incidents are resolved within 16 hours.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
As first responder you take on the responsiblity of seeing an incident resolved. This does not mean that you are the person required to do all the work. You can attempt to involve others to help you (often referred to as escalating the incident), but since other are not on-call, they are not obliged to help you, especially outside of normal working hours.&lt;br /&gt;
Involving multiple people can quickly be required if multiple critical incidents with different causes occur simultaneously. In that case, the First Responder usually takes on a more information management role and steers those that are brought on into resolving the issues. (Example: if a server crashes, several critical triggers can fire, but the underlying cause can quite quickly be determined to be a single issue, the crashed server. So you wouldn&#039;t need to call in people to manage each incident. But a client&#039;s service being down in one cluster while in a different cluster a different VM no longer boots is likely to be to different issues, so in order to resolve them on time you&#039;d want to call in help to resolve the incident in time).&lt;br /&gt;
&lt;br /&gt;
=== Process ===&lt;br /&gt;
The general process is made up of the following steps. Each step has additional information on how to handle/execute them in the sections below.&lt;br /&gt;
# Take responsibility for seeing the incident resolved&lt;br /&gt;
# Determine if incident is still ongoing&lt;br /&gt;
# If ongoing: Communicate to affected clients that the issue is being investigated&lt;br /&gt;
# Communicate plan/next steps (even if that is gathering information)&lt;br /&gt;
# Communicate findings/results of executed plan, go back to previous step if not resolved&lt;br /&gt;
# Resolve incident + cleanup&lt;br /&gt;
&lt;br /&gt;
During working on an incident it is expected that all communication is done in the incident&#039;s thread. This means all information to a problem can be found in a clear a predictable place. Sometimes an incident can be resolved by work done in another incident. In that case, it is required to post a link to that thread in the incident&#039;s thread with the comment that the resolution is done in that thread.&lt;br /&gt;
&lt;br /&gt;
==== Acknowledge the incident on Zabbix ====&lt;br /&gt;
The first step is to take responsibility for seeing the incident resolved by acknowledging the incident on Zabbix. Simply acknowledging the trigger suffices. It is however entirely possible that multiple critical incidents are firing at the same time. This can be a coincidence, or can be because of a share cause of failure. For example, a server crashing will cause server VMs to reboot, or the router having an connectivity issue will lead to most other VMs having connectivity issues as well. If there are multiple critical incidents, it is advised to quickly observe what&#039;s ongoing, Zabbix is the best source of firing triggers for this, and pick the incident that is likely the root cause to  &lt;br /&gt;
&lt;br /&gt;
* Acknowledging an incident on Zabbix will stop Zabbix from calling the First Responder to notify them of the ongoing incident. And stops Zabbix from posting reminders on Zulip.&lt;br /&gt;
&lt;br /&gt;
==== Determine if incident is still ongoing ====&lt;br /&gt;
The next step is to check if the reported problem is still ongoing. Depending on the observations made here your process to follow and steps needed to resolve the incident can change. There are three options:&lt;br /&gt;
# The trigger resolved itself and the problem cannot be observed. Example: HTTPS is down for a site, but the FR can access the site through HTTPS without incident.&lt;br /&gt;
# The trigger resolved itself and the problem can still be observed.&lt;br /&gt;
# The trigger is still firing but the problem cannot be observed: Our triggers might not be perfect, so it could be that something else is causing it to fire. A simple example would be that Zabbix reports that the the DNS for a site can&#039;t be resolved, but in reality there&#039;s a bug in the script we wrote that checks if the DNS resolves and the DNS resolves fine. Final note: keep in mind that an &#039;it works on my machine&#039; does not necessarily mean it works for most other people, so depening on the trigger you need to do some evaluations if your tests suffice. &lt;br /&gt;
&lt;br /&gt;
In order to make sure you are actually trying to observe the same thing as the trigger is looking for, make sure to check the trigger definition and the current data of the associated item(s). Some triggers might fire if one of multiple conditions is met (Such as a trigger that monitors the ping response time firing if the value exceeds a certain threshold, or if no data for a certain period of time was observed).&lt;br /&gt;
&lt;br /&gt;
Make sure to report your findings in the incident&#039;s thread. It&#039;s advised to post a screenshot of the relevant item(s) and your own observations. (Continuing the ping example, you would post a screenshot of the relevant values, state your conclusion why the trigger is firing, and your own observations/pings)&lt;br /&gt;
&lt;br /&gt;
==== Communicate to affected clients ====&lt;br /&gt;
If the incident is still ongoing and the service is down, we need to communicate to affected clients that we are aware of the problem and that we are investigating it. This is because critical incident usually mean the service is down, something the clients can notice/are affected by, so we to be transparent that something is going on. There are some additional notes to this though:&lt;br /&gt;
* If an incident has already resolved itself and the problem is no longer observable, we don&#039;t communicate anything. Doing so might only cause confusion, and since the client has not reported any issues, they have not had a noticeable problem with it themselves.&lt;br /&gt;
* Although a critical incident generally means that the client service is down or experiencing reduced service, not all critical incidents are of that nature. Some are more administrative, or are only an issue for Delft Solutions itself. As of writing I don&#039;t have an exhaustive list, but here is those I can think of:&lt;br /&gt;
** SSH Service is down: We don&#039;t have any clients that SSH into their services, so it&#039;s generally not a problem. But SSH is mostly used for SRE maintenance and publishing new builds. The SRE maintenance is an internal problem, so no need to communicate to the client. The publishing is done to Kaboom, preventing new builds from being published, and the two SM VMs.&lt;br /&gt;
** No backup for x days: Clients don&#039;t notice it if a backup is running late, so no need to communicate with clients. Just need to make sure the backup gets completed&lt;br /&gt;
** SSL certificate is expiring in &amp;lt; 24 hours: This is a bit dependent on how soon this incident is being handled, but if it handled quickly, the certificate never actually expired, and there has not been any disruption to the client&#039;s service, so no need for communicating about it.&lt;br /&gt;
* Determining which clients are being affected can be done by looking at the host&#039;s DNS in the trigger, and/or looking up the VM in Proxmox and checking the tags of the VMs for client names. In the case that this issue is causing multiple other critical triggers to fire, you would have to check for which clients are affected by those incidents.&lt;br /&gt;
* Communicating to DS about ongoing incidents is usually assumed to be automatically have been done by the fact that the incident was reported on Zulip.&lt;br /&gt;
&lt;br /&gt;
As always, report the decisions taken and actions made in the incident thread. (e.g.: I&#039;ve sent a message in the Slack to let Kaboom know that we aware of problem x, and that we are investigating it)&lt;br /&gt;
&lt;br /&gt;
==== Communicate plan/next steps + Communicate findings/results of executed plan ====&lt;br /&gt;
This is the main part of handling an incident. There are several actions you can take in these steps, but at the basis they consist of sharing your next steps, performing those, and reporting the results. The reason all this needs to be reported is to ensure that all known information about a problem is logged, making it easier for someone else to be onboarded into the issue, for later reference if a similar issue is encountered, and even for use during the incident itself in case an older configuration needs to be referenced after you changed it.&lt;br /&gt;
The objective from these steps is determining what is actually wrong and how to resolve it. Depending on the observations made earlier on whether the incident is still ongoing and is (still) observable your investigation can go into different directions. (e.g. Find the underlying cause for a trigger, or determining why the trigger is firing while it likely shouldn&#039;t, and then how to resolve that underlying cause or how to update the trigger to work better)&lt;br /&gt;
&lt;br /&gt;
There are three main types of steps defined, but you are not limited to these:&lt;br /&gt;
# Hypothesis: If you have an idea what could be causing it, you would state your hypothesis and your next step would be to prove that hypothesis. For example, for an incident &#039;SSH service is down on X&#039; your hypothesis could be that this is due to &#039;MaxStartups&#039; throttling, which can be proven by &#039;grep&#039;ing journalctl for that, and compare the start and end times of throttling with the timestamps of the item reporting the status of the SSH service.&lt;br /&gt;
# Information gathering: Sometimes it just helps to get some facts about the situation collected. What is usefull information that is relevant depends on the triggers, but some examples are: The syslog/journalctl of the host from around the time of the incident (it can contain a reference to the an underlying problem in various levels of explicitness), the ping response from several hosts on the route to a host or a traceroute (this helps with networking issues). The gathered information is usually intended to help you come up with an hypothesis on what&#039;s wrong.&lt;br /&gt;
# Investigative: The most rigorous of process. The full process is described here originally [https://docs.google.com/document/d/1AQYJM1Q9l2Tyk6zfCVaQ2aEq-dpbfUH5okE88bpKkhw/edit#heading=h.5fq2skijqbdc Drive - Final Coundown - General Investigative Process]. To summarize, when you don&#039;t know why something is failing, and/or don&#039;t have any decent hypotheses to follow up, you can follow this process to systematically find the problem.&lt;br /&gt;
&lt;br /&gt;
Regarding the resolution to an incident: The resolution to any incident is usually one of two things:&lt;br /&gt;
# Fix the underlying problem.&lt;br /&gt;
# Fix the trigger itself.&lt;br /&gt;
Fixing the trigger is relatively straightforward, but do make sure document in the thread what you changed to which trigger.&lt;br /&gt;
Fixing the underlying problem can be more complex. A trade-off needs to be made sometimes between resolving technical debt, or simply patching the current system to resolve the issue. We usually look for a resolution that ensures that the problem won&#039;t re-occur soon, or makes it unexpected/unlikely for the problem to re-occur. Taking into account the time frame that is available to resolve the incident you can make some trade-offs. An example would be: normal backups of VMs are failing due to the Proxmox backup server being down/unreachable and it is determined that this cannot be resolved at that moment. We can set up automatic backups to local storage temporary to resolve the immediate problem and ensure we keep our SLO&#039;s versus setting up a new Proxmox Backup server at a different location. Since we don&#039;t have much time to resolve the problem, the resolution would be to set up the automatic backups to local storage, and set up a new Proxmox Backup Server later as a seperate issue.&lt;br /&gt;
&lt;br /&gt;
===== Some known issues and their resolutions =====&lt;br /&gt;
* SSH service is down: The internet is a vile place. There&#039;s constant port scanning and hacking attempts ongoing to any machine connected to the internet (mostly IPv4). Due to this, SSH has a throttling functionality build in to prevent a system from being DDOS&#039;ed by the amount of malicious SSH requests. This throttling can cause the Zabbix server from being denied an SSH connection, of which several failures fire this trigger. This hypothesis can be proven with a `journalctl -u ssh | grep &#039;MaxStartups throttling&#039;` (you probably want to select a relevant time period with `--since &amp;quot;2 hours ago&amp;quot;` or something similar to prevent having to process a month of logging). You can then compare the throttling start and end times with the timestamps of the item data itself. The resolution for the issue is to add our custom ssh configuration [https://chat.dsinternal.net/#narrow/stream/23-SRE---General/topic/DS.20Whitelisted.20Custom.20SSH.20configuration/near/1620 Custom SSH Configuration].&lt;br /&gt;
* No backup for 3 days: Are S3 backup is very slow. Not much to prove as an underlying issue here. What needs to be done is check that the backup process is ongoing. The Zabbix latest data can be checked to verify that backups are running by checking that that days backups were done for the smaller buckets. The devteam email can be checked for if the backup process could not start on day due to it already running (it takes 24+ hours, and an attempt to start it is done each day by cron).&lt;br /&gt;
* git.* HTTPS is down: On Sunday mostly, Gitlab gets automatically updated, but this incurs some downtime as the service is restarted. This is usually short enough to not be reported to Zulip as per our settings, but sometimes it&#039;s longer. If the service does not stay down, the issue can be just resolved.&lt;br /&gt;
&lt;br /&gt;
==== Resolve incident + cleanup ====&lt;br /&gt;
When you&#039;ve executed and verified the resolution in the previous steps we can proceed resolving the issue in our Mattermost integration. Resolving an incident can be done by doing the following:&lt;br /&gt;
# Verify that the trigger is no longer firing. An incident will be immediately re-opened if the trigger is still firing, and the incident cannot be considered resolved if the trigger is still firing. If the trigger is still firing but you&#039;re sure that you&#039;ve resolved the problem, you might need to force the item the trigger depends on to update. This can be done by finding the item in the host&#039;s configuration on Zabbix and selecting &#039;Execute Now&#039;, after a short period this should force Zabbix to re-execute the item. You can check the timestamps in the latest data of an item to check if it was updated.&lt;br /&gt;
# Close the incident by marking the topic as resolved, when there are no other triggers firing for the host.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, some problems cause multiple critical and non-critical triggers to fire. This means we have to check Zabbix and Zulip for other fired triggers and ongoing incidents. The goal is to identify critical and non-critical incidents that were caused by the incident/underlying issue you just resolved.&lt;br /&gt;
# First, these incidents need to be acknowledged on Zabbix, and in the acknowledgement message you mention the incident/problem that caused this.&lt;br /&gt;
# Next, check the incident tracked by the integration on Mattermost using the `?ongoing` command. Resolve incidents that were (re-)opened by this incident by executing the following steps. If the first two fail (problem still persists, trigger is still firing), the incident needs to considered it&#039;s own issue and the relevant process needs to be followed (critical or non-critical depending on criticality).&lt;br /&gt;
## Ensuring the mentioned problem is no longer observable&lt;br /&gt;
## The trigger has resolved (You might need to force an update with `Execute Now`).&lt;br /&gt;
## Posting a link to the main incident you resolved with the comment that the underlying problem was resolved in that topic.&lt;br /&gt;
## Closing the incident by marking the topic as resolved, when there are no other triggers firing for the host.&lt;br /&gt;
&lt;br /&gt;
When you are done, there should be no more critical triggers firing in Zabbix or open in the Zabbix-Mattermost integration, for which no-one has taken responsibility or you have taken responsibility for and are not actively handling.&lt;br /&gt;
&lt;br /&gt;
== Non-Critical incidents ==&lt;br /&gt;
Non-critical incidents are acknowledged within one working day and resolved within three weeks.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledging ===&lt;br /&gt;
Fully acknowledging a non-critical incident requires the following tasks to have been completed:&lt;br /&gt;
* Acknowledging the incident on Zabbix, which means you take responsibility of completing the steps listed below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The next steps don&#039;t have to be done immediately, as they have dependencies, but be started and scheduled for completion the next work day.&lt;br /&gt;
&lt;br /&gt;
Check if there&#039;s already a uncompleted milestone for this host with this issue in the metrics sheet.&lt;br /&gt;
If a milestone is already present:&lt;br /&gt;
* Report in the topic the Lynx project ID for resolving this issue.&lt;br /&gt;
* If the ID has already been reported in the topic, we don&#039;t want to report it again and again, instead add the 🔁 emoji (:repeat:) under the zabbix bot alert&lt;br /&gt;
&lt;br /&gt;
If a milestone is NOT already present:&lt;br /&gt;
* Add the non-critical incident as a milestone in the metrics sheet, following the naming convention&lt;br /&gt;
** Start date is the date of the incident&lt;br /&gt;
** DoD states what needs to be true for the non-critical incident to be consider resolved&lt;br /&gt;
* Add the non-critical incident to Lynx as a project&lt;br /&gt;
** Follow the naming convention below for the title &amp;amp; project ID&lt;br /&gt;
** Tasks need to be added&lt;br /&gt;
** Final tasks needs to have the SLO deadline set as &#039;constraint&#039;&lt;br /&gt;
** Project priority is set to 99 while not estimated yet. After the estimation is done, the priority should be set to 20&lt;br /&gt;
** The tasks are estimated for SP&lt;br /&gt;
* The Lynx project ID is reported in the non-critical incident&#039;s topic on Zulip, and logged in the metrics sheet&lt;br /&gt;
* A Kimai activity is created in Kimai for the non-critical incident, following the naming convetion&lt;br /&gt;
&lt;br /&gt;
==== Naming convention ====&lt;br /&gt;
* Kimai activity name needs to follow the pattern: &#039;&amp;lt;YYYY-MM&amp;gt; &amp;lt;problem_title&amp;gt;&#039;. For &amp;lt;problem_title&amp;gt;, incorporate the trigger title and hostname for clarity.&lt;br /&gt;
* Milestone name needs to follow the pattern: &#039;Delft Solutions Hosting Incident response work &amp;lt;kimai_activity_name&amp;gt;&#039;&lt;br /&gt;
* Lynx project name needs to follow the pattern: &#039;Delft Solutions Hosting Incident response work &amp;lt;kimai_activity_name&amp;gt;&#039;&lt;br /&gt;
* Lynx project ID needs to follow the pattern: &#039;SRE&amp;lt;YYMM&amp;gt;&amp;lt;XXX&amp;gt;&#039;, where &amp;lt;XXX&amp;gt; is some three letter shorthand that relates to the problem/host&lt;br /&gt;
&lt;br /&gt;
== Informational incidents ==&lt;br /&gt;
* Informational incidents are acknowledged within 72 hours&lt;br /&gt;
&lt;br /&gt;
Checklist&lt;br /&gt;
# Acknowledge on Zabbix&lt;br /&gt;
# Sanity check the event, post result in thread&lt;br /&gt;
# If action needed, perform action&lt;br /&gt;
&lt;br /&gt;
== If an incident is reported by other means than the Zabbix-Zulip integration ==&lt;br /&gt;
Besides the automated Zabbix-Zulip integration, incidents can also be reported through emails from cron jobs, direct emails from customers, or topics in SRE General (such as alerts about Zulip updates or issues raised by colleagues), etc.&lt;br /&gt;
# Acknowledge receipt.&lt;br /&gt;
# Classify the incident as critical, non-critical, or informational.&lt;br /&gt;
# Create an topic in the relevant SRE channel, stating the problem and that you is responsible for resolving it.&lt;br /&gt;
# Proceed to treat the incident according to the criticality you just classified it as. (So for a critical incident, it means you now start the critical incident handling process)&lt;br /&gt;
&lt;br /&gt;
== Handover ==&lt;br /&gt;
See [[Handover]]&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Incident_Handling&amp;diff=695</id>
		<title>Incident Handling</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Incident_Handling&amp;diff=695"/>
		<updated>2026-03-23T12:35:02Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: /* Non-Critical Incidents */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= This is the process =&lt;br /&gt;
This document is an authoritative description of the process. This document supersedes all prior documents on the process. &lt;br /&gt;
&lt;br /&gt;
= Deviating from the process =&lt;br /&gt;
You may deviate from the process at any moment. A deviation should be communicated to the dev-team, preferably in the Zulip topic about the applicable incident, as soon as possible after deciding to deviate.&lt;br /&gt;
&lt;br /&gt;
= Checklist =&lt;br /&gt;
This checklist is a shorter, imperative version of [[Incident Handling#Full_procedure|the longer procedure below]]. You&#039;re encouraged to read the [[Incident Handling#Full_procedure|full procedure]] at least once to improve your understanding of the core material.&lt;br /&gt;
&lt;br /&gt;
=== Critical Incidents ===&lt;br /&gt;
Critical incidents must be resolved within 16 hours. &lt;br /&gt;
&lt;br /&gt;
# Acknowledge trigger in Zabbix.&lt;br /&gt;
# Check if the incident is still ongoing.&lt;br /&gt;
# Determine whether the incident is ongoing&lt;br /&gt;
# If this report came in via SRE - Report:&lt;br /&gt;
## keep that thread open until the incident is resolved&lt;br /&gt;
## post a link to the SRE - Report thread to any underlying technical threads in SRE # Critical, SRE ## Non-critical, or SRE ### Informational that is related&lt;br /&gt;
# Determine whether clients are potentially affected, if so:&lt;br /&gt;
## notify the affected clients (Slack preferred if available)&lt;br /&gt;
## share the message sent to the client in the incident Zulip thread&lt;br /&gt;
# Document all actions taken in the Zulip topic.&lt;br /&gt;
# Create a plan of action.&lt;br /&gt;
# Execute plan and document results in Zabbix thread. &lt;br /&gt;
# If unresolved, create a new plan.&lt;br /&gt;
# When resolved:&lt;br /&gt;
## Verify trigger is no longer firing.&lt;br /&gt;
## Decide on when to notify affected clients (that you have notified of the incident), the incident has been resolved, and communicate this internally&lt;br /&gt;
## Mark Zulip topic as resolved if no other incidents for the host.&lt;br /&gt;
## Check for related triggers and resolve them.&lt;br /&gt;
## If there were any SRE - Report threads:&lt;br /&gt;
### post a summary describing the high-level incident, that it is resolved, and how it was resolved. &lt;br /&gt;
### post that summary message to any client channels such as Slack too. &lt;br /&gt;
### close the thread in SRE - Report&lt;br /&gt;
&lt;br /&gt;
Note: we do not accept discussions on the how or why of incident response in the SRE - Report channel; those should be redirected to either Retro or Organisational channels. The only reason to reopen a thread in SRE - Report should be to report that there&#039;s still impact and the incident has been resolved prematurely. &lt;br /&gt;
&lt;br /&gt;
=== Non-Critical Incidents ===&lt;br /&gt;
Non-critical incidents must be acknowledged within one working day and resolved within 3 weeks. &lt;br /&gt;
&lt;br /&gt;
# Acknowledge in Zabbix thread&lt;br /&gt;
# Check metrics sheet for existing milestone&lt;br /&gt;
## If a milestone exists:&lt;br /&gt;
### Add Lynx project ID to Zulip topic&lt;br /&gt;
### Add 🔁 emoji if ID already reported&lt;br /&gt;
## If no milestone exists:&lt;br /&gt;
### Add to metrics sheet&lt;br /&gt;
### Create Lynx project (priority 99, then 20 after estimation)&lt;br /&gt;
### Create Kimai activity&lt;br /&gt;
### Document IDs in Zulip topic&lt;br /&gt;
&lt;br /&gt;
=== Informational Incidents ===&lt;br /&gt;
Informational incidents must be acknowledged within 72 hours.&lt;br /&gt;
&lt;br /&gt;
# Acknowledge in Zabbix&lt;br /&gt;
# Verify issue&lt;br /&gt;
# Take action if needed&lt;br /&gt;
&lt;br /&gt;
=== External Reports ===&lt;br /&gt;
&lt;br /&gt;
# Acknowledge receipt&lt;br /&gt;
# Classify report as critical, non-critical or informational. &lt;br /&gt;
# Create a Zulip topic in SRE # Critical, SRE ## Non-critical or SRE ### Informational (depending on classification) and add sufficient details. &lt;br /&gt;
# Proceed with checklist above for the type of incident.&lt;br /&gt;
&lt;br /&gt;
= Full procedure =&lt;br /&gt;
&lt;br /&gt;
== General Rules ==&lt;br /&gt;
&lt;br /&gt;
# When an incident is in progress, and person A is handling it, then all incidents in area X, are handled by person A, rather than the FR. Unless working day ends. Person A should communicate clearly to FR when their day is over.&lt;br /&gt;
# FR always has the last word on what solution to apply for resolving an incident.&lt;br /&gt;
&lt;br /&gt;
== Critical incidents ==&lt;br /&gt;
&#039;&#039;&#039;Critical incidents are resolved within 16 hours.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
As first responder you take on the responsiblity of seeing an incident resolved. This does not mean that you are the person required to do all the work. You can attempt to involve others to help you (often referred to as escalating the incident), but since other are not on-call, they are not obliged to help you, especially outside of normal working hours.&lt;br /&gt;
Involving multiple people can quickly be required if multiple critical incidents with different causes occur simultaneously. In that case, the First Responder usually takes on a more information management role and steers those that are brought on into resolving the issues. (Example: if a server crashes, several critical triggers can fire, but the underlying cause can quite quickly be determined to be a single issue, the crashed server. So you wouldn&#039;t need to call in people to manage each incident. But a client&#039;s service being down in one cluster while in a different cluster a different VM no longer boots is likely to be to different issues, so in order to resolve them on time you&#039;d want to call in help to resolve the incident in time).&lt;br /&gt;
&lt;br /&gt;
=== Process ===&lt;br /&gt;
The general process is made up of the following steps. Each step has additional information on how to handle/execute them in the sections below.&lt;br /&gt;
# Take responsibility for seeing the incident resolved&lt;br /&gt;
# Determine if incident is still ongoing&lt;br /&gt;
# If ongoing: Communicate to affected clients that the issue is being investigated&lt;br /&gt;
# Communicate plan/next steps (even if that is gathering information)&lt;br /&gt;
# Communicate findings/results of executed plan, go back to previous step if not resolved&lt;br /&gt;
# Resolve incident + cleanup&lt;br /&gt;
&lt;br /&gt;
During working on an incident it is expected that all communication is done in the incident&#039;s thread. This means all information to a problem can be found in a clear a predictable place. Sometimes an incident can be resolved by work done in another incident. In that case, it is required to post a link to that thread in the incident&#039;s thread with the comment that the resolution is done in that thread.&lt;br /&gt;
&lt;br /&gt;
==== Acknowledge the incident on Zabbix ====&lt;br /&gt;
The first step is to take responsibility for seeing the incident resolved by acknowledging the incident on Zabbix. Simply acknowledging the trigger suffices. It is however entirely possible that multiple critical incidents are firing at the same time. This can be a coincidence, or can be because of a share cause of failure. For example, a server crashing will cause server VMs to reboot, or the router having an connectivity issue will lead to most other VMs having connectivity issues as well. If there are multiple critical incidents, it is advised to quickly observe what&#039;s ongoing, Zabbix is the best source of firing triggers for this, and pick the incident that is likely the root cause to  &lt;br /&gt;
&lt;br /&gt;
* Acknowledging an incident on Zabbix will stop Zabbix from calling the First Responder to notify them of the ongoing incident. And stops Zabbix from posting reminders on Zulip.&lt;br /&gt;
&lt;br /&gt;
==== Determine if incident is still ongoing ====&lt;br /&gt;
The next step is to check if the reported problem is still ongoing. Depending on the observations made here your process to follow and steps needed to resolve the incident can change. There are three options:&lt;br /&gt;
# The trigger resolved itself and the problem cannot be observed. Example: HTTPS is down for a site, but the FR can access the site through HTTPS without incident.&lt;br /&gt;
# The trigger resolved itself and the problem can still be observed.&lt;br /&gt;
# The trigger is still firing but the problem cannot be observed: Our triggers might not be perfect, so it could be that something else is causing it to fire. A simple example would be that Zabbix reports that the the DNS for a site can&#039;t be resolved, but in reality there&#039;s a bug in the script we wrote that checks if the DNS resolves and the DNS resolves fine. Final note: keep in mind that an &#039;it works on my machine&#039; does not necessarily mean it works for most other people, so depening on the trigger you need to do some evaluations if your tests suffice. &lt;br /&gt;
&lt;br /&gt;
In order to make sure you are actually trying to observe the same thing as the trigger is looking for, make sure to check the trigger definition and the current data of the associated item(s). Some triggers might fire if one of multiple conditions is met (Such as a trigger that monitors the ping response time firing if the value exceeds a certain threshold, or if no data for a certain period of time was observed).&lt;br /&gt;
&lt;br /&gt;
Make sure to report your findings in the incident&#039;s thread. It&#039;s advised to post a screenshot of the relevant item(s) and your own observations. (Continuing the ping example, you would post a screenshot of the relevant values, state your conclusion why the trigger is firing, and your own observations/pings)&lt;br /&gt;
&lt;br /&gt;
==== Communicate to affected clients ====&lt;br /&gt;
If the incident is still ongoing and the service is down, we need to communicate to affected clients that we are aware of the problem and that we are investigating it. This is because critical incident usually mean the service is down, something the clients can notice/are affected by, so we to be transparent that something is going on. There are some additional notes to this though:&lt;br /&gt;
* If an incident has already resolved itself and the problem is no longer observable, we don&#039;t communicate anything. Doing so might only cause confusion, and since the client has not reported any issues, they have not had a noticeable problem with it themselves.&lt;br /&gt;
* Although a critical incident generally means that the client service is down or experiencing reduced service, not all critical incidents are of that nature. Some are more administrative, or are only an issue for Delft Solutions itself. As of writing I don&#039;t have an exhaustive list, but here is those I can think of:&lt;br /&gt;
** SSH Service is down: We don&#039;t have any clients that SSH into their services, so it&#039;s generally not a problem. But SSH is mostly used for SRE maintenance and publishing new builds. The SRE maintenance is an internal problem, so no need to communicate to the client. The publishing is done to Kaboom, preventing new builds from being published, and the two SM VMs.&lt;br /&gt;
** No backup for x days: Clients don&#039;t notice it if a backup is running late, so no need to communicate with clients. Just need to make sure the backup gets completed&lt;br /&gt;
** SSL certificate is expiring in &amp;lt; 24 hours: This is a bit dependent on how soon this incident is being handled, but if it handled quickly, the certificate never actually expired, and there has not been any disruption to the client&#039;s service, so no need for communicating about it.&lt;br /&gt;
* Determining which clients are being affected can be done by looking at the host&#039;s DNS in the trigger, and/or looking up the VM in Proxmox and checking the tags of the VMs for client names. In the case that this issue is causing multiple other critical triggers to fire, you would have to check for which clients are affected by those incidents.&lt;br /&gt;
* Communicating to DS about ongoing incidents is usually assumed to be automatically have been done by the fact that the incident was reported on Zulip.&lt;br /&gt;
&lt;br /&gt;
As always, report the decisions taken and actions made in the incident thread. (e.g.: I&#039;ve sent a message in the Slack to let Kaboom know that we aware of problem x, and that we are investigating it)&lt;br /&gt;
&lt;br /&gt;
==== Communicate plan/next steps + Communicate findings/results of executed plan ====&lt;br /&gt;
This is the main part of handling an incident. There are several actions you can take in these steps, but at the basis they consist of sharing your next steps, performing those, and reporting the results. The reason all this needs to be reported is to ensure that all known information about a problem is logged, making it easier for someone else to be onboarded into the issue, for later reference if a similar issue is encountered, and even for use during the incident itself in case an older configuration needs to be referenced after you changed it.&lt;br /&gt;
The objective from these steps is determining what is actually wrong and how to resolve it. Depending on the observations made earlier on whether the incident is still ongoing and is (still) observable your investigation can go into different directions. (e.g. Find the underlying cause for a trigger, or determining why the trigger is firing while it likely shouldn&#039;t, and then how to resolve that underlying cause or how to update the trigger to work better)&lt;br /&gt;
&lt;br /&gt;
There are three main types of steps defined, but you are not limited to these:&lt;br /&gt;
# Hypothesis: If you have an idea what could be causing it, you would state your hypothesis and your next step would be to prove that hypothesis. For example, for an incident &#039;SSH service is down on X&#039; your hypothesis could be that this is due to &#039;MaxStartups&#039; throttling, which can be proven by &#039;grep&#039;ing journalctl for that, and compare the start and end times of throttling with the timestamps of the item reporting the status of the SSH service.&lt;br /&gt;
# Information gathering: Sometimes it just helps to get some facts about the situation collected. What is usefull information that is relevant depends on the triggers, but some examples are: The syslog/journalctl of the host from around the time of the incident (it can contain a reference to the an underlying problem in various levels of explicitness), the ping response from several hosts on the route to a host or a traceroute (this helps with networking issues). The gathered information is usually intended to help you come up with an hypothesis on what&#039;s wrong.&lt;br /&gt;
# Investigative: The most rigorous of process. The full process is described here originally [https://docs.google.com/document/d/1AQYJM1Q9l2Tyk6zfCVaQ2aEq-dpbfUH5okE88bpKkhw/edit#heading=h.5fq2skijqbdc Drive - Final Coundown - General Investigative Process]. To summarize, when you don&#039;t know why something is failing, and/or don&#039;t have any decent hypotheses to follow up, you can follow this process to systematically find the problem.&lt;br /&gt;
&lt;br /&gt;
Regarding the resolution to an incident: The resolution to any incident is usually one of two things:&lt;br /&gt;
# Fix the underlying problem.&lt;br /&gt;
# Fix the trigger itself.&lt;br /&gt;
Fixing the trigger is relatively straightforward, but do make sure document in the thread what you changed to which trigger.&lt;br /&gt;
Fixing the underlying problem can be more complex. A trade-off needs to be made sometimes between resolving technical debt, or simply patching the current system to resolve the issue. We usually look for a resolution that ensures that the problem won&#039;t re-occur soon, or makes it unexpected/unlikely for the problem to re-occur. Taking into account the time frame that is available to resolve the incident you can make some trade-offs. An example would be: normal backups of VMs are failing due to the Proxmox backup server being down/unreachable and it is determined that this cannot be resolved at that moment. We can set up automatic backups to local storage temporary to resolve the immediate problem and ensure we keep our SLO&#039;s versus setting up a new Proxmox Backup server at a different location. Since we don&#039;t have much time to resolve the problem, the resolution would be to set up the automatic backups to local storage, and set up a new Proxmox Backup Server later as a seperate issue.&lt;br /&gt;
&lt;br /&gt;
===== Some known issues and their resolutions =====&lt;br /&gt;
* SSH service is down: The internet is a vile place. There&#039;s constant port scanning and hacking attempts ongoing to any machine connected to the internet (mostly IPv4). Due to this, SSH has a throttling functionality build in to prevent a system from being DDOS&#039;ed by the amount of malicious SSH requests. This throttling can cause the Zabbix server from being denied an SSH connection, of which several failures fire this trigger. This hypothesis can be proven with a `journalctl -u ssh | grep &#039;MaxStartups throttling&#039;` (you probably want to select a relevant time period with `--since &amp;quot;2 hours ago&amp;quot;` or something similar to prevent having to process a month of logging). You can then compare the throttling start and end times with the timestamps of the item data itself. The resolution for the issue is to add our custom ssh configuration [https://chat.dsinternal.net/#narrow/stream/23-SRE---General/topic/DS.20Whitelisted.20Custom.20SSH.20configuration/near/1620 Custom SSH Configuration].&lt;br /&gt;
* No backup for 3 days: Are S3 backup is very slow. Not much to prove as an underlying issue here. What needs to be done is check that the backup process is ongoing. The Zabbix latest data can be checked to verify that backups are running by checking that that days backups were done for the smaller buckets. The devteam email can be checked for if the backup process could not start on day due to it already running (it takes 24+ hours, and an attempt to start it is done each day by cron).&lt;br /&gt;
* git.* HTTPS is down: On Sunday mostly, Gitlab gets automatically updated, but this incurs some downtime as the service is restarted. This is usually short enough to not be reported to Zulip as per our settings, but sometimes it&#039;s longer. If the service does not stay down, the issue can be just resolved.&lt;br /&gt;
&lt;br /&gt;
==== Resolve incident + cleanup ====&lt;br /&gt;
When you&#039;ve executed and verified the resolution in the previous steps we can proceed resolving the issue in our Mattermost integration. Resolving an incident can be done by doing the following:&lt;br /&gt;
# Verify that the trigger is no longer firing. An incident will be immediately re-opened if the trigger is still firing, and the incident cannot be considered resolved if the trigger is still firing. If the trigger is still firing but you&#039;re sure that you&#039;ve resolved the problem, you might need to force the item the trigger depends on to update. This can be done by finding the item in the host&#039;s configuration on Zabbix and selecting &#039;Execute Now&#039;, after a short period this should force Zabbix to re-execute the item. You can check the timestamps in the latest data of an item to check if it was updated.&lt;br /&gt;
# Close the incident by marking the topic as resolved, when there are no other triggers firing for the host.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, some problems cause multiple critical and non-critical triggers to fire. This means we have to check Zabbix and Zulip for other fired triggers and ongoing incidents. The goal is to identify critical and non-critical incidents that were caused by the incident/underlying issue you just resolved.&lt;br /&gt;
# First, these incidents need to be acknowledged on Zabbix, and in the acknowledgement message you mention the incident/problem that caused this.&lt;br /&gt;
# Next, check the incident tracked by the integration on Mattermost using the `?ongoing` command. Resolve incidents that were (re-)opened by this incident by executing the following steps. If the first two fail (problem still persists, trigger is still firing), the incident needs to considered it&#039;s own issue and the relevant process needs to be followed (critical or non-critical depending on criticality).&lt;br /&gt;
## Ensuring the mentioned problem is no longer observable&lt;br /&gt;
## The trigger has resolved (You might need to force an update with `Execute Now`).&lt;br /&gt;
## Posting a link to the main incident you resolved with the comment that the underlying problem was resolved in that topic.&lt;br /&gt;
## Closing the incident by marking the topic as resolved, when there are no other triggers firing for the host.&lt;br /&gt;
&lt;br /&gt;
When you are done, there should be no more critical triggers firing in Zabbix or open in the Zabbix-Mattermost integration, for which no-one has taken responsibility or you have taken responsibility for and are not actively handling.&lt;br /&gt;
&lt;br /&gt;
== Non-Critical incidents ==&lt;br /&gt;
* Non-critical incidents are acknowledged within 9 hours and resolved within one week.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledging ===&lt;br /&gt;
Fully acknowledging a non-critical incident requires the following tasks to have been completed:&lt;br /&gt;
* Acknowledging the incident on Zabbix, which means you take responsibility of completing the steps listed below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The next steps don&#039;t have to be done immediately, as they have dependencies, but be started and scheduled for completion the next work day.&lt;br /&gt;
&lt;br /&gt;
Check if there&#039;s already a uncompleted milestone for this host with this issue in the metrics sheet.&lt;br /&gt;
If a milestone is already present:&lt;br /&gt;
* Report in the topic the Lynx project ID for resolving this issue.&lt;br /&gt;
* If the ID has already been reported in the topic, we don&#039;t want to report it again and again, instead add the 🔁 emoji (:repeat:) under the zabbix bot alert&lt;br /&gt;
&lt;br /&gt;
If a milestone is NOT already present:&lt;br /&gt;
* Add the non-critical incident as a milestone in the metrics sheet, following the naming convention&lt;br /&gt;
** Start date is the date of the incident&lt;br /&gt;
** DoD states what needs to be true for the non-critical incident to be consider resolved&lt;br /&gt;
* Add the non-critical incident to Lynx as a project&lt;br /&gt;
** Follow the naming convention below for the title &amp;amp; project ID&lt;br /&gt;
** Tasks need to be added&lt;br /&gt;
** Final tasks needs to have the SLO deadline set as &#039;constraint&#039;&lt;br /&gt;
** Project priority is set to 99 while not estimated yet. After the estimation is done, the priority should be set to 20&lt;br /&gt;
** The tasks are estimated for SP&lt;br /&gt;
* The Lynx project ID is reported in the non-critical incident&#039;s topic on Zulip, and logged in the metrics sheet&lt;br /&gt;
* A Kimai activity is created in Kimai for the non-critical incident, following the naming convetion&lt;br /&gt;
&lt;br /&gt;
==== Naming convention ====&lt;br /&gt;
* Kimai activity name needs to follow the pattern: &#039;&amp;lt;YYYY-MM&amp;gt; &amp;lt;problem_title&amp;gt;&#039;. For &amp;lt;problem_title&amp;gt;, incorporate the trigger title and hostname for clarity.&lt;br /&gt;
* Milestone name needs to follow the pattern: &#039;Delft Solutions Hosting Incident response work &amp;lt;kimai_activity_name&amp;gt;&#039;&lt;br /&gt;
* Lynx project name needs to follow the pattern: &#039;Delft Solutions Hosting Incident response work &amp;lt;kimai_activity_name&amp;gt;&#039;&lt;br /&gt;
* Lynx project ID needs to follow the pattern: &#039;SRE&amp;lt;YYMM&amp;gt;&amp;lt;XXX&amp;gt;&#039;, where &amp;lt;XXX&amp;gt; is some three letter shorthand that relates to the problem/host&lt;br /&gt;
&lt;br /&gt;
== Informational incidents ==&lt;br /&gt;
* Informational incidents are acknowledged within 72 hours&lt;br /&gt;
&lt;br /&gt;
Checklist&lt;br /&gt;
# Acknowledge on Zabbix&lt;br /&gt;
# Sanity check the event, post result in thread&lt;br /&gt;
# If action needed, perform action&lt;br /&gt;
&lt;br /&gt;
== If an incident is reported by other means than the Zabbix-Zulip integration ==&lt;br /&gt;
Besides the automated Zabbix-Zulip integration, incidents can also be reported through emails from cron jobs, direct emails from customers, or topics in SRE General (such as alerts about Zulip updates or issues raised by colleagues), etc.&lt;br /&gt;
# Acknowledge receipt.&lt;br /&gt;
# Classify the incident as critical, non-critical, or informational.&lt;br /&gt;
# Create an topic in the relevant SRE channel, stating the problem and that you is responsible for resolving it.&lt;br /&gt;
# Proceed to treat the incident according to the criticality you just classified it as. (So for a critical incident, it means you now start the critical incident handling process)&lt;br /&gt;
&lt;br /&gt;
== Handover ==&lt;br /&gt;
See [[Handover]]&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Incident_Handling&amp;diff=690</id>
		<title>Incident Handling</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Incident_Handling&amp;diff=690"/>
		<updated>2026-01-12T14:57:55Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: /* Checklist */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= This is the process =&lt;br /&gt;
This document is an authoritative description of the process. This document supersedes all prior documents on the process. &lt;br /&gt;
&lt;br /&gt;
= Deviating from the process =&lt;br /&gt;
You may deviate from the process at any moment. A deviation should be communicated to the dev-team, preferably in the Zulip topic about the applicable incident, as soon as possible after deciding to deviate.&lt;br /&gt;
&lt;br /&gt;
= Checklist =&lt;br /&gt;
This checklist is a shorter, imperative version of [[Incident Handling#Full_procedure|the longer procedure below]]. You&#039;re encouraged to read the [[Incident Handling#Full_procedure|full procedure]] at least once to improve your understanding of the core material.&lt;br /&gt;
&lt;br /&gt;
=== Critical Incidents ===&lt;br /&gt;
Critical incidents must be resolved within 16 hours. &lt;br /&gt;
&lt;br /&gt;
# Acknowledge trigger in Zabbix.&lt;br /&gt;
# Check if the incident is still ongoing.&lt;br /&gt;
# Determine whether the incident is ongoing&lt;br /&gt;
# If this report came in via SRE - Report:&lt;br /&gt;
## keep that thread open until the incident is resolved&lt;br /&gt;
## post a link to the SRE - Report thread to any underlying technical threads in SRE # Critical, SRE ## Non-critical, or SRE ### Informational that is related&lt;br /&gt;
# Determine whether clients are potentially affected, if so:&lt;br /&gt;
## notify the affected clients (Slack preferred if available)&lt;br /&gt;
## share the message sent to the client in the incident Zulip thread&lt;br /&gt;
# Document all actions taken in the Zulip topic.&lt;br /&gt;
# Create a plan of action.&lt;br /&gt;
# Execute plan and document results in Zabbix thread. &lt;br /&gt;
# If unresolved, create a new plan.&lt;br /&gt;
# When resolved:&lt;br /&gt;
## Verify trigger is no longer firing.&lt;br /&gt;
## Decide on when to notify affected clients (that you have notified of the incident), the incident has been resolved, and communicate this internally&lt;br /&gt;
## Mark Zulip topic as resolved if no other incidents for the host.&lt;br /&gt;
## Check for related triggers and resolve them.&lt;br /&gt;
## If there were any SRE - Report threads:&lt;br /&gt;
### post a summary describing the high-level incident, that it is resolved, and how it was resolved. &lt;br /&gt;
### post that summary message to any client channels such as Slack too. &lt;br /&gt;
### close the thread in SRE - Report&lt;br /&gt;
&lt;br /&gt;
Note: we do not accept discussions on the how or why of incident response in the SRE - Report channel; those should be redirected to either Retro or Organisational channels. The only reason to reopen a thread in SRE - Report should be to report that there&#039;s still impact and the incident has been resolved prematurely. &lt;br /&gt;
&lt;br /&gt;
=== Non-Critical Incidents ===&lt;br /&gt;
Non-critical incidents must be acknowledged within 9 hours and resolved within 1 week.&lt;br /&gt;
&lt;br /&gt;
# Acknowledge in Zabbix thread&lt;br /&gt;
# Check metrics sheet for existing milestone&lt;br /&gt;
## If a milestone exists:&lt;br /&gt;
### Add Lynx project ID to Zulip topic&lt;br /&gt;
### Add 🔁 emoji if ID already reported&lt;br /&gt;
## If no milestone exists:&lt;br /&gt;
### Add to metrics sheet&lt;br /&gt;
### Create Lynx project (priority 99, then 20 after estimation)&lt;br /&gt;
### Create Kimai activity&lt;br /&gt;
### Document IDs in Zulip topic&lt;br /&gt;
&lt;br /&gt;
=== Informational Incidents ===&lt;br /&gt;
Informational incidents must be acknowledged within 72 hours.&lt;br /&gt;
&lt;br /&gt;
# Acknowledge in Zabbix&lt;br /&gt;
# Verify issue&lt;br /&gt;
# Take action if needed&lt;br /&gt;
&lt;br /&gt;
=== External Reports ===&lt;br /&gt;
&lt;br /&gt;
# Acknowledge receipt&lt;br /&gt;
# Classify report as critical, non-critical or informational. &lt;br /&gt;
# Create a Zulip topic in SRE # Critical, SRE ## Non-critical or SRE ### Informational (depending on classification) and add sufficient details. &lt;br /&gt;
# Proceed with checklist above for the type of incident.&lt;br /&gt;
&lt;br /&gt;
= Full procedure =&lt;br /&gt;
&lt;br /&gt;
== General Rules ==&lt;br /&gt;
&lt;br /&gt;
# When an incident is in progress, and person A is handling it, then all incidents in area X, are handled by person A, rather than the FR. Unless working day ends. Person A should communicate clearly to FR when their day is over.&lt;br /&gt;
# FR always has the last word on what solution to apply for resolving an incident.&lt;br /&gt;
&lt;br /&gt;
== Critical incidents ==&lt;br /&gt;
&#039;&#039;&#039;Critical incidents are resolved within 16 hours.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
As first responder you take on the responsiblity of seeing an incident resolved. This does not mean that you are the person required to do all the work. You can attempt to involve others to help you (often referred to as escalating the incident), but since other are not on-call, they are not obliged to help you, especially outside of normal working hours.&lt;br /&gt;
Involving multiple people can quickly be required if multiple critical incidents with different causes occur simultaneously. In that case, the First Responder usually takes on a more information management role and steers those that are brought on into resolving the issues. (Example: if a server crashes, several critical triggers can fire, but the underlying cause can quite quickly be determined to be a single issue, the crashed server. So you wouldn&#039;t need to call in people to manage each incident. But a client&#039;s service being down in one cluster while in a different cluster a different VM no longer boots is likely to be to different issues, so in order to resolve them on time you&#039;d want to call in help to resolve the incident in time).&lt;br /&gt;
&lt;br /&gt;
=== Process ===&lt;br /&gt;
The general process is made up of the following steps. Each step has additional information on how to handle/execute them in the sections below.&lt;br /&gt;
# Take responsibility for seeing the incident resolved&lt;br /&gt;
# Determine if incident is still ongoing&lt;br /&gt;
# If ongoing: Communicate to affected clients that the issue is being investigated&lt;br /&gt;
# Communicate plan/next steps (even if that is gathering information)&lt;br /&gt;
# Communicate findings/results of executed plan, go back to previous step if not resolved&lt;br /&gt;
# Resolve incident + cleanup&lt;br /&gt;
&lt;br /&gt;
During working on an incident it is expected that all communication is done in the incident&#039;s thread. This means all information to a problem can be found in a clear a predictable place. Sometimes an incident can be resolved by work done in another incident. In that case, it is required to post a link to that thread in the incident&#039;s thread with the comment that the resolution is done in that thread.&lt;br /&gt;
&lt;br /&gt;
==== Acknowledge the incident on Zabbix ====&lt;br /&gt;
The first step is to take responsibility for seeing the incident resolved by acknowledging the incident on Zabbix. Simply acknowledging the trigger suffices. It is however entirely possible that multiple critical incidents are firing at the same time. This can be a coincidence, or can be because of a share cause of failure. For example, a server crashing will cause server VMs to reboot, or the router having an connectivity issue will lead to most other VMs having connectivity issues as well. If there are multiple critical incidents, it is advised to quickly observe what&#039;s ongoing, Zabbix is the best source of firing triggers for this, and pick the incident that is likely the root cause to  &lt;br /&gt;
&lt;br /&gt;
* Acknowledging an incident on Zabbix will stop Zabbix from calling the First Responder to notify them of the ongoing incident. And stops Zabbix from posting reminders on Zulip.&lt;br /&gt;
&lt;br /&gt;
==== Determine if incident is still ongoing ====&lt;br /&gt;
The next step is to check if the reported problem is still ongoing. Depending on the observations made here your process to follow and steps needed to resolve the incident can change. There are three options:&lt;br /&gt;
# The trigger resolved itself and the problem cannot be observed. Example: HTTPS is down for a site, but the FR can access the site through HTTPS without incident.&lt;br /&gt;
# The trigger resolved itself and the problem can still be observed.&lt;br /&gt;
# The trigger is still firing but the problem cannot be observed: Our triggers might not be perfect, so it could be that something else is causing it to fire. A simple example would be that Zabbix reports that the the DNS for a site can&#039;t be resolved, but in reality there&#039;s a bug in the script we wrote that checks if the DNS resolves and the DNS resolves fine. Final note: keep in mind that an &#039;it works on my machine&#039; does not necessarily mean it works for most other people, so depening on the trigger you need to do some evaluations if your tests suffice. &lt;br /&gt;
&lt;br /&gt;
In order to make sure you are actually trying to observe the same thing as the trigger is looking for, make sure to check the trigger definition and the current data of the associated item(s). Some triggers might fire if one of multiple conditions is met (Such as a trigger that monitors the ping response time firing if the value exceeds a certain threshold, or if no data for a certain period of time was observed).&lt;br /&gt;
&lt;br /&gt;
Make sure to report your findings in the incident&#039;s thread. It&#039;s advised to post a screenshot of the relevant item(s) and your own observations. (Continuing the ping example, you would post a screenshot of the relevant values, state your conclusion why the trigger is firing, and your own observations/pings)&lt;br /&gt;
&lt;br /&gt;
==== Communicate to affected clients ====&lt;br /&gt;
If the incident is still ongoing and the service is down, we need to communicate to affected clients that we are aware of the problem and that we are investigating it. This is because critical incident usually mean the service is down, something the clients can notice/are affected by, so we to be transparent that something is going on. There are some additional notes to this though:&lt;br /&gt;
* If an incident has already resolved itself and the problem is no longer observable, we don&#039;t communicate anything. Doing so might only cause confusion, and since the client has not reported any issues, they have not had a noticeable problem with it themselves.&lt;br /&gt;
* Although a critical incident generally means that the client service is down or experiencing reduced service, not all critical incidents are of that nature. Some are more administrative, or are only an issue for Delft Solutions itself. As of writing I don&#039;t have an exhaustive list, but here is those I can think of:&lt;br /&gt;
** SSH Service is down: We don&#039;t have any clients that SSH into their services, so it&#039;s generally not a problem. But SSH is mostly used for SRE maintenance and publishing new builds. The SRE maintenance is an internal problem, so no need to communicate to the client. The publishing is done to Kaboom, preventing new builds from being published, and the two SM VMs.&lt;br /&gt;
** No backup for x days: Clients don&#039;t notice it if a backup is running late, so no need to communicate with clients. Just need to make sure the backup gets completed&lt;br /&gt;
** SSL certificate is expiring in &amp;lt; 24 hours: This is a bit dependent on how soon this incident is being handled, but if it handled quickly, the certificate never actually expired, and there has not been any disruption to the client&#039;s service, so no need for communicating about it.&lt;br /&gt;
* Determining which clients are being affected can be done by looking at the host&#039;s DNS in the trigger, and/or looking up the VM in Proxmox and checking the tags of the VMs for client names. In the case that this issue is causing multiple other critical triggers to fire, you would have to check for which clients are affected by those incidents.&lt;br /&gt;
* Communicating to DS about ongoing incidents is usually assumed to be automatically have been done by the fact that the incident was reported on Zulip.&lt;br /&gt;
&lt;br /&gt;
As always, report the decisions taken and actions made in the incident thread. (e.g.: I&#039;ve sent a message in the Slack to let Kaboom know that we aware of problem x, and that we are investigating it)&lt;br /&gt;
&lt;br /&gt;
==== Communicate plan/next steps + Communicate findings/results of executed plan ====&lt;br /&gt;
This is the main part of handling an incident. There are several actions you can take in these steps, but at the basis they consist of sharing your next steps, performing those, and reporting the results. The reason all this needs to be reported is to ensure that all known information about a problem is logged, making it easier for someone else to be onboarded into the issue, for later reference if a similar issue is encountered, and even for use during the incident itself in case an older configuration needs to be referenced after you changed it.&lt;br /&gt;
The objective from these steps is determining what is actually wrong and how to resolve it. Depending on the observations made earlier on whether the incident is still ongoing and is (still) observable your investigation can go into different directions. (e.g. Find the underlying cause for a trigger, or determining why the trigger is firing while it likely shouldn&#039;t, and then how to resolve that underlying cause or how to update the trigger to work better)&lt;br /&gt;
&lt;br /&gt;
There are three main types of steps defined, but you are not limited to these:&lt;br /&gt;
# Hypothesis: If you have an idea what could be causing it, you would state your hypothesis and your next step would be to prove that hypothesis. For example, for an incident &#039;SSH service is down on X&#039; your hypothesis could be that this is due to &#039;MaxStartups&#039; throttling, which can be proven by &#039;grep&#039;ing journalctl for that, and compare the start and end times of throttling with the timestamps of the item reporting the status of the SSH service.&lt;br /&gt;
# Information gathering: Sometimes it just helps to get some facts about the situation collected. What is usefull information that is relevant depends on the triggers, but some examples are: The syslog/journalctl of the host from around the time of the incident (it can contain a reference to the an underlying problem in various levels of explicitness), the ping response from several hosts on the route to a host or a traceroute (this helps with networking issues). The gathered information is usually intended to help you come up with an hypothesis on what&#039;s wrong.&lt;br /&gt;
# Investigative: The most rigorous of process. The full process is described here originally [https://docs.google.com/document/d/1AQYJM1Q9l2Tyk6zfCVaQ2aEq-dpbfUH5okE88bpKkhw/edit#heading=h.5fq2skijqbdc Drive - Final Coundown - General Investigative Process]. To summarize, when you don&#039;t know why something is failing, and/or don&#039;t have any decent hypotheses to follow up, you can follow this process to systematically find the problem.&lt;br /&gt;
&lt;br /&gt;
Regarding the resolution to an incident: The resolution to any incident is usually one of two things:&lt;br /&gt;
# Fix the underlying problem.&lt;br /&gt;
# Fix the trigger itself.&lt;br /&gt;
Fixing the trigger is relatively straightforward, but do make sure document in the thread what you changed to which trigger.&lt;br /&gt;
Fixing the underlying problem can be more complex. A trade-off needs to be made sometimes between resolving technical debt, or simply patching the current system to resolve the issue. We usually look for a resolution that ensures that the problem won&#039;t re-occur soon, or makes it unexpected/unlikely for the problem to re-occur. Taking into account the time frame that is available to resolve the incident you can make some trade-offs. An example would be: normal backups of VMs are failing due to the Proxmox backup server being down/unreachable and it is determined that this cannot be resolved at that moment. We can set up automatic backups to local storage temporary to resolve the immediate problem and ensure we keep our SLO&#039;s versus setting up a new Proxmox Backup server at a different location. Since we don&#039;t have much time to resolve the problem, the resolution would be to set up the automatic backups to local storage, and set up a new Proxmox Backup Server later as a seperate issue.&lt;br /&gt;
&lt;br /&gt;
===== Some known issues and their resolutions =====&lt;br /&gt;
* SSH service is down: The internet is a vile place. There&#039;s constant port scanning and hacking attempts ongoing to any machine connected to the internet (mostly IPv4). Due to this, SSH has a throttling functionality build in to prevent a system from being DDOS&#039;ed by the amount of malicious SSH requests. This throttling can cause the Zabbix server from being denied an SSH connection, of which several failures fire this trigger. This hypothesis can be proven with a `journalctl -u ssh | grep &#039;MaxStartups throttling&#039;` (you probably want to select a relevant time period with `--since &amp;quot;2 hours ago&amp;quot;` or something similar to prevent having to process a month of logging). You can then compare the throttling start and end times with the timestamps of the item data itself. The resolution for the issue is to add our custom ssh configuration [https://chat.dsinternal.net/#narrow/stream/23-SRE---General/topic/DS.20Whitelisted.20Custom.20SSH.20configuration/near/1620 Custom SSH Configuration].&lt;br /&gt;
* No backup for 3 days: Are S3 backup is very slow. Not much to prove as an underlying issue here. What needs to be done is check that the backup process is ongoing. The Zabbix latest data can be checked to verify that backups are running by checking that that days backups were done for the smaller buckets. The devteam email can be checked for if the backup process could not start on day due to it already running (it takes 24+ hours, and an attempt to start it is done each day by cron).&lt;br /&gt;
* git.* HTTPS is down: On Sunday mostly, Gitlab gets automatically updated, but this incurs some downtime as the service is restarted. This is usually short enough to not be reported to Zulip as per our settings, but sometimes it&#039;s longer. If the service does not stay down, the issue can be just resolved.&lt;br /&gt;
&lt;br /&gt;
==== Resolve incident + cleanup ====&lt;br /&gt;
When you&#039;ve executed and verified the resolution in the previous steps we can proceed resolving the issue in our Mattermost integration. Resolving an incident can be done by doing the following:&lt;br /&gt;
# Verify that the trigger is no longer firing. An incident will be immediately re-opened if the trigger is still firing, and the incident cannot be considered resolved if the trigger is still firing. If the trigger is still firing but you&#039;re sure that you&#039;ve resolved the problem, you might need to force the item the trigger depends on to update. This can be done by finding the item in the host&#039;s configuration on Zabbix and selecting &#039;Execute Now&#039;, after a short period this should force Zabbix to re-execute the item. You can check the timestamps in the latest data of an item to check if it was updated.&lt;br /&gt;
# Close the incident by marking the topic as resolved, when there are no other triggers firing for the host.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, some problems cause multiple critical and non-critical triggers to fire. This means we have to check Zabbix and Zulip for other fired triggers and ongoing incidents. The goal is to identify critical and non-critical incidents that were caused by the incident/underlying issue you just resolved.&lt;br /&gt;
# First, these incidents need to be acknowledged on Zabbix, and in the acknowledgement message you mention the incident/problem that caused this.&lt;br /&gt;
# Next, check the incident tracked by the integration on Mattermost using the `?ongoing` command. Resolve incidents that were (re-)opened by this incident by executing the following steps. If the first two fail (problem still persists, trigger is still firing), the incident needs to considered it&#039;s own issue and the relevant process needs to be followed (critical or non-critical depending on criticality).&lt;br /&gt;
## Ensuring the mentioned problem is no longer observable&lt;br /&gt;
## The trigger has resolved (You might need to force an update with `Execute Now`).&lt;br /&gt;
## Posting a link to the main incident you resolved with the comment that the underlying problem was resolved in that topic.&lt;br /&gt;
## Closing the incident by marking the topic as resolved, when there are no other triggers firing for the host.&lt;br /&gt;
&lt;br /&gt;
When you are done, there should be no more critical triggers firing in Zabbix or open in the Zabbix-Mattermost integration, for which no-one has taken responsibility or you have taken responsibility for and are not actively handling.&lt;br /&gt;
&lt;br /&gt;
== Non-Critical incidents ==&lt;br /&gt;
* Non-critical incidents are acknowledged within 9 hours and resolved within one week.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledging ===&lt;br /&gt;
Fully acknowledging a non-critical incident requires the following tasks to have been completed:&lt;br /&gt;
* Acknowledging the incident on Zabbix, which means you take responsibility of completing the steps listed below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The next steps don&#039;t have to be done immediately, as they have dependencies, but be started and scheduled for completion the next work day.&lt;br /&gt;
&lt;br /&gt;
Check if there&#039;s already a uncompleted milestone for this host with this issue in the metrics sheet.&lt;br /&gt;
If a milestone is already present:&lt;br /&gt;
* Report in the topic the Lynx project ID for resolving this issue.&lt;br /&gt;
* If the ID has already been reported in the topic, we don&#039;t want to report it again and again, instead add the 🔁 emoji (:repeat:) under the zabbix bot alert&lt;br /&gt;
&lt;br /&gt;
If a milestone is NOT already present:&lt;br /&gt;
* Add the non-critical incident as a milestone in the metrics sheet, following the naming convention&lt;br /&gt;
** Start date is the date of the incident&lt;br /&gt;
** DoD states what needs to be true for the non-critical incident to be consider resolved&lt;br /&gt;
* Add the non-critical incident to Lynx as a project&lt;br /&gt;
** Follow the naming convention below for the title &amp;amp; project ID&lt;br /&gt;
** Tasks need to be added&lt;br /&gt;
** Final tasks needs to have the SLO deadline set as &#039;constraint&#039;&lt;br /&gt;
** Project priority is set to 99 while not estimated yet. After the estimation is done, the priority should be set to 20&lt;br /&gt;
** The tasks are estimated for SP&lt;br /&gt;
* The Lynx project ID is reported in the non-critical incident&#039;s topic on Zulip, and logged in the metrics sheet&lt;br /&gt;
* A Kimai activity is created in Kimai for the non-critical incident, following the naming convetion&lt;br /&gt;
&lt;br /&gt;
==== Naming convention ====&lt;br /&gt;
* Kimai activity name needs to follow the pattern: &#039;&amp;lt;YYYY-MM&amp;gt; &amp;lt;problem_title&amp;gt;&#039;. For &amp;lt;problem_title&amp;gt;, incorporate the trigger title and hostname for clarity.&lt;br /&gt;
* Milestone name needs to follow the pattern: &#039;Delft Solutions Hosting Incident response work &amp;lt;kimai_activity_name&amp;gt;&#039;&lt;br /&gt;
* Lynx project name needs to follow the pattern: &#039;Delft Solutions Hosting Incident response work &amp;lt;kimai_activity_name&amp;gt;&#039;&lt;br /&gt;
* Lynx project ID needs to follow the pattern: &#039;SRE&amp;lt;YYMM&amp;gt;&amp;lt;XXX&amp;gt;&#039;, where &amp;lt;XXX&amp;gt; is some three letter shorthand that relates to the problem/host&lt;br /&gt;
&lt;br /&gt;
== Informational incidents ==&lt;br /&gt;
* Informational incidents are acknowledged within 72 hours&lt;br /&gt;
&lt;br /&gt;
Checklist&lt;br /&gt;
# Acknowledge on Zabbix&lt;br /&gt;
# Sanity check the event, post result in thread&lt;br /&gt;
# If action needed, perform action&lt;br /&gt;
&lt;br /&gt;
== If an incident is reported by other means than the Zabbix-Zulip integration ==&lt;br /&gt;
Besides the automated Zabbix-Zulip integration, incidents can also be reported through emails from cron jobs, direct emails from customers, or topics in SRE General (such as alerts about Zulip updates or issues raised by colleagues), etc.&lt;br /&gt;
# Acknowledge receipt.&lt;br /&gt;
# Classify the incident as critical, non-critical, or informational.&lt;br /&gt;
# Create an topic in the relevant SRE channel, stating the problem and that you is responsible for resolving it.&lt;br /&gt;
# Proceed to treat the incident according to the criticality you just classified it as. (So for a critical incident, it means you now start the critical incident handling process)&lt;br /&gt;
&lt;br /&gt;
== Handover ==&lt;br /&gt;
See [[Handover]]&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Incident_Handling&amp;diff=689</id>
		<title>Incident Handling</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Incident_Handling&amp;diff=689"/>
		<updated>2026-01-12T14:55:49Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= This is the process =&lt;br /&gt;
This document is an authoritative description of the process. This document supersedes all prior documents on the process. &lt;br /&gt;
&lt;br /&gt;
= Deviating from the process =&lt;br /&gt;
You may deviate from the process at any moment. A deviation should be communicated to the dev-team, preferably in the Zulip topic about the applicable incident, as soon as possible after deciding to deviate.&lt;br /&gt;
&lt;br /&gt;
= Checklist =&lt;br /&gt;
This checklist is a shorter, imperative version of [[Incident Handling#Full_procedure|the longer procedure below]]. You&#039;re encouraged to read the [[Incident Handling#Full_procedure|full procedure]] at least once to improve your understanding of the core material.&lt;br /&gt;
&lt;br /&gt;
=== Critical Incidents ===&lt;br /&gt;
Critical incidents must be resolved within 16 hours. &lt;br /&gt;
&lt;br /&gt;
# Acknowledge trigger in Zabbix.&lt;br /&gt;
# Check if the incident is still ongoing.&lt;br /&gt;
# Determine whether the incident is ongoing&lt;br /&gt;
# If this report came in via SRE - Report:&lt;br /&gt;
## keep that thread open until the incident is resolved&lt;br /&gt;
## post a link to the SRE - Report thread to any underlying technical threads in SRE # Critical, SRE ## Non-critical, or SRE ### Informational that is related&lt;br /&gt;
# Determine whether clients are potentially affected, if so:&lt;br /&gt;
## notify the affected clients (Slack preferred if available)&lt;br /&gt;
## share the message sent to the client in the incident Zulip thread&lt;br /&gt;
# Document all actions taken in the Zulip topic.&lt;br /&gt;
# Create a plan of action.&lt;br /&gt;
# Execute plan and document results in Zabbix thread. &lt;br /&gt;
# If unresolved, create a new plan.&lt;br /&gt;
# When resolved:&lt;br /&gt;
## Verify trigger is no longer firing.&lt;br /&gt;
## Decide on when to notify affected clients (that you have notified of the incident), the incident has been resolved, and communicate this internally&lt;br /&gt;
## Mark Zulip topic as resolved if no other incidents for the host.&lt;br /&gt;
## Check for related triggers and resolve them.&lt;br /&gt;
## If there were any SRE - Report threads&lt;br /&gt;
### post a summary describing the high-level incident, that it is resolved and how it was resolved. &lt;br /&gt;
### post that summary message to any client channels such as Slack too. &lt;br /&gt;
### close the thread in SRE - Report&lt;br /&gt;
&lt;br /&gt;
=== Non-Critical Incidents ===&lt;br /&gt;
Non-critical incidents must be acknowledged within 9 hours and resolved within 1 week.&lt;br /&gt;
&lt;br /&gt;
# Acknowledge in Zabbix thread&lt;br /&gt;
# Check metrics sheet for existing milestone&lt;br /&gt;
## If a milestone exists:&lt;br /&gt;
### Add Lynx project ID to Zulip topic&lt;br /&gt;
### Add 🔁 emoji if ID already reported&lt;br /&gt;
## If no milestone exists:&lt;br /&gt;
### Add to metrics sheet&lt;br /&gt;
### Create Lynx project (priority 99, then 20 after estimation)&lt;br /&gt;
### Create Kimai activity&lt;br /&gt;
### Document IDs in Zulip topic&lt;br /&gt;
&lt;br /&gt;
=== Informational Incidents ===&lt;br /&gt;
Informational incidents must be acknowledged within 72 hours.&lt;br /&gt;
&lt;br /&gt;
# Acknowledge in Zabbix&lt;br /&gt;
# Verify issue&lt;br /&gt;
# Take action if needed&lt;br /&gt;
&lt;br /&gt;
=== External Reports ===&lt;br /&gt;
&lt;br /&gt;
# Acknowledge receipt&lt;br /&gt;
# Classify report as critical, non-critical or informational. &lt;br /&gt;
# Create a Zulip topic in SRE # Critical, SRE ## Non-critical or SRE ### Informational (depending on classification) and add sufficient details. &lt;br /&gt;
# Proceed with checklist above for the type of incident.&lt;br /&gt;
&lt;br /&gt;
= Full procedure =&lt;br /&gt;
&lt;br /&gt;
== General Rules ==&lt;br /&gt;
&lt;br /&gt;
# When an incident is in progress, and person A is handling it, then all incidents in area X, are handled by person A, rather than the FR. Unless working day ends. Person A should communicate clearly to FR when their day is over.&lt;br /&gt;
# FR always has the last word on what solution to apply for resolving an incident.&lt;br /&gt;
&lt;br /&gt;
== Critical incidents ==&lt;br /&gt;
&#039;&#039;&#039;Critical incidents are resolved within 16 hours.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
As first responder you take on the responsiblity of seeing an incident resolved. This does not mean that you are the person required to do all the work. You can attempt to involve others to help you (often referred to as escalating the incident), but since other are not on-call, they are not obliged to help you, especially outside of normal working hours.&lt;br /&gt;
Involving multiple people can quickly be required if multiple critical incidents with different causes occur simultaneously. In that case, the First Responder usually takes on a more information management role and steers those that are brought on into resolving the issues. (Example: if a server crashes, several critical triggers can fire, but the underlying cause can quite quickly be determined to be a single issue, the crashed server. So you wouldn&#039;t need to call in people to manage each incident. But a client&#039;s service being down in one cluster while in a different cluster a different VM no longer boots is likely to be to different issues, so in order to resolve them on time you&#039;d want to call in help to resolve the incident in time).&lt;br /&gt;
&lt;br /&gt;
=== Process ===&lt;br /&gt;
The general process is made up of the following steps. Each step has additional information on how to handle/execute them in the sections below.&lt;br /&gt;
# Take responsibility for seeing the incident resolved&lt;br /&gt;
# Determine if incident is still ongoing&lt;br /&gt;
# If ongoing: Communicate to affected clients that the issue is being investigated&lt;br /&gt;
# Communicate plan/next steps (even if that is gathering information)&lt;br /&gt;
# Communicate findings/results of executed plan, go back to previous step if not resolved&lt;br /&gt;
# Resolve incident + cleanup&lt;br /&gt;
&lt;br /&gt;
During working on an incident it is expected that all communication is done in the incident&#039;s thread. This means all information to a problem can be found in a clear a predictable place. Sometimes an incident can be resolved by work done in another incident. In that case, it is required to post a link to that thread in the incident&#039;s thread with the comment that the resolution is done in that thread.&lt;br /&gt;
&lt;br /&gt;
==== Acknowledge the incident on Zabbix ====&lt;br /&gt;
The first step is to take responsibility for seeing the incident resolved by acknowledging the incident on Zabbix. Simply acknowledging the trigger suffices. It is however entirely possible that multiple critical incidents are firing at the same time. This can be a coincidence, or can be because of a share cause of failure. For example, a server crashing will cause server VMs to reboot, or the router having an connectivity issue will lead to most other VMs having connectivity issues as well. If there are multiple critical incidents, it is advised to quickly observe what&#039;s ongoing, Zabbix is the best source of firing triggers for this, and pick the incident that is likely the root cause to  &lt;br /&gt;
&lt;br /&gt;
* Acknowledging an incident on Zabbix will stop Zabbix from calling the First Responder to notify them of the ongoing incident. And stops Zabbix from posting reminders on Zulip.&lt;br /&gt;
&lt;br /&gt;
==== Determine if incident is still ongoing ====&lt;br /&gt;
The next step is to check if the reported problem is still ongoing. Depending on the observations made here your process to follow and steps needed to resolve the incident can change. There are three options:&lt;br /&gt;
# The trigger resolved itself and the problem cannot be observed. Example: HTTPS is down for a site, but the FR can access the site through HTTPS without incident.&lt;br /&gt;
# The trigger resolved itself and the problem can still be observed.&lt;br /&gt;
# The trigger is still firing but the problem cannot be observed: Our triggers might not be perfect, so it could be that something else is causing it to fire. A simple example would be that Zabbix reports that the the DNS for a site can&#039;t be resolved, but in reality there&#039;s a bug in the script we wrote that checks if the DNS resolves and the DNS resolves fine. Final note: keep in mind that an &#039;it works on my machine&#039; does not necessarily mean it works for most other people, so depening on the trigger you need to do some evaluations if your tests suffice. &lt;br /&gt;
&lt;br /&gt;
In order to make sure you are actually trying to observe the same thing as the trigger is looking for, make sure to check the trigger definition and the current data of the associated item(s). Some triggers might fire if one of multiple conditions is met (Such as a trigger that monitors the ping response time firing if the value exceeds a certain threshold, or if no data for a certain period of time was observed).&lt;br /&gt;
&lt;br /&gt;
Make sure to report your findings in the incident&#039;s thread. It&#039;s advised to post a screenshot of the relevant item(s) and your own observations. (Continuing the ping example, you would post a screenshot of the relevant values, state your conclusion why the trigger is firing, and your own observations/pings)&lt;br /&gt;
&lt;br /&gt;
==== Communicate to affected clients ====&lt;br /&gt;
If the incident is still ongoing and the service is down, we need to communicate to affected clients that we are aware of the problem and that we are investigating it. This is because critical incident usually mean the service is down, something the clients can notice/are affected by, so we to be transparent that something is going on. There are some additional notes to this though:&lt;br /&gt;
* If an incident has already resolved itself and the problem is no longer observable, we don&#039;t communicate anything. Doing so might only cause confusion, and since the client has not reported any issues, they have not had a noticeable problem with it themselves.&lt;br /&gt;
* Although a critical incident generally means that the client service is down or experiencing reduced service, not all critical incidents are of that nature. Some are more administrative, or are only an issue for Delft Solutions itself. As of writing I don&#039;t have an exhaustive list, but here is those I can think of:&lt;br /&gt;
** SSH Service is down: We don&#039;t have any clients that SSH into their services, so it&#039;s generally not a problem. But SSH is mostly used for SRE maintenance and publishing new builds. The SRE maintenance is an internal problem, so no need to communicate to the client. The publishing is done to Kaboom, preventing new builds from being published, and the two SM VMs.&lt;br /&gt;
** No backup for x days: Clients don&#039;t notice it if a backup is running late, so no need to communicate with clients. Just need to make sure the backup gets completed&lt;br /&gt;
** SSL certificate is expiring in &amp;lt; 24 hours: This is a bit dependent on how soon this incident is being handled, but if it handled quickly, the certificate never actually expired, and there has not been any disruption to the client&#039;s service, so no need for communicating about it.&lt;br /&gt;
* Determining which clients are being affected can be done by looking at the host&#039;s DNS in the trigger, and/or looking up the VM in Proxmox and checking the tags of the VMs for client names. In the case that this issue is causing multiple other critical triggers to fire, you would have to check for which clients are affected by those incidents.&lt;br /&gt;
* Communicating to DS about ongoing incidents is usually assumed to be automatically have been done by the fact that the incident was reported on Zulip.&lt;br /&gt;
&lt;br /&gt;
As always, report the decisions taken and actions made in the incident thread. (e.g.: I&#039;ve sent a message in the Slack to let Kaboom know that we aware of problem x, and that we are investigating it)&lt;br /&gt;
&lt;br /&gt;
==== Communicate plan/next steps + Communicate findings/results of executed plan ====&lt;br /&gt;
This is the main part of handling an incident. There are several actions you can take in these steps, but at the basis they consist of sharing your next steps, performing those, and reporting the results. The reason all this needs to be reported is to ensure that all known information about a problem is logged, making it easier for someone else to be onboarded into the issue, for later reference if a similar issue is encountered, and even for use during the incident itself in case an older configuration needs to be referenced after you changed it.&lt;br /&gt;
The objective from these steps is determining what is actually wrong and how to resolve it. Depending on the observations made earlier on whether the incident is still ongoing and is (still) observable your investigation can go into different directions. (e.g. Find the underlying cause for a trigger, or determining why the trigger is firing while it likely shouldn&#039;t, and then how to resolve that underlying cause or how to update the trigger to work better)&lt;br /&gt;
&lt;br /&gt;
There are three main types of steps defined, but you are not limited to these:&lt;br /&gt;
# Hypothesis: If you have an idea what could be causing it, you would state your hypothesis and your next step would be to prove that hypothesis. For example, for an incident &#039;SSH service is down on X&#039; your hypothesis could be that this is due to &#039;MaxStartups&#039; throttling, which can be proven by &#039;grep&#039;ing journalctl for that, and compare the start and end times of throttling with the timestamps of the item reporting the status of the SSH service.&lt;br /&gt;
# Information gathering: Sometimes it just helps to get some facts about the situation collected. What is usefull information that is relevant depends on the triggers, but some examples are: The syslog/journalctl of the host from around the time of the incident (it can contain a reference to the an underlying problem in various levels of explicitness), the ping response from several hosts on the route to a host or a traceroute (this helps with networking issues). The gathered information is usually intended to help you come up with an hypothesis on what&#039;s wrong.&lt;br /&gt;
# Investigative: The most rigorous of process. The full process is described here originally [https://docs.google.com/document/d/1AQYJM1Q9l2Tyk6zfCVaQ2aEq-dpbfUH5okE88bpKkhw/edit#heading=h.5fq2skijqbdc Drive - Final Coundown - General Investigative Process]. To summarize, when you don&#039;t know why something is failing, and/or don&#039;t have any decent hypotheses to follow up, you can follow this process to systematically find the problem.&lt;br /&gt;
&lt;br /&gt;
Regarding the resolution to an incident: The resolution to any incident is usually one of two things:&lt;br /&gt;
# Fix the underlying problem.&lt;br /&gt;
# Fix the trigger itself.&lt;br /&gt;
Fixing the trigger is relatively straightforward, but do make sure document in the thread what you changed to which trigger.&lt;br /&gt;
Fixing the underlying problem can be more complex. A trade-off needs to be made sometimes between resolving technical debt, or simply patching the current system to resolve the issue. We usually look for a resolution that ensures that the problem won&#039;t re-occur soon, or makes it unexpected/unlikely for the problem to re-occur. Taking into account the time frame that is available to resolve the incident you can make some trade-offs. An example would be: normal backups of VMs are failing due to the Proxmox backup server being down/unreachable and it is determined that this cannot be resolved at that moment. We can set up automatic backups to local storage temporary to resolve the immediate problem and ensure we keep our SLO&#039;s versus setting up a new Proxmox Backup server at a different location. Since we don&#039;t have much time to resolve the problem, the resolution would be to set up the automatic backups to local storage, and set up a new Proxmox Backup Server later as a seperate issue.&lt;br /&gt;
&lt;br /&gt;
===== Some known issues and their resolutions =====&lt;br /&gt;
* SSH service is down: The internet is a vile place. There&#039;s constant port scanning and hacking attempts ongoing to any machine connected to the internet (mostly IPv4). Due to this, SSH has a throttling functionality build in to prevent a system from being DDOS&#039;ed by the amount of malicious SSH requests. This throttling can cause the Zabbix server from being denied an SSH connection, of which several failures fire this trigger. This hypothesis can be proven with a `journalctl -u ssh | grep &#039;MaxStartups throttling&#039;` (you probably want to select a relevant time period with `--since &amp;quot;2 hours ago&amp;quot;` or something similar to prevent having to process a month of logging). You can then compare the throttling start and end times with the timestamps of the item data itself. The resolution for the issue is to add our custom ssh configuration [https://chat.dsinternal.net/#narrow/stream/23-SRE---General/topic/DS.20Whitelisted.20Custom.20SSH.20configuration/near/1620 Custom SSH Configuration].&lt;br /&gt;
* No backup for 3 days: Are S3 backup is very slow. Not much to prove as an underlying issue here. What needs to be done is check that the backup process is ongoing. The Zabbix latest data can be checked to verify that backups are running by checking that that days backups were done for the smaller buckets. The devteam email can be checked for if the backup process could not start on day due to it already running (it takes 24+ hours, and an attempt to start it is done each day by cron).&lt;br /&gt;
* git.* HTTPS is down: On Sunday mostly, Gitlab gets automatically updated, but this incurs some downtime as the service is restarted. This is usually short enough to not be reported to Zulip as per our settings, but sometimes it&#039;s longer. If the service does not stay down, the issue can be just resolved.&lt;br /&gt;
&lt;br /&gt;
==== Resolve incident + cleanup ====&lt;br /&gt;
When you&#039;ve executed and verified the resolution in the previous steps we can proceed resolving the issue in our Mattermost integration. Resolving an incident can be done by doing the following:&lt;br /&gt;
# Verify that the trigger is no longer firing. An incident will be immediately re-opened if the trigger is still firing, and the incident cannot be considered resolved if the trigger is still firing. If the trigger is still firing but you&#039;re sure that you&#039;ve resolved the problem, you might need to force the item the trigger depends on to update. This can be done by finding the item in the host&#039;s configuration on Zabbix and selecting &#039;Execute Now&#039;, after a short period this should force Zabbix to re-execute the item. You can check the timestamps in the latest data of an item to check if it was updated.&lt;br /&gt;
# Close the incident by marking the topic as resolved, when there are no other triggers firing for the host.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, some problems cause multiple critical and non-critical triggers to fire. This means we have to check Zabbix and Zulip for other fired triggers and ongoing incidents. The goal is to identify critical and non-critical incidents that were caused by the incident/underlying issue you just resolved.&lt;br /&gt;
# First, these incidents need to be acknowledged on Zabbix, and in the acknowledgement message you mention the incident/problem that caused this.&lt;br /&gt;
# Next, check the incident tracked by the integration on Mattermost using the `?ongoing` command. Resolve incidents that were (re-)opened by this incident by executing the following steps. If the first two fail (problem still persists, trigger is still firing), the incident needs to considered it&#039;s own issue and the relevant process needs to be followed (critical or non-critical depending on criticality).&lt;br /&gt;
## Ensuring the mentioned problem is no longer observable&lt;br /&gt;
## The trigger has resolved (You might need to force an update with `Execute Now`).&lt;br /&gt;
## Posting a link to the main incident you resolved with the comment that the underlying problem was resolved in that topic.&lt;br /&gt;
## Closing the incident by marking the topic as resolved, when there are no other triggers firing for the host.&lt;br /&gt;
&lt;br /&gt;
When you are done, there should be no more critical triggers firing in Zabbix or open in the Zabbix-Mattermost integration, for which no-one has taken responsibility or you have taken responsibility for and are not actively handling.&lt;br /&gt;
&lt;br /&gt;
== Non-Critical incidents ==&lt;br /&gt;
* Non-critical incidents are acknowledged within 9 hours and resolved within one week.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledging ===&lt;br /&gt;
Fully acknowledging a non-critical incident requires the following tasks to have been completed:&lt;br /&gt;
* Acknowledging the incident on Zabbix, which means you take responsibility of completing the steps listed below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The next steps don&#039;t have to be done immediately, as they have dependencies, but be started and scheduled for completion the next work day.&lt;br /&gt;
&lt;br /&gt;
Check if there&#039;s already a uncompleted milestone for this host with this issue in the metrics sheet.&lt;br /&gt;
If a milestone is already present:&lt;br /&gt;
* Report in the topic the Lynx project ID for resolving this issue.&lt;br /&gt;
* If the ID has already been reported in the topic, we don&#039;t want to report it again and again, instead add the 🔁 emoji (:repeat:) under the zabbix bot alert&lt;br /&gt;
&lt;br /&gt;
If a milestone is NOT already present:&lt;br /&gt;
* Add the non-critical incident as a milestone in the metrics sheet, following the naming convention&lt;br /&gt;
** Start date is the date of the incident&lt;br /&gt;
** DoD states what needs to be true for the non-critical incident to be consider resolved&lt;br /&gt;
* Add the non-critical incident to Lynx as a project&lt;br /&gt;
** Follow the naming convention below for the title &amp;amp; project ID&lt;br /&gt;
** Tasks need to be added&lt;br /&gt;
** Final tasks needs to have the SLO deadline set as &#039;constraint&#039;&lt;br /&gt;
** Project priority is set to 99 while not estimated yet. After the estimation is done, the priority should be set to 20&lt;br /&gt;
** The tasks are estimated for SP&lt;br /&gt;
* The Lynx project ID is reported in the non-critical incident&#039;s topic on Zulip, and logged in the metrics sheet&lt;br /&gt;
* A Kimai activity is created in Kimai for the non-critical incident, following the naming convetion&lt;br /&gt;
&lt;br /&gt;
==== Naming convention ====&lt;br /&gt;
* Kimai activity name needs to follow the pattern: &#039;&amp;lt;YYYY-MM&amp;gt; &amp;lt;problem_title&amp;gt;&#039;. For &amp;lt;problem_title&amp;gt;, incorporate the trigger title and hostname for clarity.&lt;br /&gt;
* Milestone name needs to follow the pattern: &#039;Delft Solutions Hosting Incident response work &amp;lt;kimai_activity_name&amp;gt;&#039;&lt;br /&gt;
* Lynx project name needs to follow the pattern: &#039;Delft Solutions Hosting Incident response work &amp;lt;kimai_activity_name&amp;gt;&#039;&lt;br /&gt;
* Lynx project ID needs to follow the pattern: &#039;SRE&amp;lt;YYMM&amp;gt;&amp;lt;XXX&amp;gt;&#039;, where &amp;lt;XXX&amp;gt; is some three letter shorthand that relates to the problem/host&lt;br /&gt;
&lt;br /&gt;
== Informational incidents ==&lt;br /&gt;
* Informational incidents are acknowledged within 72 hours&lt;br /&gt;
&lt;br /&gt;
Checklist&lt;br /&gt;
# Acknowledge on Zabbix&lt;br /&gt;
# Sanity check the event, post result in thread&lt;br /&gt;
# If action needed, perform action&lt;br /&gt;
&lt;br /&gt;
== If an incident is reported by other means than the Zabbix-Zulip integration ==&lt;br /&gt;
Besides the automated Zabbix-Zulip integration, incidents can also be reported through emails from cron jobs, direct emails from customers, or topics in SRE General (such as alerts about Zulip updates or issues raised by colleagues), etc.&lt;br /&gt;
# Acknowledge receipt.&lt;br /&gt;
# Classify the incident as critical, non-critical, or informational.&lt;br /&gt;
# Create an topic in the relevant SRE channel, stating the problem and that you is responsible for resolving it.&lt;br /&gt;
# Proceed to treat the incident according to the criticality you just classified it as. (So for a critical incident, it means you now start the critical incident handling process)&lt;br /&gt;
&lt;br /&gt;
== Handover ==&lt;br /&gt;
See [[Handover]]&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Handover&amp;diff=664</id>
		<title>Handover</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Handover&amp;diff=664"/>
		<updated>2025-10-21T11:26:32Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: points&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When handing over the responsibility of &#039;&#039;&#039;first responder&#039;&#039;&#039; (FR), the following needs to happen:&lt;br /&gt;
* The handover can be initiated by both the incoming FR or the current FR.&lt;br /&gt;
* The current FR adds the incoming FR to the IPA sla-first-responder user group and enables Zabbix calling for the incoming FR if they have that set by going to Zabbix &amp;gt; Configuration &amp;gt; Actions &amp;gt; [https://status.delftinfra.net/zabbix/actionconf.php?eventsource=0# Trigger actions].&lt;br /&gt;
* Before the handover, the current FR must ensure that all active incidents are acknowledged (this includes alert emails or opened topics in SRE General, etc...), updated with the latest status, and properly documented.&lt;br /&gt;
* The incoming FR makes sure they are aware of the state of the SLA and knows what questions they wants to ask the current FR.&lt;br /&gt;
* The incoming FR makes sure they are subscribed to the right channels.&lt;br /&gt;
&lt;br /&gt;
The following steps can be done async or in person:&lt;br /&gt;
* The current FR informs the incoming FR he/she has been added to the sla-first-responder group. If the handover is conducted async, this is done in the [https://chat.dsinternal.net/#narrow/stream/13-Organisational #Organisational] channel.&lt;br /&gt;
* If the current FR wants to hand over responsibility for any ongoing incident, they also state which incidents they want the incoming FR to take over.&lt;br /&gt;
* The current FR shares with the incoming FR any particularities they should be aware of.&lt;br /&gt;
* The incoming FR asks their questions until they are satisfied and able to take over the FR.&lt;br /&gt;
* The incoming FR ensures they are subscribed to the following channels on Zulip: [https://chat.dsinternal.net/#narrow/stream/23-SRE---General SRE - General], [https://chat.dsinternal.net/#narrow/stream/24-SRE-.23-Critical SRE # Critical]. &lt;br /&gt;
* If the incoming FR is a member of &amp;quot;The Team&amp;quot;, they also subscribe to [https://chat.dsinternal.net/#streams/4/SRE%20##%20Non-critical SRE ## Non-Critical] and [https://chat.dsinternal.net/#streams/5/SRE%20###%20Informational SRE ### Informational].&lt;br /&gt;
* The incoming FR announces/informs that they are now the current FR over Zulip&#039;s [https://chat.dsinternal.net/#narrow/stream/13-Organisational Organisational channel].&lt;br /&gt;
* The incoming FR removes the current FR from IPA the sla-first-responder user group.&lt;br /&gt;
* The incoming FR disables Zabbix calling for the current FR. This is completed through Zabbix &amp;gt; Configuration &amp;gt; Actions &amp;gt; [https://status.delftinfra.net/zabbix/actionconf.php?eventsource=0# Trigger actions].&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Handover&amp;diff=663</id>
		<title>Handover</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Handover&amp;diff=663"/>
		<updated>2025-10-21T11:24:57Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When handing over the responsibility of &#039;&#039;&#039;first responder&#039;&#039;&#039; (FR), the following needs to happen:&lt;br /&gt;
* The handover can be initiated by both the incoming FR or the current FR&lt;br /&gt;
* The current FR adds the incoming FR to the IPA sla-first-responder user group and enables Zabbix calling for the incoming FR if they have that set by going to Zabbix &amp;gt; Configuration &amp;gt; Actions &amp;gt; [https://status.delftinfra.net/zabbix/actionconf.php?eventsource=0# Trigger actions]&lt;br /&gt;
* Before the handover, the current FR must ensure that all active incidents are acknowledged (this includes alert emails or opened topics in SRE General, etc...), updated with the latest status, and properly documented.&lt;br /&gt;
* The incoming FR makes sure they are aware of the state of the SLA and knows what questions they wants to ask the current FR.&lt;br /&gt;
* The incoming FR makes sure they are subscribed to the right channels.&lt;br /&gt;
&lt;br /&gt;
The following steps can be done async or in person:&lt;br /&gt;
* The current FR informs the incoming FR he/she has been added to the sla-first-responder group. If the handover is conducted async, this is done in the [https://chat.dsinternal.net/#narrow/stream/13-Organisational #Organisational] channel.&lt;br /&gt;
* If the current FR wants to hand over responsibility for any ongoing incident, they also state which incidents they want the incoming FR to take over.&lt;br /&gt;
* The current FR shares with the incoming FR any particularities they should be aware of.&lt;br /&gt;
* The incoming FR asks their questions until they are satisfied and able to take over the FR&lt;br /&gt;
* The incoming FR ensures they are subscribed to the following channels on Zulip: [https://chat.dsinternal.net/#narrow/stream/23-SRE---General SRE - General], [https://chat.dsinternal.net/#narrow/stream/24-SRE-.23-Critical SRE # Critical]. &lt;br /&gt;
* If the incoming FR is a member of &amp;quot;The Team&amp;quot;, they also subscribe to [https://chat.dsinternal.net/#streams/4/SRE%20##%20Non-critical SRE ## Non-Critical] and [https://chat.dsinternal.net/#streams/5/SRE%20###%20Informational SRE ### Informational].&lt;br /&gt;
* The incoming FR announces/informs that they are now the current FR over Zulip&#039;s [https://chat.dsinternal.net/#narrow/stream/13-Organisational Organisational channel]&lt;br /&gt;
* The incoming FR removes the current FR from IPA the sla-first-responder user group.&lt;br /&gt;
* The incoming FR disables Zabbix calling for the current FR. This is completed through Zabbix &amp;gt; Configuration &amp;gt; Actions &amp;gt; [https://status.delftinfra.net/zabbix/actionconf.php?eventsource=0# Trigger actions]&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Handover&amp;diff=662</id>
		<title>Handover</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Handover&amp;diff=662"/>
		<updated>2025-10-21T11:24:19Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: verb simplified, split run-on sentence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When handing over the responsibility of &#039;&#039;&#039;first responder&#039;&#039;&#039; (FR), the following needs to happen:&lt;br /&gt;
* The handover can be initiated by both the incoming FR or the current FR&lt;br /&gt;
* Prior FR adds the incoming FR to the IPA sla-first-responder user group and enables Zabbix calling for the incoming FR if they have that set by going to Zabbix &amp;gt; Configuration &amp;gt; Actions &amp;gt; [https://status.delftinfra.net/zabbix/actionconf.php?eventsource=0# Trigger actions]&lt;br /&gt;
* Before the handover, the current FR must ensure that all active incidents are acknowledged (this includes alert emails or opened topics in SRE General, etc...), updated with the latest status, and properly documented.&lt;br /&gt;
* The incoming FR makes sure they are aware of the state of the SLA and knows what questions they wants to ask the current FR.&lt;br /&gt;
* The incoming FR makes sure they are subscribed to the right channels.&lt;br /&gt;
&lt;br /&gt;
The following steps can be done async or in person:&lt;br /&gt;
* The current FR informs the incoming FR he/she has been added to the sla-first-responder group. If the handover is conducted async, this is done in the [https://chat.dsinternal.net/#narrow/stream/13-Organisational #Organisational] channel.&lt;br /&gt;
* If the current FR wants to hand over responsibility for any ongoing incident, they also state which incidents they want the incoming FR to take over.&lt;br /&gt;
* The current FR shares with the incoming FR any particularities they should be aware of.&lt;br /&gt;
* The incoming FR asks their questions until they are satisfied and able to take over the FR&lt;br /&gt;
* The incoming FR ensures they are subscribed to the following channels on Zulip: [https://chat.dsinternal.net/#narrow/stream/23-SRE---General SRE - General], [https://chat.dsinternal.net/#narrow/stream/24-SRE-.23-Critical SRE # Critical]. &lt;br /&gt;
* If the incoming FR is a member of &amp;quot;The Team&amp;quot;, they also subscribe to [https://chat.dsinternal.net/#streams/4/SRE%20##%20Non-critical SRE ## Non-Critical] and [https://chat.dsinternal.net/#streams/5/SRE%20###%20Informational SRE ### Informational].&lt;br /&gt;
* The incoming FR announces/informs that they are now the current FR over Zulip&#039;s [https://chat.dsinternal.net/#narrow/stream/13-Organisational Organisational channel]&lt;br /&gt;
* The incoming FR removes the current FR from IPA the sla-first-responder user group.&lt;br /&gt;
* The incoming FR disables Zabbix calling for the current FR. This is completed through Zabbix &amp;gt; Configuration &amp;gt; Actions &amp;gt; [https://status.delftinfra.net/zabbix/actionconf.php?eventsource=0# Trigger actions]&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Handover&amp;diff=661</id>
		<title>Handover</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Handover&amp;diff=661"/>
		<updated>2025-10-21T11:22:30Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: spelling&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When handing over the responsibility of &#039;&#039;&#039;first responder&#039;&#039;&#039; (FR), the following needs to happen:&lt;br /&gt;
* The handover can be initiated by both the incoming FR or the current FR&lt;br /&gt;
* Prior FR adds the incoming FR to the IPA sla-first-responder user group and enables Zabbix calling for the incoming FR if they have that set by going to Zabbix &amp;gt; Configuration &amp;gt; Actions &amp;gt; [https://status.delftinfra.net/zabbix/actionconf.php?eventsource=0# Trigger actions]&lt;br /&gt;
* Before the handover, the current FR must ensure that all active incidents are acknowledged (this includes alert emails or opened topics in SRE General, etc...), updated with the latest status, and properly documented.&lt;br /&gt;
* The incoming FR makes sure they are aware of the state of the SLA and knows what questions they wants to ask the current FR.&lt;br /&gt;
* The incoming FR makes sure they are subscribed to the right channels.&lt;br /&gt;
&lt;br /&gt;
The following steps can be done async or in person:&lt;br /&gt;
* The current FR announces/informs the incoming FR has been added to the sla-first-responder group (In Zulip&#039;s [https://chat.dsinternal.net/#narrow/stream/13-Organisational Organisational channel] if async).&lt;br /&gt;
* If the current FR wants to hand over responsibility for any ongoing incident, they also state which incidents they want the incoming FR to take over.&lt;br /&gt;
* The current FR shares with the incoming FR any particularities they should be aware of.&lt;br /&gt;
* The incoming FR asks their questions until they are satisfied and able to take over the FR&lt;br /&gt;
* The incoming FR ensures they are subscribed to the following channels on Zulip: [https://chat.dsinternal.net/#narrow/stream/23-SRE---General SRE - General], [https://chat.dsinternal.net/#narrow/stream/24-SRE-.23-Critical SRE # Critical]. &lt;br /&gt;
* If the incoming FR is a member of &amp;quot;The Team&amp;quot;, they also subscribe to [https://chat.dsinternal.net/#streams/4/SRE%20##%20Non-critical SRE ## Non-Critical] and [https://chat.dsinternal.net/#streams/5/SRE%20###%20Informational SRE ### Informational].&lt;br /&gt;
* The incoming FR announces/informs that they are now the current FR over Zulip&#039;s [https://chat.dsinternal.net/#narrow/stream/13-Organisational Organisational channel]&lt;br /&gt;
* The incoming FR removes the current FR from IPA the sla-first-responder user group.&lt;br /&gt;
* The incoming FR disables Zabbix calling for the current FR. This is completed through Zabbix &amp;gt; Configuration &amp;gt; Actions &amp;gt; [https://status.delftinfra.net/zabbix/actionconf.php?eventsource=0# Trigger actions]&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Handover&amp;diff=660</id>
		<title>Handover</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Handover&amp;diff=660"/>
		<updated>2025-10-21T11:21:55Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: reformulate imperative sentence, clarify assigned to current FR&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When handing over the responsibility of &#039;&#039;&#039;first responder&#039;&#039;&#039; (FR), the following needs to happen:&lt;br /&gt;
* The handover can be initiated by both the incoming FR or the current FR&lt;br /&gt;
* Prior FR adds the incoming FR to the IPA sla-first-responder user group and enables Zabbix calling for the incoming FR if they have that set by going to Zabbix &amp;gt; Configuration &amp;gt; Actions &amp;gt; [https://status.delftinfra.net/zabbix/actionconf.php?eventsource=0# Trigger actions]&lt;br /&gt;
* Before the handover, the current FR must ensure that all active incidents are acknowledged (this includes alert emails or opened topics in SRE General, etc...), updated with the latest status, and properly documented.&lt;br /&gt;
* The incoming FR makes sure they are aware of the state of the SLA and knows what questions they wants to ask the current FR.&lt;br /&gt;
* The incoming FR makes sure they are subscribed to the right channels.&lt;br /&gt;
&lt;br /&gt;
The following steps can be done async or in person:&lt;br /&gt;
* The current FR announces/informs the incoming FR has been added to the sla-first-responder group (In Zulip&#039;s [https://chat.dsinternal.net/#narrow/stream/13-Organisational Organisational channel] if asynq).&lt;br /&gt;
* If the current FR wants to hand over responsibility for any ongoing incident, they also state which incidents they want the incoming FR to take over.&lt;br /&gt;
* The current FR shares with the incoming FR any particularities they should be aware of.&lt;br /&gt;
* The incoming FR asks their questions until they are satisfied and able to take over the FR&lt;br /&gt;
* The incoming FR ensures they are subscribed to the following channels on Zulip: [https://chat.dsinternal.net/#narrow/stream/23-SRE---General SRE - General], [https://chat.dsinternal.net/#narrow/stream/24-SRE-.23-Critical SRE # Critical]. &lt;br /&gt;
* If the incoming FR is a member of &amp;quot;The Team&amp;quot;, they also subscribe to [https://chat.dsinternal.net/#streams/4/SRE%20##%20Non-critical SRE ## Non-Critical] and [https://chat.dsinternal.net/#streams/5/SRE%20###%20Informational SRE ### Informational].&lt;br /&gt;
* The incoming FR announces/informs that they are now the current FR over Zulip&#039;s [https://chat.dsinternal.net/#narrow/stream/13-Organisational Organisational channel]&lt;br /&gt;
* The incoming FR removes the current FR from IPA the sla-first-responder user group.&lt;br /&gt;
* The incoming FR disables Zabbix calling for the current FR. This is completed through Zabbix &amp;gt; Configuration &amp;gt; Actions &amp;gt; [https://status.delftinfra.net/zabbix/actionconf.php?eventsource=0# Trigger actions]&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Handover&amp;diff=659</id>
		<title>Handover</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Handover&amp;diff=659"/>
		<updated>2025-10-21T11:20:39Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: remove undefined reference to a &amp;quot;SRE team&amp;quot;, and split a partially conditional step in two&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When handing over the responsibility of &#039;&#039;&#039;first responder&#039;&#039;&#039; (FR), the following needs to happen:&lt;br /&gt;
* The handover can be initiated by both the incoming FR or the current FR&lt;br /&gt;
* Prior FR adds the incoming FR to the IPA sla-first-responder user group and enables Zabbix calling for the incoming FR if they have that set by going to Zabbix &amp;gt; Configuration &amp;gt; Actions &amp;gt; [https://status.delftinfra.net/zabbix/actionconf.php?eventsource=0# Trigger actions]&lt;br /&gt;
* Before the handover, the current FR must ensure that all active incidents are acknowledged (this includes alert emails or opened topics in SRE General, etc...), updated with the latest status, and properly documented.&lt;br /&gt;
* The incoming FR makes sure they are aware of the state of the SLA and knows what questions they wants to ask the current FR.&lt;br /&gt;
* The incoming FR makes sure they are subscribed to the right channels.&lt;br /&gt;
&lt;br /&gt;
The following steps can be done async or in person:&lt;br /&gt;
* The current FR announces/informs the incoming FR has been added to the sla-first-responder group (In Zulip&#039;s [https://chat.dsinternal.net/#narrow/stream/13-Organisational Organisational channel] if asynq).&lt;br /&gt;
* If the current FR wants to hand over responsibility for any ongoing incident, they also state which incidents they want the incoming FR to take over.&lt;br /&gt;
* If there are any particularities the incoming FR needs to be aware of, those are shared.&lt;br /&gt;
* The incoming FR asks their questions until they are satisfied and able to take over the FR&lt;br /&gt;
* The incoming FR ensures they are subscribed to the following channels on Zulip: [https://chat.dsinternal.net/#narrow/stream/23-SRE---General SRE - General], [https://chat.dsinternal.net/#narrow/stream/24-SRE-.23-Critical SRE # Critical]. &lt;br /&gt;
* If the incoming FR is a member of &amp;quot;The Team&amp;quot;, they also subscribe to [https://chat.dsinternal.net/#streams/4/SRE%20##%20Non-critical SRE ## Non-Critical] and [https://chat.dsinternal.net/#streams/5/SRE%20###%20Informational SRE ### Informational].&lt;br /&gt;
* The incoming FR announces/informs that they are now the current FR over Zulip&#039;s [https://chat.dsinternal.net/#narrow/stream/13-Organisational Organisational channel]&lt;br /&gt;
* The incoming FR removes the current FR from IPA the sla-first-responder user group.&lt;br /&gt;
* The incoming FR disables Zabbix calling for the current FR. This is completed through Zabbix &amp;gt; Configuration &amp;gt; Actions &amp;gt; [https://status.delftinfra.net/zabbix/actionconf.php?eventsource=0# Trigger actions]&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Handover&amp;diff=658</id>
		<title>Handover</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Handover&amp;diff=658"/>
		<updated>2025-10-21T11:19:05Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When handing over the responsibility of &#039;&#039;&#039;first responder&#039;&#039;&#039; (FR), the following needs to happen:&lt;br /&gt;
* The handover can be initiated by both the incoming FR or the current FR&lt;br /&gt;
* Prior FR adds the incoming FR to the IPA sla-first-responder user group and enables Zabbix calling for the incoming FR if they have that set by going to Zabbix &amp;gt; Configuration &amp;gt; Actions &amp;gt; [https://status.delftinfra.net/zabbix/actionconf.php?eventsource=0# Trigger actions]&lt;br /&gt;
* Before the handover, the current FR must ensure that all active incidents are acknowledged (this includes alert emails or opened topics in SRE General, etc...), updated with the latest status, and properly documented.&lt;br /&gt;
* The incoming FR makes sure they are aware of the state of the SLA and knows what questions they wants to ask the current FR.&lt;br /&gt;
* The incoming FR makes sure they are subscribed to the right channels.&lt;br /&gt;
&lt;br /&gt;
The following steps can be done async or in person:&lt;br /&gt;
* The current FR announces/informs the incoming FR has been added to the sla-first-responder group (In Zulip&#039;s [https://chat.dsinternal.net/#narrow/stream/13-Organisational Organisational channel] if asynq).&lt;br /&gt;
* If the current FR wants to hand over responsibility for any ongoing incident, they also state which incidents they want the incoming FR to take over.&lt;br /&gt;
* If there are any particularities the incoming FR needs to be aware of, those are shared.&lt;br /&gt;
* The incoming FR asks their questions until they are satisfied and able to take over the FR&lt;br /&gt;
* The incoming FR ensures they are subscribed to the following channels on Zulip: [https://chat.dsinternal.net/#narrow/stream/23-SRE---General SRE - General], [https://chat.dsinternal.net/#narrow/stream/24-SRE-.23-Critical SRE # Critical] and if part of the SRE team [https://chat.dsinternal.net/#streams/4/SRE%20##%20Non-critical SRE ## Non-Critical] and [https://chat.dsinternal.net/#streams/5/SRE%20###%20Informational SRE ### Informational].&lt;br /&gt;
* The incoming FR announces/informs that they are now the current FR over Zulip&#039;s [https://chat.dsinternal.net/#narrow/stream/13-Organisational Organisational channel]&lt;br /&gt;
* The incoming FR removes the current FR from IPA the sla-first-responder user group.&lt;br /&gt;
* The incoming FR disables Zabbix calling for the current FR. This is completed through Zabbix &amp;gt; Configuration &amp;gt; Actions &amp;gt; [https://status.delftinfra.net/zabbix/actionconf.php?eventsource=0# Trigger actions]&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Handover&amp;diff=657</id>
		<title>Handover</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Handover&amp;diff=657"/>
		<updated>2025-10-21T11:18:10Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: wording improvement FR references&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;When handing over the responsibility of &#039;&#039;&#039;first responder&#039;&#039;&#039; (FR), the following needs to happen:&lt;br /&gt;
* The handover can be initiated by both the incoming FR or the current FR&lt;br /&gt;
* Prior FR adds the incoming FR to the IPA sla-first-responder user group and enables Zabbix calling for the incoming FR if they have that set by going to Zabbix &amp;gt; Configuration &amp;gt; Actions &amp;gt; [https://status.delftinfra.net/zabbix/actionconf.php?eventsource=0# Trigger actions]&lt;br /&gt;
* Before the handover, the current FR must ensure that all active incidents are acknowledged (this includes alert emails or opened topics in SRE General, etc...), updated with the latest status, and properly documented.&lt;br /&gt;
* The incoming FR makes sure they are aware of the state of the SLA and knows what questions they wants to ask the current FR.&lt;br /&gt;
* The incoming FR makes sure they are subscribed to the right channels.&lt;br /&gt;
&lt;br /&gt;
The following steps can be done async or in person:&lt;br /&gt;
* The current FR announces/informs the incoming FR has been added to the sla-first-responder group (In Zulip&#039;s [https://chat.dsinternal.net/#narrow/stream/13-Organisational Organisational channel] if asynq).&lt;br /&gt;
* If the current FR wants to hand over responsibility for any ongoing incident, they also state which incidents they want the incoming FR to take over.&lt;br /&gt;
* If there are any particularities the incoming FR needs to be aware of, those are shared.&lt;br /&gt;
* The incoming FR asks their questions until they are satisfied and able to take over the FR&lt;br /&gt;
* The incoming FR ensures they are subscribed to the following channels on Zulip: [https://chat.dsinternal.net/#narrow/stream/23-SRE---General SRE - General], [https://chat.dsinternal.net/#narrow/stream/24-SRE-.23-Critical SRE # Critical] and if part of the SRE team [https://chat.dsinternal.net/#streams/4/SRE%20##%20Non-critical SRE ## Non-Critical] and [https://chat.dsinternal.net/#streams/5/SRE%20###%20Informational SRE ### Informational].&lt;br /&gt;
* The incoming FR announces/informs that they are now the current FR over Zulip&#039;s [https://chat.dsinternal.net/#narrow/stream/13-Organisational Organisational channel]&lt;br /&gt;
* The incoming FR removes the current FR from IPA the sla-first-responder user group and disables Zabbix calling for the current FR if they had that enabled by going to Zabbix &amp;gt; Configuration &amp;gt; Actions &amp;gt; [https://status.delftinfra.net/zabbix/actionconf.php?eventsource=0# Trigger actions]&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Incident_Handling&amp;diff=656</id>
		<title>Incident Handling</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Incident_Handling&amp;diff=656"/>
		<updated>2025-10-21T11:13:58Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: remove common issues in imperative checklist, better listed below&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= This is the process =&lt;br /&gt;
This document is an authoritative description of the process. This document supersedes all prior documents on the process. &lt;br /&gt;
&lt;br /&gt;
= Deviating from the process =&lt;br /&gt;
You may deviate from the process at any moment. A deviation should be communicated to the dev-team, preferably in the Zulip topic about the applicable incident, as soon as possible after deciding to deviate.&lt;br /&gt;
&lt;br /&gt;
= Checklist =&lt;br /&gt;
This checklist is a shorter, imperative version of [[Incident Handling#Full_procedure|the longer procedure below]]. You&#039;re encouraged to read the [[Incident Handling#Full_procedure|full procedure]] at least once to improve your understanding of the core material.&lt;br /&gt;
&lt;br /&gt;
=== Critical Incidents ===&lt;br /&gt;
Critical incidents must be resolved within 16 hours. &lt;br /&gt;
&lt;br /&gt;
# Acknowledge trigger in Zabbix.&lt;br /&gt;
# Check if the incident is still ongoing.&lt;br /&gt;
# Determine whether the incident is ongoing&lt;br /&gt;
# Determine whether clients are potentially affected, if so:&lt;br /&gt;
## notify the affected clients (Slack preferred)&lt;br /&gt;
## share the message sent to the client in the incident Zulip thread&lt;br /&gt;
# Document all actions taken in the Zulip topic.&lt;br /&gt;
# Create a plan of action.&lt;br /&gt;
# Execute plan and document results in Zabbix thread. &lt;br /&gt;
# If unresolved, create a new plan.&lt;br /&gt;
# When resolved:&lt;br /&gt;
## Verify trigger is no longer firing.&lt;br /&gt;
## Decide on when to notify affected clients (that you have notified of the incident), the incident has been resolved, and communicate this internally&lt;br /&gt;
## Mark Zulip topic as resolved if no other incidents for the host.&lt;br /&gt;
## Check for related triggers and resolve them.&lt;br /&gt;
&lt;br /&gt;
=== Non-Critical Incidents ===&lt;br /&gt;
Non-critical incidents must be acknowledged within 9 hours and resolved within 1 week.&lt;br /&gt;
&lt;br /&gt;
# Acknowledge in Zabbix thread&lt;br /&gt;
# Check metrics sheet for existing milestone&lt;br /&gt;
## If a milestone exists:&lt;br /&gt;
### Add Lynx project ID to Zulip topic&lt;br /&gt;
### Add 🔁 emoji if ID already reported&lt;br /&gt;
## If no milestone exists:&lt;br /&gt;
### Add to metrics sheet&lt;br /&gt;
### Create Lynx project (priority 99, then 20 after estimation)&lt;br /&gt;
### Create Kimai activity&lt;br /&gt;
### Document IDs in Zulip topic&lt;br /&gt;
&lt;br /&gt;
=== Informational Incidents ===&lt;br /&gt;
Informational incidents must be acknowledged within 72 hours.&lt;br /&gt;
&lt;br /&gt;
# Acknowledge in Zabbix&lt;br /&gt;
# Verify issue&lt;br /&gt;
# Take action if needed&lt;br /&gt;
&lt;br /&gt;
=== External Reports ===&lt;br /&gt;
&lt;br /&gt;
# Acknowledge receipt&lt;br /&gt;
# Classify report as critical, non-critical or informational. &lt;br /&gt;
# Create a Zulip topic in SRE # Critical, SRE ## Non-critical or SRE ### Informational (depending on classification) and add sufficient details. &lt;br /&gt;
# Proceed with checklist above for the type of incident.&lt;br /&gt;
&lt;br /&gt;
= Full procedure =&lt;br /&gt;
&lt;br /&gt;
== General Rules ==&lt;br /&gt;
&lt;br /&gt;
# When an incident is in progress, and person A is handling it, then all incidents in area X, are handled by person A, rather than the FR. Unless working day ends. Person A should communicate clearly to FR when their day is over.&lt;br /&gt;
# FR always has the last word on what solution to apply for resolving an incident.&lt;br /&gt;
&lt;br /&gt;
== Critical incidents ==&lt;br /&gt;
&#039;&#039;&#039;Critical incidents are resolved within 16 hours.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
As first responder you take on the responsiblity of seeing an incident resolved. This does not mean that you are the person required to do all the work. You can attempt to involve others to help you (often referred to as escalating the incident), but since other are not on-call, they are not obliged to help you, especially outside of normal working hours.&lt;br /&gt;
Involving multiple people can quickly be required if multiple critical incidents with different causes occur simultaneously. In that case, the First Responder usually takes on a more information management role and steers those that are brought on into resolving the issues. (Example: if a server crashes, several critical triggers can fire, but the underlying cause can quite quickly be determined to be a single issue, the crashed server. So you wouldn&#039;t need to call in people to manage each incident. But a client&#039;s service being down in one cluster while in a different cluster a different VM no longer boots is likely to be to different issues, so in order to resolve them on time you&#039;d want to call in help to resolve the incident in time).&lt;br /&gt;
&lt;br /&gt;
=== Process ===&lt;br /&gt;
The general process is made up of the following steps. Each step has additional information on how to handle/execute them in the sections below.&lt;br /&gt;
# Take responsibility for seeing the incident resolved&lt;br /&gt;
# Determine if incident is still ongoing&lt;br /&gt;
# If ongoing: Communicate to affected clients that the issue is being investigated&lt;br /&gt;
# Communicate plan/next steps (even if that is gathering information)&lt;br /&gt;
# Communicate findings/results of executed plan, go back to previous step if not resolved&lt;br /&gt;
# Resolve incident + cleanup&lt;br /&gt;
&lt;br /&gt;
During working on an incident it is expected that all communication is done in the incident&#039;s thread. This means all information to a problem can be found in a clear a predictable place. Sometimes an incident can be resolved by work done in another incident. In that case, it is required to post a link to that thread in the incident&#039;s thread with the comment that the resolution is done in that thread.&lt;br /&gt;
&lt;br /&gt;
==== Acknowledge the incident on Zabbix ====&lt;br /&gt;
The first step is to take responsibility for seeing the incident resolved by acknowledging the incident on Zabbix. Simply acknowledging the trigger suffices. It is however entirely possible that multiple critical incidents are firing at the same time. This can be a coincidence, or can be because of a share cause of failure. For example, a server crashing will cause server VMs to reboot, or the router having an connectivity issue will lead to most other VMs having connectivity issues as well. If there are multiple critical incidents, it is advised to quickly observe what&#039;s ongoing, Zabbix is the best source of firing triggers for this, and pick the incident that is likely the root cause to  &lt;br /&gt;
&lt;br /&gt;
* Acknowledging an incident on Zabbix will stop Zabbix from calling the First Responder to notify them of the ongoing incident. And stops Zabbix from posting reminders on Zulip.&lt;br /&gt;
&lt;br /&gt;
==== Determine if incident is still ongoing ====&lt;br /&gt;
The next step is to check if the reported problem is still ongoing. Depending on the observations made here your process to follow and steps needed to resolve the incident can change. There are three options:&lt;br /&gt;
# The trigger resolved itself and the problem cannot be observed. Example: HTTPS is down for a site, but the FR can access the site through HTTPS without incident.&lt;br /&gt;
# The trigger resolved itself and the problem can still be observed.&lt;br /&gt;
# The trigger is still firing but the problem cannot be observed: Our triggers might not be perfect, so it could be that something else is causing it to fire. A simple example would be that Zabbix reports that the the DNS for a site can&#039;t be resolved, but in reality there&#039;s a bug in the script we wrote that checks if the DNS resolves and the DNS resolves fine. Final note: keep in mind that an &#039;it works on my machine&#039; does not necessarily mean it works for most other people, so depening on the trigger you need to do some evaluations if your tests suffice. &lt;br /&gt;
&lt;br /&gt;
In order to make sure you are actually trying to observe the same thing as the trigger is looking for, make sure to check the trigger definition and the current data of the associated item(s). Some triggers might fire if one of multiple conditions is met (Such as a trigger that monitors the ping response time firing if the value exceeds a certain threshold, or if no data for a certain period of time was observed).&lt;br /&gt;
&lt;br /&gt;
Make sure to report your findings in the incident&#039;s thread. It&#039;s advised to post a screenshot of the relevant item(s) and your own observations. (Continuing the ping example, you would post a screenshot of the relevant values, state your conclusion why the trigger is firing, and your own observations/pings)&lt;br /&gt;
&lt;br /&gt;
==== Communicate to affected clients ====&lt;br /&gt;
If the incident is still ongoing and the service is down, we need to communicate to affected clients that we are aware of the problem and that we are investigating it. This is because critical incident usually mean the service is down, something the clients can notice/are affected by, so we to be transparent that something is going on. There are some additional notes to this though:&lt;br /&gt;
* If an incident has already resolved itself and the problem is no longer observable, we don&#039;t communicate anything. Doing so might only cause confusion, and since the client has not reported any issues, they have not had a noticeable problem with it themselves.&lt;br /&gt;
* Although a critical incident generally means that the client service is down or experiencing reduced service, not all critical incidents are of that nature. Some are more administrative, or are only an issue for Delft Solutions itself. As of writing I don&#039;t have an exhaustive list, but here is those I can think of:&lt;br /&gt;
** SSH Service is down: We don&#039;t have any clients that SSH into their services, so it&#039;s generally not a problem. But SSH is mostly used for SRE maintenance and publishing new builds. The SRE maintenance is an internal problem, so no need to communicate to the client. The publishing is done to Kaboom, preventing new builds from being published, and the two SM VMs.&lt;br /&gt;
** No backup for x days: Clients don&#039;t notice it if a backup is running late, so no need to communicate with clients. Just need to make sure the backup gets completed&lt;br /&gt;
** SSL certificate is expiring in &amp;lt; 24 hours: This is a bit dependent on how soon this incident is being handled, but if it handled quickly, the certificate never actually expired, and there has not been any disruption to the client&#039;s service, so no need for communicating about it.&lt;br /&gt;
* Determining which clients are being affected can be done by looking at the host&#039;s DNS in the trigger, and/or looking up the VM in Proxmox and checking the tags of the VMs for client names. In the case that this issue is causing multiple other critical triggers to fire, you would have to check for which clients are affected by those incidents.&lt;br /&gt;
* Communicating to DS about ongoing incidents is usually assumed to be automatically have been done by the fact that the incident was reported on Zulip.&lt;br /&gt;
&lt;br /&gt;
As always, report the decisions taken and actions made in the incident thread. (e.g.: I&#039;ve sent a message in the Slack to let Kaboom know that we aware of problem x, and that we are investigating it)&lt;br /&gt;
&lt;br /&gt;
==== Communicate plan/next steps + Communicate findings/results of executed plan ====&lt;br /&gt;
This is the main part of handling an incident. There are several actions you can take in these steps, but at the basis they consist of sharing your next steps, performing those, and reporting the results. The reason all this needs to be reported is to ensure that all known information about a problem is logged, making it easier for someone else to be onboarded into the issue, for later reference if a similar issue is encountered, and even for use during the incident itself in case an older configuration needs to be referenced after you changed it.&lt;br /&gt;
The objective from these steps is determining what is actually wrong and how to resolve it. Depending on the observations made earlier on whether the incident is still ongoing and is (still) observable your investigation can go into different directions. (e.g. Find the underlying cause for a trigger, or determining why the trigger is firing while it likely shouldn&#039;t, and then how to resolve that underlying cause or how to update the trigger to work better)&lt;br /&gt;
&lt;br /&gt;
There are three main types of steps defined, but you are not limited to these:&lt;br /&gt;
# Hypothesis: If you have an idea what could be causing it, you would state your hypothesis and your next step would be to prove that hypothesis. For example, for an incident &#039;SSH service is down on X&#039; your hypothesis could be that this is due to &#039;MaxStartups&#039; throttling, which can be proven by &#039;grep&#039;ing journalctl for that, and compare the start and end times of throttling with the timestamps of the item reporting the status of the SSH service.&lt;br /&gt;
# Information gathering: Sometimes it just helps to get some facts about the situation collected. What is usefull information that is relevant depends on the triggers, but some examples are: The syslog/journalctl of the host from around the time of the incident (it can contain a reference to the an underlying problem in various levels of explicitness), the ping response from several hosts on the route to a host or a traceroute (this helps with networking issues). The gathered information is usually intended to help you come up with an hypothesis on what&#039;s wrong.&lt;br /&gt;
# Investigative: The most rigorous of process. The full process is described here originally [https://docs.google.com/document/d/1AQYJM1Q9l2Tyk6zfCVaQ2aEq-dpbfUH5okE88bpKkhw/edit#heading=h.5fq2skijqbdc Drive - Final Coundown - General Investigative Process]. To summarize, when you don&#039;t know why something is failing, and/or don&#039;t have any decent hypotheses to follow up, you can follow this process to systematically find the problem.&lt;br /&gt;
&lt;br /&gt;
Regarding the resolution to an incident: The resolution to any incident is usually one of two things:&lt;br /&gt;
# Fix the underlying problem.&lt;br /&gt;
# Fix the trigger itself.&lt;br /&gt;
Fixing the trigger is relatively straightforward, but do make sure document in the thread what you changed to which trigger.&lt;br /&gt;
Fixing the underlying problem can be more complex. A trade-off needs to be made sometimes between resolving technical debt, or simply patching the current system to resolve the issue. We usually look for a resolution that ensures that the problem won&#039;t re-occur soon, or makes it unexpected/unlikely for the problem to re-occur. Taking into account the time frame that is available to resolve the incident you can make some trade-offs. An example would be: normal backups of VMs are failing due to the Proxmox backup server being down/unreachable and it is determined that this cannot be resolved at that moment. We can set up automatic backups to local storage temporary to resolve the immediate problem and ensure we keep our SLO&#039;s versus setting up a new Proxmox Backup server at a different location. Since we don&#039;t have much time to resolve the problem, the resolution would be to set up the automatic backups to local storage, and set up a new Proxmox Backup Server later as a seperate issue.&lt;br /&gt;
&lt;br /&gt;
===== Some known issues and their resolutions =====&lt;br /&gt;
* SSH service is down: The internet is a vile place. There&#039;s constant port scanning and hacking attempts ongoing to any machine connected to the internet (mostly IPv4). Due to this, SSH has a throttling functionality build in to prevent a system from being DDOS&#039;ed by the amount of malicious SSH requests. This throttling can cause the Zabbix server from being denied an SSH connection, of which several failures fire this trigger. This hypothesis can be proven with a `journalctl -u ssh | grep &#039;MaxStartups throttling&#039;` (you probably want to select a relevant time period with `--since &amp;quot;2 hours ago&amp;quot;` or something similar to prevent having to process a month of logging). You can then compare the throttling start and end times with the timestamps of the item data itself. The resolution for the issue is to add our custom ssh configuration [https://chat.dsinternal.net/#narrow/stream/23-SRE---General/topic/DS.20Whitelisted.20Custom.20SSH.20configuration/near/1620 Custom SSH Configuration].&lt;br /&gt;
* No backup for 3 days: Are S3 backup is very slow. Not much to prove as an underlying issue here. What needs to be done is check that the backup process is ongoing. The Zabbix latest data can be checked to verify that backups are running by checking that that days backups were done for the smaller buckets. The devteam email can be checked for if the backup process could not start on day due to it already running (it takes 24+ hours, and an attempt to start it is done each day by cron).&lt;br /&gt;
* git.* HTTPS is down: On Sunday mostly, Gitlab gets automatically updated, but this incurs some downtime as the service is restarted. This is usually short enough to not be reported to Zulip as per our settings, but sometimes it&#039;s longer. If the service does not stay down, the issue can be just resolved.&lt;br /&gt;
&lt;br /&gt;
==== Resolve incident + cleanup ====&lt;br /&gt;
When you&#039;ve executed and verified the resolution in the previous steps we can proceed resolving the issue in our Mattermost integration. Resolving an incident can be done by doing the following:&lt;br /&gt;
# Verify that the trigger is no longer firing. An incident will be immediately re-opened if the trigger is still firing, and the incident cannot be considered resolved if the trigger is still firing. If the trigger is still firing but you&#039;re sure that you&#039;ve resolved the problem, you might need to force the item the trigger depends on to update. This can be done by finding the item in the host&#039;s configuration on Zabbix and selecting &#039;Execute Now&#039;, after a short period this should force Zabbix to re-execute the item. You can check the timestamps in the latest data of an item to check if it was updated.&lt;br /&gt;
# Close the incident by marking the topic as resolved, when there are no other triggers firing for the host.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, some problems cause multiple critical and non-critical triggers to fire. This means we have to check Zabbix and Zulip for other fired triggers and ongoing incidents. The goal is to identify critical and non-critical incidents that were caused by the incident/underlying issue you just resolved.&lt;br /&gt;
# First, these incidents need to be acknowledged on Zabbix, and in the acknowledgement message you mention the incident/problem that caused this.&lt;br /&gt;
# Next, check the incident tracked by the integration on Mattermost using the `?ongoing` command. Resolve incidents that were (re-)opened by this incident by executing the following steps. If the first two fail (problem still persists, trigger is still firing), the incident needs to considered it&#039;s own issue and the relevant process needs to be followed (critical or non-critical depending on criticality).&lt;br /&gt;
## Ensuring the mentioned problem is no longer observable&lt;br /&gt;
## The trigger has resolved (You might need to force an update with `Execute Now`).&lt;br /&gt;
## Posting a link to the main incident you resolved with the comment that the underlying problem was resolved in that topic.&lt;br /&gt;
## Closing the incident by marking the topic as resolved, when there are no other triggers firing for the host.&lt;br /&gt;
&lt;br /&gt;
When you are done, there should be no more critical triggers firing in Zabbix or open in the Zabbix-Mattermost integration, for which no-one has taken responsibility or you have taken responsibility for and are not actively handling.&lt;br /&gt;
&lt;br /&gt;
== Non-Critical incidents ==&lt;br /&gt;
* Non-critical incidents are acknowledged within 9 hours and resolved within one week.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledging ===&lt;br /&gt;
Fully acknowledging a non-critical incident requires the following tasks to have been completed:&lt;br /&gt;
* Acknowledging the incident on Zabbix, which means you take responsibility of completing the steps listed below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The next steps don&#039;t have to be done immediately, as they have dependencies, but be started and scheduled for completion the next work day.&lt;br /&gt;
&lt;br /&gt;
Check if there&#039;s already a uncompleted milestone for this host with this issue in the metrics sheet.&lt;br /&gt;
If a milestone is already present:&lt;br /&gt;
* Report in the topic the Lynx project ID for resolving this issue.&lt;br /&gt;
* If the ID has already been reported in the topic, we don&#039;t want to report it again and again, instead add the 🔁 emoji (:repeat:) under the zabbix bot alert&lt;br /&gt;
&lt;br /&gt;
If a milestone is NOT already present:&lt;br /&gt;
* Add the non-critical incident as a milestone in the metrics sheet, following the naming convention&lt;br /&gt;
** Start date is the date of the incident&lt;br /&gt;
** DoD states what needs to be true for the non-critical incident to be consider resolved&lt;br /&gt;
* Add the non-critical incident to Lynx as a project&lt;br /&gt;
** Follow the naming convention below for the title &amp;amp; project ID&lt;br /&gt;
** Tasks need to be added&lt;br /&gt;
** Final tasks needs to have the SLO deadline set as &#039;constraint&#039;&lt;br /&gt;
** Project priority is set to 99 while not estimated yet. After the estimation is done, the priority should be set to 20&lt;br /&gt;
** The tasks are estimated for SP&lt;br /&gt;
* The Lynx project ID is reported in the non-critical incident&#039;s topic on Zulip, and logged in the metrics sheet&lt;br /&gt;
* A Kimai activity is created in Kimai for the non-critical incident, following the naming convetion&lt;br /&gt;
&lt;br /&gt;
==== Naming convention ====&lt;br /&gt;
* Kimai activity name needs to follow the pattern: &#039;&amp;lt;YYYY-MM&amp;gt; &amp;lt;problem_title&amp;gt;&#039;. For &amp;lt;problem_title&amp;gt;, incorporate the trigger title and hostname for clarity.&lt;br /&gt;
* Milestone name needs to follow the pattern: &#039;Delft Solutions Hosting Incident response work &amp;lt;kimai_activity_name&amp;gt;&#039;&lt;br /&gt;
* Lynx project name needs to follow the pattern: &#039;Delft Solutions Hosting Incident response work &amp;lt;kimai_activity_name&amp;gt;&#039;&lt;br /&gt;
* Lynx project ID needs to follow the pattern: &#039;SRE&amp;lt;YYMM&amp;gt;&amp;lt;XXX&amp;gt;&#039;, where &amp;lt;XXX&amp;gt; is some three letter shorthand that relates to the problem/host&lt;br /&gt;
&lt;br /&gt;
== Informational incidents ==&lt;br /&gt;
* Informational incidents are acknowledged within 72 hours&lt;br /&gt;
&lt;br /&gt;
Checklist&lt;br /&gt;
# Acknowledge on Zabbix&lt;br /&gt;
# Sanity check the event, post result in thread&lt;br /&gt;
# If action needed, perform action&lt;br /&gt;
&lt;br /&gt;
== If an incident is reported by other means than the Zabbix-Zulip integration ==&lt;br /&gt;
Besides the automated Zabbix-Zulip integration, incidents can also be reported through emails from cron jobs, direct emails from customers, or topics in SRE General (such as alerts about Zulip updates or issues raised by colleagues), etc.&lt;br /&gt;
# Acknowledge receipt.&lt;br /&gt;
# Classify the incident as critical, non-critical, or informational.&lt;br /&gt;
# Create an topic in the relevant SRE channel, stating the problem and that you is responsible for resolving it.&lt;br /&gt;
# Proceed to treat the incident according to the criticality you just classified it as. (So for a critical incident, it means you now start the critical incident handling process)&lt;br /&gt;
&lt;br /&gt;
== Handover ==&lt;br /&gt;
See [[Handover]]&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Incident_Handling&amp;diff=655</id>
		<title>Incident Handling</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Incident_Handling&amp;diff=655"/>
		<updated>2025-10-21T11:10:24Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: /* Deviating from the process */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= This is the process =&lt;br /&gt;
This document is an authoritative description of the process. This document supersedes all prior documents on the process. &lt;br /&gt;
&lt;br /&gt;
= Deviating from the process =&lt;br /&gt;
You may deviate from the process at any moment. A deviation should be communicated to the dev-team, preferably in the Zulip topic about the applicable incident, as soon as possible after deciding to deviate.&lt;br /&gt;
&lt;br /&gt;
= Checklist =&lt;br /&gt;
This checklist is a shorter, imperative version of [[Incident Handling#Full_procedure|the longer procedure below]]. You&#039;re encouraged to read the [[Incident Handling#Full_procedure|full procedure]] at least once to improve your understanding of the core material.&lt;br /&gt;
&lt;br /&gt;
=== Critical Incidents ===&lt;br /&gt;
Critical incidents must be resolved within 16 hours. &lt;br /&gt;
&lt;br /&gt;
# Acknowledge trigger in Zabbix.&lt;br /&gt;
# Check if the incident is still ongoing.&lt;br /&gt;
# Determine whether the incident is ongoing&lt;br /&gt;
# Determine whether clients are potentially affected, if so:&lt;br /&gt;
## notify the affected clients (Slack preferred)&lt;br /&gt;
## share the message sent to the client in the incident Zulip thread&lt;br /&gt;
# Document all actions taken in the Zulip topic.&lt;br /&gt;
# Create a plan of action.&lt;br /&gt;
# Execute plan and document results in Zabbix thread. &lt;br /&gt;
# If unresolved, create a new plan.&lt;br /&gt;
# When resolved:&lt;br /&gt;
## Verify trigger is no longer firing.&lt;br /&gt;
## Decide on when to notify affected clients (that you have notified of the incident), the incident has been resolved, and communicate this internally&lt;br /&gt;
## Mark Zulip topic as resolved if no other incidents for the host.&lt;br /&gt;
## Check for related triggers and resolve them.&lt;br /&gt;
&lt;br /&gt;
Common issues that have occurred previously, and &#039;&#039;could&#039;&#039; occur again:&lt;br /&gt;
* SSH down: Check MaxStartups throttling, apply custom SSH config&lt;br /&gt;
* No backup: Verify backup process is running, check the devteam email&lt;br /&gt;
* HTTPS down on Sunday: this can be due to GitLab updates&lt;br /&gt;
&lt;br /&gt;
=== Non-Critical Incidents ===&lt;br /&gt;
Non-critical incidents must be acknowledged within 9 hours and resolved within 1 week.&lt;br /&gt;
&lt;br /&gt;
# Acknowledge in Zabbix thread&lt;br /&gt;
# Check metrics sheet for existing milestone&lt;br /&gt;
## If a milestone exists:&lt;br /&gt;
### Add Lynx project ID to Zulip topic&lt;br /&gt;
### Add 🔁 emoji if ID already reported&lt;br /&gt;
## If no milestone exists:&lt;br /&gt;
### Add to metrics sheet&lt;br /&gt;
### Create Lynx project (priority 99, then 20 after estimation)&lt;br /&gt;
### Create Kimai activity&lt;br /&gt;
### Document IDs in Zulip topic&lt;br /&gt;
&lt;br /&gt;
=== Informational Incidents ===&lt;br /&gt;
Informational incidents must be acknowledged within 72 hours.&lt;br /&gt;
&lt;br /&gt;
# Acknowledge in Zabbix&lt;br /&gt;
# Verify issue&lt;br /&gt;
# Take action if needed&lt;br /&gt;
&lt;br /&gt;
=== External Reports ===&lt;br /&gt;
&lt;br /&gt;
# Acknowledge receipt&lt;br /&gt;
# Classify report as critical, non-critical or informational. &lt;br /&gt;
# Create a Zulip topic in SRE # Critical, SRE ## Non-critical or SRE ### Informational (depending on classification) and add sufficient details. &lt;br /&gt;
# Proceed with checklist above for the type of incident.&lt;br /&gt;
&lt;br /&gt;
= Full procedure =&lt;br /&gt;
&lt;br /&gt;
== General Rules ==&lt;br /&gt;
&lt;br /&gt;
# When an incident is in progress, and person A is handling it, then all incidents in area X, are handled by person A, rather than the FR. Unless working day ends. Person A should communicate clearly to FR when their day is over.&lt;br /&gt;
# FR always has the last word on what solution to apply for resolving an incident.&lt;br /&gt;
&lt;br /&gt;
== Critical incidents ==&lt;br /&gt;
&#039;&#039;&#039;Critical incidents are resolved within 16 hours.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
As first responder you take on the responsiblity of seeing an incident resolved. This does not mean that you are the person required to do all the work. You can attempt to involve others to help you (often referred to as escalating the incident), but since other are not on-call, they are not obliged to help you, especially outside of normal working hours.&lt;br /&gt;
Involving multiple people can quickly be required if multiple critical incidents with different causes occur simultaneously. In that case, the First Responder usually takes on a more information management role and steers those that are brought on into resolving the issues. (Example: if a server crashes, several critical triggers can fire, but the underlying cause can quite quickly be determined to be a single issue, the crashed server. So you wouldn&#039;t need to call in people to manage each incident. But a client&#039;s service being down in one cluster while in a different cluster a different VM no longer boots is likely to be to different issues, so in order to resolve them on time you&#039;d want to call in help to resolve the incident in time).&lt;br /&gt;
&lt;br /&gt;
=== Process ===&lt;br /&gt;
The general process is made up of the following steps. Each step has additional information on how to handle/execute them in the sections below.&lt;br /&gt;
# Take responsibility for seeing the incident resolved&lt;br /&gt;
# Determine if incident is still ongoing&lt;br /&gt;
# If ongoing: Communicate to affected clients that the issue is being investigated&lt;br /&gt;
# Communicate plan/next steps (even if that is gathering information)&lt;br /&gt;
# Communicate findings/results of executed plan, go back to previous step if not resolved&lt;br /&gt;
# Resolve incident + cleanup&lt;br /&gt;
&lt;br /&gt;
During working on an incident it is expected that all communication is done in the incident&#039;s thread. This means all information to a problem can be found in a clear a predictable place. Sometimes an incident can be resolved by work done in another incident. In that case, it is required to post a link to that thread in the incident&#039;s thread with the comment that the resolution is done in that thread.&lt;br /&gt;
&lt;br /&gt;
==== Acknowledge the incident on Zabbix ====&lt;br /&gt;
The first step is to take responsibility for seeing the incident resolved by acknowledging the incident on Zabbix. Simply acknowledging the trigger suffices. It is however entirely possible that multiple critical incidents are firing at the same time. This can be a coincidence, or can be because of a share cause of failure. For example, a server crashing will cause server VMs to reboot, or the router having an connectivity issue will lead to most other VMs having connectivity issues as well. If there are multiple critical incidents, it is advised to quickly observe what&#039;s ongoing, Zabbix is the best source of firing triggers for this, and pick the incident that is likely the root cause to  &lt;br /&gt;
&lt;br /&gt;
* Acknowledging an incident on Zabbix will stop Zabbix from calling the First Responder to notify them of the ongoing incident. And stops Zabbix from posting reminders on Zulip.&lt;br /&gt;
&lt;br /&gt;
==== Determine if incident is still ongoing ====&lt;br /&gt;
The next step is to check if the reported problem is still ongoing. Depending on the observations made here your process to follow and steps needed to resolve the incident can change. There are three options:&lt;br /&gt;
# The trigger resolved itself and the problem cannot be observed. Example: HTTPS is down for a site, but the FR can access the site through HTTPS without incident.&lt;br /&gt;
# The trigger resolved itself and the problem can still be observed.&lt;br /&gt;
# The trigger is still firing but the problem cannot be observed: Our triggers might not be perfect, so it could be that something else is causing it to fire. A simple example would be that Zabbix reports that the the DNS for a site can&#039;t be resolved, but in reality there&#039;s a bug in the script we wrote that checks if the DNS resolves and the DNS resolves fine. Final note: keep in mind that an &#039;it works on my machine&#039; does not necessarily mean it works for most other people, so depening on the trigger you need to do some evaluations if your tests suffice. &lt;br /&gt;
&lt;br /&gt;
In order to make sure you are actually trying to observe the same thing as the trigger is looking for, make sure to check the trigger definition and the current data of the associated item(s). Some triggers might fire if one of multiple conditions is met (Such as a trigger that monitors the ping response time firing if the value exceeds a certain threshold, or if no data for a certain period of time was observed).&lt;br /&gt;
&lt;br /&gt;
Make sure to report your findings in the incident&#039;s thread. It&#039;s advised to post a screenshot of the relevant item(s) and your own observations. (Continuing the ping example, you would post a screenshot of the relevant values, state your conclusion why the trigger is firing, and your own observations/pings)&lt;br /&gt;
&lt;br /&gt;
==== Communicate to affected clients ====&lt;br /&gt;
If the incident is still ongoing and the service is down, we need to communicate to affected clients that we are aware of the problem and that we are investigating it. This is because critical incident usually mean the service is down, something the clients can notice/are affected by, so we to be transparent that something is going on. There are some additional notes to this though:&lt;br /&gt;
* If an incident has already resolved itself and the problem is no longer observable, we don&#039;t communicate anything. Doing so might only cause confusion, and since the client has not reported any issues, they have not had a noticeable problem with it themselves.&lt;br /&gt;
* Although a critical incident generally means that the client service is down or experiencing reduced service, not all critical incidents are of that nature. Some are more administrative, or are only an issue for Delft Solutions itself. As of writing I don&#039;t have an exhaustive list, but here is those I can think of:&lt;br /&gt;
** SSH Service is down: We don&#039;t have any clients that SSH into their services, so it&#039;s generally not a problem. But SSH is mostly used for SRE maintenance and publishing new builds. The SRE maintenance is an internal problem, so no need to communicate to the client. The publishing is done to Kaboom, preventing new builds from being published, and the two SM VMs.&lt;br /&gt;
** No backup for x days: Clients don&#039;t notice it if a backup is running late, so no need to communicate with clients. Just need to make sure the backup gets completed&lt;br /&gt;
** SSL certificate is expiring in &amp;lt; 24 hours: This is a bit dependent on how soon this incident is being handled, but if it handled quickly, the certificate never actually expired, and there has not been any disruption to the client&#039;s service, so no need for communicating about it.&lt;br /&gt;
* Determining which clients are being affected can be done by looking at the host&#039;s DNS in the trigger, and/or looking up the VM in Proxmox and checking the tags of the VMs for client names. In the case that this issue is causing multiple other critical triggers to fire, you would have to check for which clients are affected by those incidents.&lt;br /&gt;
* Communicating to DS about ongoing incidents is usually assumed to be automatically have been done by the fact that the incident was reported on Zulip.&lt;br /&gt;
&lt;br /&gt;
As always, report the decisions taken and actions made in the incident thread. (e.g.: I&#039;ve sent a message in the Slack to let Kaboom know that we aware of problem x, and that we are investigating it)&lt;br /&gt;
&lt;br /&gt;
==== Communicate plan/next steps + Communicate findings/results of executed plan ====&lt;br /&gt;
This is the main part of handling an incident. There are several actions you can take in these steps, but at the basis they consist of sharing your next steps, performing those, and reporting the results. The reason all this needs to be reported is to ensure that all known information about a problem is logged, making it easier for someone else to be onboarded into the issue, for later reference if a similar issue is encountered, and even for use during the incident itself in case an older configuration needs to be referenced after you changed it.&lt;br /&gt;
The objective from these steps is determining what is actually wrong and how to resolve it. Depending on the observations made earlier on whether the incident is still ongoing and is (still) observable your investigation can go into different directions. (e.g. Find the underlying cause for a trigger, or determining why the trigger is firing while it likely shouldn&#039;t, and then how to resolve that underlying cause or how to update the trigger to work better)&lt;br /&gt;
&lt;br /&gt;
There are three main types of steps defined, but you are not limited to these:&lt;br /&gt;
# Hypothesis: If you have an idea what could be causing it, you would state your hypothesis and your next step would be to prove that hypothesis. For example, for an incident &#039;SSH service is down on X&#039; your hypothesis could be that this is due to &#039;MaxStartups&#039; throttling, which can be proven by &#039;grep&#039;ing journalctl for that, and compare the start and end times of throttling with the timestamps of the item reporting the status of the SSH service.&lt;br /&gt;
# Information gathering: Sometimes it just helps to get some facts about the situation collected. What is usefull information that is relevant depends on the triggers, but some examples are: The syslog/journalctl of the host from around the time of the incident (it can contain a reference to the an underlying problem in various levels of explicitness), the ping response from several hosts on the route to a host or a traceroute (this helps with networking issues). The gathered information is usually intended to help you come up with an hypothesis on what&#039;s wrong.&lt;br /&gt;
# Investigative: The most rigorous of process. The full process is described here originally [https://docs.google.com/document/d/1AQYJM1Q9l2Tyk6zfCVaQ2aEq-dpbfUH5okE88bpKkhw/edit#heading=h.5fq2skijqbdc Drive - Final Coundown - General Investigative Process]. To summarize, when you don&#039;t know why something is failing, and/or don&#039;t have any decent hypotheses to follow up, you can follow this process to systematically find the problem.&lt;br /&gt;
&lt;br /&gt;
Regarding the resolution to an incident: The resolution to any incident is usually one of two things:&lt;br /&gt;
# Fix the underlying problem.&lt;br /&gt;
# Fix the trigger itself.&lt;br /&gt;
Fixing the trigger is relatively straightforward, but do make sure document in the thread what you changed to which trigger.&lt;br /&gt;
Fixing the underlying problem can be more complex. A trade-off needs to be made sometimes between resolving technical debt, or simply patching the current system to resolve the issue. We usually look for a resolution that ensures that the problem won&#039;t re-occur soon, or makes it unexpected/unlikely for the problem to re-occur. Taking into account the time frame that is available to resolve the incident you can make some trade-offs. An example would be: normal backups of VMs are failing due to the Proxmox backup server being down/unreachable and it is determined that this cannot be resolved at that moment. We can set up automatic backups to local storage temporary to resolve the immediate problem and ensure we keep our SLO&#039;s versus setting up a new Proxmox Backup server at a different location. Since we don&#039;t have much time to resolve the problem, the resolution would be to set up the automatic backups to local storage, and set up a new Proxmox Backup Server later as a seperate issue.&lt;br /&gt;
&lt;br /&gt;
===== Some known issues and their resolutions =====&lt;br /&gt;
* SSH service is down: The internet is a vile place. There&#039;s constant port scanning and hacking attempts ongoing to any machine connected to the internet (mostly IPv4). Due to this, SSH has a throttling functionality build in to prevent a system from being DDOS&#039;ed by the amount of malicious SSH requests. This throttling can cause the Zabbix server from being denied an SSH connection, of which several failures fire this trigger. This hypothesis can be proven with a `journalctl -u ssh | grep &#039;MaxStartups throttling&#039;` (you probably want to select a relevant time period with `--since &amp;quot;2 hours ago&amp;quot;` or something similar to prevent having to process a month of logging). You can then compare the throttling start and end times with the timestamps of the item data itself. The resolution for the issue is to add our custom ssh configuration [https://chat.dsinternal.net/#narrow/stream/23-SRE---General/topic/DS.20Whitelisted.20Custom.20SSH.20configuration/near/1620 Custom SSH Configuration].&lt;br /&gt;
* No backup for 3 days: Are S3 backup is very slow. Not much to prove as an underlying issue here. What needs to be done is check that the backup process is ongoing. The Zabbix latest data can be checked to verify that backups are running by checking that that days backups were done for the smaller buckets. The devteam email can be checked for if the backup process could not start on day due to it already running (it takes 24+ hours, and an attempt to start it is done each day by cron).&lt;br /&gt;
* git.* HTTPS is down: On Sunday mostly, Gitlab gets automatically updated, but this incurs some downtime as the service is restarted. This is usually short enough to not be reported to Zulip as per our settings, but sometimes it&#039;s longer. If the service does not stay down, the issue can be just resolved.&lt;br /&gt;
&lt;br /&gt;
==== Resolve incident + cleanup ====&lt;br /&gt;
When you&#039;ve executed and verified the resolution in the previous steps we can proceed resolving the issue in our Mattermost integration. Resolving an incident can be done by doing the following:&lt;br /&gt;
# Verify that the trigger is no longer firing. An incident will be immediately re-opened if the trigger is still firing, and the incident cannot be considered resolved if the trigger is still firing. If the trigger is still firing but you&#039;re sure that you&#039;ve resolved the problem, you might need to force the item the trigger depends on to update. This can be done by finding the item in the host&#039;s configuration on Zabbix and selecting &#039;Execute Now&#039;, after a short period this should force Zabbix to re-execute the item. You can check the timestamps in the latest data of an item to check if it was updated.&lt;br /&gt;
# Close the incident by marking the topic as resolved, when there are no other triggers firing for the host.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, some problems cause multiple critical and non-critical triggers to fire. This means we have to check Zabbix and Zulip for other fired triggers and ongoing incidents. The goal is to identify critical and non-critical incidents that were caused by the incident/underlying issue you just resolved.&lt;br /&gt;
# First, these incidents need to be acknowledged on Zabbix, and in the acknowledgement message you mention the incident/problem that caused this.&lt;br /&gt;
# Next, check the incident tracked by the integration on Mattermost using the `?ongoing` command. Resolve incidents that were (re-)opened by this incident by executing the following steps. If the first two fail (problem still persists, trigger is still firing), the incident needs to considered it&#039;s own issue and the relevant process needs to be followed (critical or non-critical depending on criticality).&lt;br /&gt;
## Ensuring the mentioned problem is no longer observable&lt;br /&gt;
## The trigger has resolved (You might need to force an update with `Execute Now`).&lt;br /&gt;
## Posting a link to the main incident you resolved with the comment that the underlying problem was resolved in that topic.&lt;br /&gt;
## Closing the incident by marking the topic as resolved, when there are no other triggers firing for the host.&lt;br /&gt;
&lt;br /&gt;
When you are done, there should be no more critical triggers firing in Zabbix or open in the Zabbix-Mattermost integration, for which no-one has taken responsibility or you have taken responsibility for and are not actively handling.&lt;br /&gt;
&lt;br /&gt;
== Non-Critical incidents ==&lt;br /&gt;
* Non-critical incidents are acknowledged within 9 hours and resolved within one week.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledging ===&lt;br /&gt;
Fully acknowledging a non-critical incident requires the following tasks to have been completed:&lt;br /&gt;
* Acknowledging the incident on Zabbix, which means you take responsibility of completing the steps listed below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The next steps don&#039;t have to be done immediately, as they have dependencies, but be started and scheduled for completion the next work day.&lt;br /&gt;
&lt;br /&gt;
Check if there&#039;s already a uncompleted milestone for this host with this issue in the metrics sheet.&lt;br /&gt;
If a milestone is already present:&lt;br /&gt;
* Report in the topic the Lynx project ID for resolving this issue.&lt;br /&gt;
* If the ID has already been reported in the topic, we don&#039;t want to report it again and again, instead add the 🔁 emoji (:repeat:) under the zabbix bot alert&lt;br /&gt;
&lt;br /&gt;
If a milestone is NOT already present:&lt;br /&gt;
* Add the non-critical incident as a milestone in the metrics sheet, following the naming convention&lt;br /&gt;
** Start date is the date of the incident&lt;br /&gt;
** DoD states what needs to be true for the non-critical incident to be consider resolved&lt;br /&gt;
* Add the non-critical incident to Lynx as a project&lt;br /&gt;
** Follow the naming convention below for the title &amp;amp; project ID&lt;br /&gt;
** Tasks need to be added&lt;br /&gt;
** Final tasks needs to have the SLO deadline set as &#039;constraint&#039;&lt;br /&gt;
** Project priority is set to 99 while not estimated yet. After the estimation is done, the priority should be set to 20&lt;br /&gt;
** The tasks are estimated for SP&lt;br /&gt;
* The Lynx project ID is reported in the non-critical incident&#039;s topic on Zulip, and logged in the metrics sheet&lt;br /&gt;
* A Kimai activity is created in Kimai for the non-critical incident, following the naming convetion&lt;br /&gt;
&lt;br /&gt;
==== Naming convention ====&lt;br /&gt;
* Kimai activity name needs to follow the pattern: &#039;&amp;lt;YYYY-MM&amp;gt; &amp;lt;problem_title&amp;gt;&#039;. For &amp;lt;problem_title&amp;gt;, incorporate the trigger title and hostname for clarity.&lt;br /&gt;
* Milestone name needs to follow the pattern: &#039;Delft Solutions Hosting Incident response work &amp;lt;kimai_activity_name&amp;gt;&#039;&lt;br /&gt;
* Lynx project name needs to follow the pattern: &#039;Delft Solutions Hosting Incident response work &amp;lt;kimai_activity_name&amp;gt;&#039;&lt;br /&gt;
* Lynx project ID needs to follow the pattern: &#039;SRE&amp;lt;YYMM&amp;gt;&amp;lt;XXX&amp;gt;&#039;, where &amp;lt;XXX&amp;gt; is some three letter shorthand that relates to the problem/host&lt;br /&gt;
&lt;br /&gt;
== Informational incidents ==&lt;br /&gt;
* Informational incidents are acknowledged within 72 hours&lt;br /&gt;
&lt;br /&gt;
Checklist&lt;br /&gt;
# Acknowledge on Zabbix&lt;br /&gt;
# Sanity check the event, post result in thread&lt;br /&gt;
# If action needed, perform action&lt;br /&gt;
&lt;br /&gt;
== If an incident is reported by other means than the Zabbix-Zulip integration ==&lt;br /&gt;
Besides the automated Zabbix-Zulip integration, incidents can also be reported through emails from cron jobs, direct emails from customers, or topics in SRE General (such as alerts about Zulip updates or issues raised by colleagues), etc.&lt;br /&gt;
# Acknowledge receipt.&lt;br /&gt;
# Classify the incident as critical, non-critical, or informational.&lt;br /&gt;
# Create an topic in the relevant SRE channel, stating the problem and that you is responsible for resolving it.&lt;br /&gt;
# Proceed to treat the incident according to the criticality you just classified it as. (So for a critical incident, it means you now start the critical incident handling process)&lt;br /&gt;
&lt;br /&gt;
== Handover ==&lt;br /&gt;
See [[Handover]]&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
	<entry>
		<id>https://docs.delftsolutions.nl/index.php?title=Incident_Handling&amp;diff=654</id>
		<title>Incident Handling</title>
		<link rel="alternate" type="text/html" href="https://docs.delftsolutions.nl/index.php?title=Incident_Handling&amp;diff=654"/>
		<updated>2025-10-21T11:09:52Z</updated>

		<summary type="html">&lt;p&gt;Jakobbuis: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= This is the process =&lt;br /&gt;
This document is an authoritative description of the process. This document supersedes all prior documents on the process. &lt;br /&gt;
&lt;br /&gt;
= Deviating from the process =&lt;br /&gt;
You may deviate from the process at any moment. A deviation should be communicated to the dev-team, preferably in the Zulip topic about the applicable incident, ideally as soon as possible after deciding to deviate.  &lt;br /&gt;
&lt;br /&gt;
= Checklist =&lt;br /&gt;
This checklist is a shorter, imperative version of [[Incident Handling#Full_procedure|the longer procedure below]]. You&#039;re encouraged to read the [[Incident Handling#Full_procedure|full procedure]] at least once to improve your understanding of the core material.&lt;br /&gt;
&lt;br /&gt;
=== Critical Incidents ===&lt;br /&gt;
Critical incidents must be resolved within 16 hours. &lt;br /&gt;
&lt;br /&gt;
# Acknowledge trigger in Zabbix.&lt;br /&gt;
# Check if the incident is still ongoing.&lt;br /&gt;
# Determine whether the incident is ongoing&lt;br /&gt;
# Determine whether clients are potentially affected, if so:&lt;br /&gt;
## notify the affected clients (Slack preferred)&lt;br /&gt;
## share the message sent to the client in the incident Zulip thread&lt;br /&gt;
# Document all actions taken in the Zulip topic.&lt;br /&gt;
# Create a plan of action.&lt;br /&gt;
# Execute plan and document results in Zabbix thread. &lt;br /&gt;
# If unresolved, create a new plan.&lt;br /&gt;
# When resolved:&lt;br /&gt;
## Verify trigger is no longer firing.&lt;br /&gt;
## Decide on when to notify affected clients (that you have notified of the incident), the incident has been resolved, and communicate this internally&lt;br /&gt;
## Mark Zulip topic as resolved if no other incidents for the host.&lt;br /&gt;
## Check for related triggers and resolve them.&lt;br /&gt;
&lt;br /&gt;
Common issues that have occurred previously, and &#039;&#039;could&#039;&#039; occur again:&lt;br /&gt;
* SSH down: Check MaxStartups throttling, apply custom SSH config&lt;br /&gt;
* No backup: Verify backup process is running, check the devteam email&lt;br /&gt;
* HTTPS down on Sunday: this can be due to GitLab updates&lt;br /&gt;
&lt;br /&gt;
=== Non-Critical Incidents ===&lt;br /&gt;
Non-critical incidents must be acknowledged within 9 hours and resolved within 1 week.&lt;br /&gt;
&lt;br /&gt;
# Acknowledge in Zabbix thread&lt;br /&gt;
# Check metrics sheet for existing milestone&lt;br /&gt;
## If a milestone exists:&lt;br /&gt;
### Add Lynx project ID to Zulip topic&lt;br /&gt;
### Add 🔁 emoji if ID already reported&lt;br /&gt;
## If no milestone exists:&lt;br /&gt;
### Add to metrics sheet&lt;br /&gt;
### Create Lynx project (priority 99, then 20 after estimation)&lt;br /&gt;
### Create Kimai activity&lt;br /&gt;
### Document IDs in Zulip topic&lt;br /&gt;
&lt;br /&gt;
=== Informational Incidents ===&lt;br /&gt;
Informational incidents must be acknowledged within 72 hours.&lt;br /&gt;
&lt;br /&gt;
# Acknowledge in Zabbix&lt;br /&gt;
# Verify issue&lt;br /&gt;
# Take action if needed&lt;br /&gt;
&lt;br /&gt;
=== External Reports ===&lt;br /&gt;
&lt;br /&gt;
# Acknowledge receipt&lt;br /&gt;
# Classify report as critical, non-critical or informational. &lt;br /&gt;
# Create a Zulip topic in SRE # Critical, SRE ## Non-critical or SRE ### Informational (depending on classification) and add sufficient details. &lt;br /&gt;
# Proceed with checklist above for the type of incident.&lt;br /&gt;
&lt;br /&gt;
= Full procedure =&lt;br /&gt;
&lt;br /&gt;
== General Rules ==&lt;br /&gt;
&lt;br /&gt;
# When an incident is in progress, and person A is handling it, then all incidents in area X, are handled by person A, rather than the FR. Unless working day ends. Person A should communicate clearly to FR when their day is over.&lt;br /&gt;
# FR always has the last word on what solution to apply for resolving an incident.&lt;br /&gt;
&lt;br /&gt;
== Critical incidents ==&lt;br /&gt;
&#039;&#039;&#039;Critical incidents are resolved within 16 hours.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
As first responder you take on the responsiblity of seeing an incident resolved. This does not mean that you are the person required to do all the work. You can attempt to involve others to help you (often referred to as escalating the incident), but since other are not on-call, they are not obliged to help you, especially outside of normal working hours.&lt;br /&gt;
Involving multiple people can quickly be required if multiple critical incidents with different causes occur simultaneously. In that case, the First Responder usually takes on a more information management role and steers those that are brought on into resolving the issues. (Example: if a server crashes, several critical triggers can fire, but the underlying cause can quite quickly be determined to be a single issue, the crashed server. So you wouldn&#039;t need to call in people to manage each incident. But a client&#039;s service being down in one cluster while in a different cluster a different VM no longer boots is likely to be to different issues, so in order to resolve them on time you&#039;d want to call in help to resolve the incident in time).&lt;br /&gt;
&lt;br /&gt;
=== Process ===&lt;br /&gt;
The general process is made up of the following steps. Each step has additional information on how to handle/execute them in the sections below.&lt;br /&gt;
# Take responsibility for seeing the incident resolved&lt;br /&gt;
# Determine if incident is still ongoing&lt;br /&gt;
# If ongoing: Communicate to affected clients that the issue is being investigated&lt;br /&gt;
# Communicate plan/next steps (even if that is gathering information)&lt;br /&gt;
# Communicate findings/results of executed plan, go back to previous step if not resolved&lt;br /&gt;
# Resolve incident + cleanup&lt;br /&gt;
&lt;br /&gt;
During working on an incident it is expected that all communication is done in the incident&#039;s thread. This means all information to a problem can be found in a clear a predictable place. Sometimes an incident can be resolved by work done in another incident. In that case, it is required to post a link to that thread in the incident&#039;s thread with the comment that the resolution is done in that thread.&lt;br /&gt;
&lt;br /&gt;
==== Acknowledge the incident on Zabbix ====&lt;br /&gt;
The first step is to take responsibility for seeing the incident resolved by acknowledging the incident on Zabbix. Simply acknowledging the trigger suffices. It is however entirely possible that multiple critical incidents are firing at the same time. This can be a coincidence, or can be because of a share cause of failure. For example, a server crashing will cause server VMs to reboot, or the router having an connectivity issue will lead to most other VMs having connectivity issues as well. If there are multiple critical incidents, it is advised to quickly observe what&#039;s ongoing, Zabbix is the best source of firing triggers for this, and pick the incident that is likely the root cause to  &lt;br /&gt;
&lt;br /&gt;
* Acknowledging an incident on Zabbix will stop Zabbix from calling the First Responder to notify them of the ongoing incident. And stops Zabbix from posting reminders on Zulip.&lt;br /&gt;
&lt;br /&gt;
==== Determine if incident is still ongoing ====&lt;br /&gt;
The next step is to check if the reported problem is still ongoing. Depending on the observations made here your process to follow and steps needed to resolve the incident can change. There are three options:&lt;br /&gt;
# The trigger resolved itself and the problem cannot be observed. Example: HTTPS is down for a site, but the FR can access the site through HTTPS without incident.&lt;br /&gt;
# The trigger resolved itself and the problem can still be observed.&lt;br /&gt;
# The trigger is still firing but the problem cannot be observed: Our triggers might not be perfect, so it could be that something else is causing it to fire. A simple example would be that Zabbix reports that the the DNS for a site can&#039;t be resolved, but in reality there&#039;s a bug in the script we wrote that checks if the DNS resolves and the DNS resolves fine. Final note: keep in mind that an &#039;it works on my machine&#039; does not necessarily mean it works for most other people, so depening on the trigger you need to do some evaluations if your tests suffice. &lt;br /&gt;
&lt;br /&gt;
In order to make sure you are actually trying to observe the same thing as the trigger is looking for, make sure to check the trigger definition and the current data of the associated item(s). Some triggers might fire if one of multiple conditions is met (Such as a trigger that monitors the ping response time firing if the value exceeds a certain threshold, or if no data for a certain period of time was observed).&lt;br /&gt;
&lt;br /&gt;
Make sure to report your findings in the incident&#039;s thread. It&#039;s advised to post a screenshot of the relevant item(s) and your own observations. (Continuing the ping example, you would post a screenshot of the relevant values, state your conclusion why the trigger is firing, and your own observations/pings)&lt;br /&gt;
&lt;br /&gt;
==== Communicate to affected clients ====&lt;br /&gt;
If the incident is still ongoing and the service is down, we need to communicate to affected clients that we are aware of the problem and that we are investigating it. This is because critical incident usually mean the service is down, something the clients can notice/are affected by, so we to be transparent that something is going on. There are some additional notes to this though:&lt;br /&gt;
* If an incident has already resolved itself and the problem is no longer observable, we don&#039;t communicate anything. Doing so might only cause confusion, and since the client has not reported any issues, they have not had a noticeable problem with it themselves.&lt;br /&gt;
* Although a critical incident generally means that the client service is down or experiencing reduced service, not all critical incidents are of that nature. Some are more administrative, or are only an issue for Delft Solutions itself. As of writing I don&#039;t have an exhaustive list, but here is those I can think of:&lt;br /&gt;
** SSH Service is down: We don&#039;t have any clients that SSH into their services, so it&#039;s generally not a problem. But SSH is mostly used for SRE maintenance and publishing new builds. The SRE maintenance is an internal problem, so no need to communicate to the client. The publishing is done to Kaboom, preventing new builds from being published, and the two SM VMs.&lt;br /&gt;
** No backup for x days: Clients don&#039;t notice it if a backup is running late, so no need to communicate with clients. Just need to make sure the backup gets completed&lt;br /&gt;
** SSL certificate is expiring in &amp;lt; 24 hours: This is a bit dependent on how soon this incident is being handled, but if it handled quickly, the certificate never actually expired, and there has not been any disruption to the client&#039;s service, so no need for communicating about it.&lt;br /&gt;
* Determining which clients are being affected can be done by looking at the host&#039;s DNS in the trigger, and/or looking up the VM in Proxmox and checking the tags of the VMs for client names. In the case that this issue is causing multiple other critical triggers to fire, you would have to check for which clients are affected by those incidents.&lt;br /&gt;
* Communicating to DS about ongoing incidents is usually assumed to be automatically have been done by the fact that the incident was reported on Zulip.&lt;br /&gt;
&lt;br /&gt;
As always, report the decisions taken and actions made in the incident thread. (e.g.: I&#039;ve sent a message in the Slack to let Kaboom know that we aware of problem x, and that we are investigating it)&lt;br /&gt;
&lt;br /&gt;
==== Communicate plan/next steps + Communicate findings/results of executed plan ====&lt;br /&gt;
This is the main part of handling an incident. There are several actions you can take in these steps, but at the basis they consist of sharing your next steps, performing those, and reporting the results. The reason all this needs to be reported is to ensure that all known information about a problem is logged, making it easier for someone else to be onboarded into the issue, for later reference if a similar issue is encountered, and even for use during the incident itself in case an older configuration needs to be referenced after you changed it.&lt;br /&gt;
The objective from these steps is determining what is actually wrong and how to resolve it. Depending on the observations made earlier on whether the incident is still ongoing and is (still) observable your investigation can go into different directions. (e.g. Find the underlying cause for a trigger, or determining why the trigger is firing while it likely shouldn&#039;t, and then how to resolve that underlying cause or how to update the trigger to work better)&lt;br /&gt;
&lt;br /&gt;
There are three main types of steps defined, but you are not limited to these:&lt;br /&gt;
# Hypothesis: If you have an idea what could be causing it, you would state your hypothesis and your next step would be to prove that hypothesis. For example, for an incident &#039;SSH service is down on X&#039; your hypothesis could be that this is due to &#039;MaxStartups&#039; throttling, which can be proven by &#039;grep&#039;ing journalctl for that, and compare the start and end times of throttling with the timestamps of the item reporting the status of the SSH service.&lt;br /&gt;
# Information gathering: Sometimes it just helps to get some facts about the situation collected. What is usefull information that is relevant depends on the triggers, but some examples are: The syslog/journalctl of the host from around the time of the incident (it can contain a reference to the an underlying problem in various levels of explicitness), the ping response from several hosts on the route to a host or a traceroute (this helps with networking issues). The gathered information is usually intended to help you come up with an hypothesis on what&#039;s wrong.&lt;br /&gt;
# Investigative: The most rigorous of process. The full process is described here originally [https://docs.google.com/document/d/1AQYJM1Q9l2Tyk6zfCVaQ2aEq-dpbfUH5okE88bpKkhw/edit#heading=h.5fq2skijqbdc Drive - Final Coundown - General Investigative Process]. To summarize, when you don&#039;t know why something is failing, and/or don&#039;t have any decent hypotheses to follow up, you can follow this process to systematically find the problem.&lt;br /&gt;
&lt;br /&gt;
Regarding the resolution to an incident: The resolution to any incident is usually one of two things:&lt;br /&gt;
# Fix the underlying problem.&lt;br /&gt;
# Fix the trigger itself.&lt;br /&gt;
Fixing the trigger is relatively straightforward, but do make sure document in the thread what you changed to which trigger.&lt;br /&gt;
Fixing the underlying problem can be more complex. A trade-off needs to be made sometimes between resolving technical debt, or simply patching the current system to resolve the issue. We usually look for a resolution that ensures that the problem won&#039;t re-occur soon, or makes it unexpected/unlikely for the problem to re-occur. Taking into account the time frame that is available to resolve the incident you can make some trade-offs. An example would be: normal backups of VMs are failing due to the Proxmox backup server being down/unreachable and it is determined that this cannot be resolved at that moment. We can set up automatic backups to local storage temporary to resolve the immediate problem and ensure we keep our SLO&#039;s versus setting up a new Proxmox Backup server at a different location. Since we don&#039;t have much time to resolve the problem, the resolution would be to set up the automatic backups to local storage, and set up a new Proxmox Backup Server later as a seperate issue.&lt;br /&gt;
&lt;br /&gt;
===== Some known issues and their resolutions =====&lt;br /&gt;
* SSH service is down: The internet is a vile place. There&#039;s constant port scanning and hacking attempts ongoing to any machine connected to the internet (mostly IPv4). Due to this, SSH has a throttling functionality build in to prevent a system from being DDOS&#039;ed by the amount of malicious SSH requests. This throttling can cause the Zabbix server from being denied an SSH connection, of which several failures fire this trigger. This hypothesis can be proven with a `journalctl -u ssh | grep &#039;MaxStartups throttling&#039;` (you probably want to select a relevant time period with `--since &amp;quot;2 hours ago&amp;quot;` or something similar to prevent having to process a month of logging). You can then compare the throttling start and end times with the timestamps of the item data itself. The resolution for the issue is to add our custom ssh configuration [https://chat.dsinternal.net/#narrow/stream/23-SRE---General/topic/DS.20Whitelisted.20Custom.20SSH.20configuration/near/1620 Custom SSH Configuration].&lt;br /&gt;
* No backup for 3 days: Are S3 backup is very slow. Not much to prove as an underlying issue here. What needs to be done is check that the backup process is ongoing. The Zabbix latest data can be checked to verify that backups are running by checking that that days backups were done for the smaller buckets. The devteam email can be checked for if the backup process could not start on day due to it already running (it takes 24+ hours, and an attempt to start it is done each day by cron).&lt;br /&gt;
* git.* HTTPS is down: On Sunday mostly, Gitlab gets automatically updated, but this incurs some downtime as the service is restarted. This is usually short enough to not be reported to Zulip as per our settings, but sometimes it&#039;s longer. If the service does not stay down, the issue can be just resolved.&lt;br /&gt;
&lt;br /&gt;
==== Resolve incident + cleanup ====&lt;br /&gt;
When you&#039;ve executed and verified the resolution in the previous steps we can proceed resolving the issue in our Mattermost integration. Resolving an incident can be done by doing the following:&lt;br /&gt;
# Verify that the trigger is no longer firing. An incident will be immediately re-opened if the trigger is still firing, and the incident cannot be considered resolved if the trigger is still firing. If the trigger is still firing but you&#039;re sure that you&#039;ve resolved the problem, you might need to force the item the trigger depends on to update. This can be done by finding the item in the host&#039;s configuration on Zabbix and selecting &#039;Execute Now&#039;, after a short period this should force Zabbix to re-execute the item. You can check the timestamps in the latest data of an item to check if it was updated.&lt;br /&gt;
# Close the incident by marking the topic as resolved, when there are no other triggers firing for the host.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, some problems cause multiple critical and non-critical triggers to fire. This means we have to check Zabbix and Zulip for other fired triggers and ongoing incidents. The goal is to identify critical and non-critical incidents that were caused by the incident/underlying issue you just resolved.&lt;br /&gt;
# First, these incidents need to be acknowledged on Zabbix, and in the acknowledgement message you mention the incident/problem that caused this.&lt;br /&gt;
# Next, check the incident tracked by the integration on Mattermost using the `?ongoing` command. Resolve incidents that were (re-)opened by this incident by executing the following steps. If the first two fail (problem still persists, trigger is still firing), the incident needs to considered it&#039;s own issue and the relevant process needs to be followed (critical or non-critical depending on criticality).&lt;br /&gt;
## Ensuring the mentioned problem is no longer observable&lt;br /&gt;
## The trigger has resolved (You might need to force an update with `Execute Now`).&lt;br /&gt;
## Posting a link to the main incident you resolved with the comment that the underlying problem was resolved in that topic.&lt;br /&gt;
## Closing the incident by marking the topic as resolved, when there are no other triggers firing for the host.&lt;br /&gt;
&lt;br /&gt;
When you are done, there should be no more critical triggers firing in Zabbix or open in the Zabbix-Mattermost integration, for which no-one has taken responsibility or you have taken responsibility for and are not actively handling.&lt;br /&gt;
&lt;br /&gt;
== Non-Critical incidents ==&lt;br /&gt;
* Non-critical incidents are acknowledged within 9 hours and resolved within one week.&lt;br /&gt;
&lt;br /&gt;
=== Acknowledging ===&lt;br /&gt;
Fully acknowledging a non-critical incident requires the following tasks to have been completed:&lt;br /&gt;
* Acknowledging the incident on Zabbix, which means you take responsibility of completing the steps listed below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The next steps don&#039;t have to be done immediately, as they have dependencies, but be started and scheduled for completion the next work day.&lt;br /&gt;
&lt;br /&gt;
Check if there&#039;s already a uncompleted milestone for this host with this issue in the metrics sheet.&lt;br /&gt;
If a milestone is already present:&lt;br /&gt;
* Report in the topic the Lynx project ID for resolving this issue.&lt;br /&gt;
* If the ID has already been reported in the topic, we don&#039;t want to report it again and again, instead add the 🔁 emoji (:repeat:) under the zabbix bot alert&lt;br /&gt;
&lt;br /&gt;
If a milestone is NOT already present:&lt;br /&gt;
* Add the non-critical incident as a milestone in the metrics sheet, following the naming convention&lt;br /&gt;
** Start date is the date of the incident&lt;br /&gt;
** DoD states what needs to be true for the non-critical incident to be consider resolved&lt;br /&gt;
* Add the non-critical incident to Lynx as a project&lt;br /&gt;
** Follow the naming convention below for the title &amp;amp; project ID&lt;br /&gt;
** Tasks need to be added&lt;br /&gt;
** Final tasks needs to have the SLO deadline set as &#039;constraint&#039;&lt;br /&gt;
** Project priority is set to 99 while not estimated yet. After the estimation is done, the priority should be set to 20&lt;br /&gt;
** The tasks are estimated for SP&lt;br /&gt;
* The Lynx project ID is reported in the non-critical incident&#039;s topic on Zulip, and logged in the metrics sheet&lt;br /&gt;
* A Kimai activity is created in Kimai for the non-critical incident, following the naming convetion&lt;br /&gt;
&lt;br /&gt;
==== Naming convention ====&lt;br /&gt;
* Kimai activity name needs to follow the pattern: &#039;&amp;lt;YYYY-MM&amp;gt; &amp;lt;problem_title&amp;gt;&#039;. For &amp;lt;problem_title&amp;gt;, incorporate the trigger title and hostname for clarity.&lt;br /&gt;
* Milestone name needs to follow the pattern: &#039;Delft Solutions Hosting Incident response work &amp;lt;kimai_activity_name&amp;gt;&#039;&lt;br /&gt;
* Lynx project name needs to follow the pattern: &#039;Delft Solutions Hosting Incident response work &amp;lt;kimai_activity_name&amp;gt;&#039;&lt;br /&gt;
* Lynx project ID needs to follow the pattern: &#039;SRE&amp;lt;YYMM&amp;gt;&amp;lt;XXX&amp;gt;&#039;, where &amp;lt;XXX&amp;gt; is some three letter shorthand that relates to the problem/host&lt;br /&gt;
&lt;br /&gt;
== Informational incidents ==&lt;br /&gt;
* Informational incidents are acknowledged within 72 hours&lt;br /&gt;
&lt;br /&gt;
Checklist&lt;br /&gt;
# Acknowledge on Zabbix&lt;br /&gt;
# Sanity check the event, post result in thread&lt;br /&gt;
# If action needed, perform action&lt;br /&gt;
&lt;br /&gt;
== If an incident is reported by other means than the Zabbix-Zulip integration ==&lt;br /&gt;
Besides the automated Zabbix-Zulip integration, incidents can also be reported through emails from cron jobs, direct emails from customers, or topics in SRE General (such as alerts about Zulip updates or issues raised by colleagues), etc.&lt;br /&gt;
# Acknowledge receipt.&lt;br /&gt;
# Classify the incident as critical, non-critical, or informational.&lt;br /&gt;
# Create an topic in the relevant SRE channel, stating the problem and that you is responsible for resolving it.&lt;br /&gt;
# Proceed to treat the incident according to the criticality you just classified it as. (So for a critical incident, it means you now start the critical incident handling process)&lt;br /&gt;
&lt;br /&gt;
== Handover ==&lt;br /&gt;
See [[Handover]]&lt;/div&gt;</summary>
		<author><name>Jakobbuis</name></author>
	</entry>
</feed>