<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jatin Vohra</title>
    <description>The latest articles on DEV Community by Jatin Vohra (@jatinvohra).</description>
    <link>https://dev.to/jatinvohra</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4113161%2F8e95fe96-716e-45ef-8bec-91d22292f42a.png</url>
      <title>DEV Community: Jatin Vohra</title>
      <link>https://dev.to/jatinvohra</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jatinvohra"/>
    <language>en</language>
    <item>
      <title>A small calculator for checking the cost of a manual workflow</title>
      <dc:creator>Jatin Vohra</dc:creator>
      <pubDate>Sun, 18 Oct 2026 06:43:43 +0000</pubDate>
      <link>https://dev.to/lumoxtech/a-small-calculator-for-checking-the-cost-of-a-manual-workflow-28la</link>
      <guid>https://dev.to/lumoxtech/a-small-calculator-for-checking-the-cost-of-a-manual-workflow-28la</guid>
      <description>&lt;p&gt;Lumox has a small &lt;a href="https://lumoxtech.com.au/resources/manual-work-cost-calculator/" rel="noopener noreferrer"&gt;Manual Work Cost Calculator&lt;/a&gt; for putting a number against one repeated task before deciding whether to change it.&lt;/p&gt;

&lt;p&gt;It is free to use, with no signup. Five inputs produce weekly hours, annual hours and an annual labour-cost baseline. The calculation happens in your browser; entered calculator values are not sent to Lumox.&lt;/p&gt;

&lt;h2&gt;
  
  
  A worked example
&lt;/h2&gt;

&lt;p&gt;The illustrative defaults are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;10 repetitions per week&lt;/li&gt;
&lt;li&gt;15 minutes per repetition, per person&lt;/li&gt;
&lt;li&gt;3 people involved each time&lt;/li&gt;
&lt;li&gt;48 working weeks per year&lt;/li&gt;
&lt;li&gt;AUD60 loaded hourly cost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gives &lt;strong&gt;7.5 hours a week, 360 hours a year and AUD21,600 in annual labour cost&lt;/strong&gt;. These are example assumptions, not a client result or a promised saving.&lt;/p&gt;

&lt;p&gt;The arithmetic is deliberately visible:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;annual hours = repetitions/week × minutes ÷ 60 × people × working weeks
annual labour cost = annual hours × loaded hourly cost
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Count active effort, rather than the time something sits in an approval queue. If different roles spend different amounts of time or have different hourly costs, calculate them separately and add the results. Avoid counting the same effort twice.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does not answer
&lt;/h2&gt;

&lt;p&gt;The baseline does not tell you how much work can safely disappear. Exceptions, necessary judgement, change costs and ongoing support still matter. Simplifying the process or using an existing product may be enough; custom software is one possible outcome.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://lumoxtech.com.au/resources/manual-work-cost-calculator/" rel="noopener noreferrer"&gt;Try the calculator&lt;/a&gt;, or use the &lt;a href="https://gist.github.com/jatincodesx/d97fd5358d29e406b5cae0e8e226c940" rel="noopener noreferrer"&gt;blank workflow worksheet&lt;/a&gt; to collect assumptions first. Keep business figures in your own private copy.&lt;/p&gt;

&lt;p&gt;If you try it, which assumption would you want made more explicit before using the result in a software decision?&lt;/p&gt;

</description>
      <category>showdev</category>
    </item>
    <item>
      <title>A software handover should prove one recovery path</title>
      <dc:creator>Jatin Vohra</dc:creator>
      <pubDate>Sat, 17 Oct 2026 02:16:04 +0000</pubDate>
      <link>https://dev.to/lumoxtech/a-software-handover-should-prove-one-recovery-path-1326</link>
      <guid>https://dev.to/lumoxtech/a-software-handover-should-prove-one-recovery-path-1326</guid>
      <description>&lt;p&gt;Before agreeing to support an unfamiliar application, ask a practical question: can the team recover one important workflow using the handover material? A walkthrough turns missing context into specific work before an ongoing support arrangement is scoped.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with one ordinary business path
&lt;/h2&gt;

&lt;p&gt;Choose something the organisation depends on, such as opening a dashboard and exporting an accurate report. Define the expected result, its information source and who can confirm that it is correct. Keep the walkthrough in an isolated test environment with dummy or appropriately redacted data.&lt;/p&gt;

&lt;h2&gt;
  
  
  A handover walkthrough
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Identify the running version. Record the source revision, deployment reference and environment. A repository link alone does not show which release is actually serving users.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check the access boundary. Identify the people permitted to investigate, deploy and restore. Document how authorised access is obtained; keep credentials out of the runbook itself.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Trace the business path. List the services and data stores needed for the chosen workflow. Include any scheduled job that must finish before the result is current.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make failure visible. Describe what a user sees, what the monitoring shows and which evidence helps distinguish a stale result from an unavailable service. Agree who investigates the alert.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rehearse recovery. Use an approved test environment to demonstrate the relevant rollback or restore procedure. Record the test date, version, outcome and remaining limitations. A successful file restore does not by itself prove that the business workflow works again.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Check recovery consequences. Identify work that may have occurred after the restored point. Define how it will be reconciled. Avoid blindly replaying operations that can create duplicate or irreversible effects.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Assign the next decision. Identify who can approve a rollback, pause a workflow or accept a temporary workaround. Record the escalation route and expected contact window without assuming round-the-clock coverage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Leave usable evidence. Store a short runbook, relevant references and the unresolved items somewhere the authorised support team can find them. Have another person follow it and note where they need help.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Turn the gaps into a bounded support brief
&lt;/h2&gt;

&lt;p&gt;Use this outline for a new support enquiry:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;System and business owner:&lt;/li&gt;
&lt;li&gt;Workflow that must keep working:&lt;/li&gt;
&lt;li&gt;Observed problem and business impact:&lt;/li&gt;
&lt;li&gt;Known version, dependencies and access owner:&lt;/li&gt;
&lt;li&gt;Recovery evidence already available:&lt;/li&gt;
&lt;li&gt;Unresolved risks and decisions:&lt;/li&gt;
&lt;li&gt;Required support window:&lt;/li&gt;
&lt;li&gt;One-off stabilisation work versus ongoing scope:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The walkthrough informs the scope; it does not establish a response-time guarantee, certification or production readiness. Agree responsibilities, included work and exclusions against the actual system.&lt;/p&gt;

&lt;p&gt;Repository ownership and incident responsibility also need to be distinguished. GitHub's CODEOWNERS feature requests reviews for relevant changes. An operational escalation rota and authority to restore service need their own agreement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;p&gt;GitHub: About code owners&lt;br&gt;
&lt;a href="https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners" rel="noopener noreferrer"&gt;https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Google's Site Reliability Engineering book: Emergency Response&lt;br&gt;
&lt;a href="https://sre.google/sre-book/emergency-response/" rel="noopener noreferrer"&gt;https://sre.google/sre-book/emergency-response/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  From Lumox Technologies
&lt;/h2&gt;

&lt;p&gt;Lumox is a Canberra-based software engineering company. If you are evaluating support for a business application, send a non-confidential outline of what should work better through &lt;a href="https://lumoxtech.com.au/contact/?from=%2Fdev-to%2Flumoxtech%2Fsoftware-handover%2F&amp;amp;type=Custom%20software" rel="noopener noreferrer"&gt;Lumox’s enquiry form&lt;/a&gt;. Scope and availability would be discussed against your actual requirements.&lt;/p&gt;

&lt;p&gt;For practical examples of software handoffs and integrations, &lt;a href="https://www.linkedin.com/company/lumoxtech/" rel="noopener noreferrer"&gt;follow Lumox on LinkedIn&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>architecture</category>
      <category>testing</category>
    </item>
    <item>
      <title>An Integration Is Not Done Until the Failure Has an Owner</title>
      <dc:creator>Jatin Vohra</dc:creator>
      <pubDate>Mon, 07 Sep 2026 05:25:56 +0000</pubDate>
      <link>https://dev.to/lumoxtech/an-integration-is-not-done-until-the-failure-has-an-owner-1bch</link>
      <guid>https://dev.to/lumoxtech/an-integration-is-not-done-until-the-failure-has-an-owner-1bch</guid>
      <description>&lt;p&gt;Most integration diagrams end at the arrow.&lt;/p&gt;

&lt;p&gt;System A sends a request. System B receives it. A neat line connects the two boxes, and the design appears complete.&lt;/p&gt;

&lt;p&gt;The difficult work begins when nobody can answer a more ordinary question: what happens if the arrow only half works?&lt;/p&gt;

&lt;p&gt;A timeout does not tell you that nothing happened. The receiving system may have committed the change and lost the response. A retry may be correct, or it may create a duplicate. A green HTTP response may confirm that a message entered a queue, not that the business outcome completed.&lt;/p&gt;

&lt;p&gt;This is where many technically functional integrations turn into operational debt. The happy path is automated. The uncertainty is handed to a person who was never named in the design.&lt;/p&gt;

&lt;h2&gt;
  
  
  Model the handoff as a state transition
&lt;/h2&gt;

&lt;p&gt;Treat the integration as a business state transition, not merely an API call.&lt;/p&gt;

&lt;p&gt;For each handoff, write down five things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;the authoritative record before the handoff;&lt;/li&gt;
&lt;li&gt;the event or command being sent;&lt;/li&gt;
&lt;li&gt;the evidence that proves the receiving system accepted responsibility;&lt;/li&gt;
&lt;li&gt;the evidence that proves the business outcome completed; and&lt;/li&gt;
&lt;li&gt;the owner of every state between those two confirmations.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Suppose a website sends an approved order to an operations system. A 202 Accepted response may prove receipt. It does not prove that stock was allocated, the order was scheduled, or a human exception was resolved.&lt;/p&gt;

&lt;p&gt;Those are different states and should be visible as different states.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;approved -&amp;gt; submitted -&amp;gt; accepted -&amp;gt; processing -&amp;gt; completed
                         |             |
                         v             v
                      rejected      exception
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The names will differ by system. The important point is that submitted and completed are not collapsed into a single boolean called synced.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give every request a stable identity
&lt;/h2&gt;

&lt;p&gt;Retries are unavoidable. Duplicate effects are not.&lt;/p&gt;

&lt;p&gt;Generate an idempotency key or stable business-event identifier before the first attempt and reuse it for every retry of the same intended action. Store it with the local record. The receiver should either return the original result or reject conflicting reuse.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST /orders
Idempotency-Key: order_8421_submit_v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;The key must identify the intention, not the network attempt. Creating a fresh key after each timeout defeats the protection.&lt;/p&gt;

&lt;p&gt;There is also a less obvious requirement: operators need to be able to search by that identifier across logs, queues and the receiving system. A technically idempotent request that cannot be traced still creates expensive investigation work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate transport success from business success
&lt;/h2&gt;

&lt;p&gt;An integration usually has at least three kinds of outcome:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Outcome&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;th&gt;Typical next action&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Transport failure&lt;/td&gt;
&lt;td&gt;No reliable acknowledgement was received&lt;/td&gt;
&lt;td&gt;Retry with the same identity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accepted but incomplete&lt;/td&gt;
&lt;td&gt;The receiver owns the work, but the business result is pending&lt;/td&gt;
&lt;td&gt;Observe, poll or await an event&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Business rejection&lt;/td&gt;
&lt;td&gt;The request was understood but cannot proceed&lt;/td&gt;
&lt;td&gt;Route to a named decision owner&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These outcomes should not share one generic catch block.&lt;/p&gt;

&lt;p&gt;A retry policy belongs to transport uncertainty. A business rejection usually needs different data, approval, or a corrected decision. Replaying it without changing anything merely produces more noise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make reconciliation a first-class path
&lt;/h2&gt;

&lt;p&gt;Even carefully designed flows drift. Events arrive out of order. Credentials expire. An operator corrects a record directly in one system. A deployment interrupts a consumer at the wrong moment.&lt;/p&gt;

&lt;p&gt;Build reconciliation before production, not after the first unexplained discrepancy.&lt;/p&gt;

&lt;p&gt;A useful reconciliation job compares authoritative identifiers and states, then emits a small set of actionable differences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;present in the source but missing from the receiver;&lt;/li&gt;
&lt;li&gt;accepted but not completed inside the expected window;&lt;/li&gt;
&lt;li&gt;completed remotely but not reflected locally;&lt;/li&gt;
&lt;li&gt;rejected without an assigned owner; and&lt;/li&gt;
&lt;li&gt;conflicting versions that cannot be resolved automatically.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The output should be a work queue with ownership, timestamps and evidence. It should not be a spreadsheet someone has to remember to download.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design the manual path as carefully as the automated one
&lt;/h2&gt;

&lt;p&gt;Human intervention is not automatically a failure of automation. Unplanned human intervention is.&lt;/p&gt;

&lt;p&gt;For each exception, define:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;who is allowed to decide;&lt;/li&gt;
&lt;li&gt;what evidence they see;&lt;/li&gt;
&lt;li&gt;which actions are safe;&lt;/li&gt;
&lt;li&gt;whether an action can be reversed;&lt;/li&gt;
&lt;li&gt;how the decision is recorded; and&lt;/li&gt;
&lt;li&gt;how the workflow resumes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avoid a generic retry button that repeats an unknown operation. Give the operator the current state, the last confirmed transition and the effect of the next action.&lt;/p&gt;

&lt;p&gt;If the system cannot explain what it knows, what it does not know and what will happen next, the operator is being asked to guess.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test ambiguity, not only errors
&lt;/h2&gt;

&lt;p&gt;Most integration tests cover clear success and clear failure. Production incidents often live between them.&lt;/p&gt;

&lt;p&gt;Add tests for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the receiver commits the change, then the response is lost;&lt;/li&gt;
&lt;li&gt;the same event is delivered twice;&lt;/li&gt;
&lt;li&gt;events arrive out of order;&lt;/li&gt;
&lt;li&gt;the sender restarts after dispatch but before recording acknowledgement;&lt;/li&gt;
&lt;li&gt;a downstream operation remains pending beyond its expected window;&lt;/li&gt;
&lt;li&gt;a user changes the source record while processing is underway; and&lt;/li&gt;
&lt;li&gt;reconciliation runs while a retry is in flight.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The expected result is not always that the request succeeds. It may be that the system enters an explicit uncertain state, prevents a conflicting action and assigns the case to the right owner.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small review before shipping
&lt;/h2&gt;

&lt;p&gt;Before calling an integration complete, ask:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Can we distinguish receipt from business completion?&lt;/li&gt;
&lt;li&gt;Can the same intention be retried without duplicating its effect?&lt;/li&gt;
&lt;li&gt;Can an operator trace one handoff across every component?&lt;/li&gt;
&lt;li&gt;Does every rejection, timeout and stale state have an owner?&lt;/li&gt;
&lt;li&gt;Can the systems reconcile without relying on memory?&lt;/li&gt;
&lt;li&gt;Does the manual path preserve an audit trail?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If any answer is vague, the missing work is not polish. It is part of the system boundary.&lt;/p&gt;

&lt;p&gt;Lumox uses the same questions when assessing whether a connected system is ready for production. The broader &lt;a href="https://lumoxtech.com.au/resources/enterprise-software-readiness-checklist/" rel="noopener noreferrer"&gt;enterprise software readiness checklist&lt;/a&gt; covers ownership, information boundaries, assurance, recovery and handover.&lt;/p&gt;

&lt;p&gt;The arrow on the diagram is the easy part. The real integration is the agreement about who owns the uncertainty around it.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>webdev</category>
      <category>testing</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
