<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Kevin Pantasdo · Notes on how I work</title>
    <link>https://kevindps.com/writing/</link>
    <atom:link href="https://kevindps.com/feed.xml" rel="self" type="application/rss+xml" />
    <description>Short, practical posts on building software for operations teams: discovery, scoping, keeping AI inside the lines, and shipping in small slices.</description>
    <language>en</language>
    <lastBuildDate>Sun, 27 Sep 2026 04:02:06 GMT</lastBuildDate>
    <item>
      <title>What a pitch competition actually tests</title>
      <link>https://kevindps.com/writing/what-a-pitch-competition-actually-tests/</link>
      <guid isPermaLink="true">https://kevindps.com/writing/what-a-pitch-competition-actually-tests/</guid>
      <pubDate>Mon, 06 Apr 2026 08:00:00 GMT</pubDate>
      <description>After QuantumByte won SelectUSA Indonesia 2026: what judges are really probing beneath the slides, and why it is the same thing a serious client checks.</description>
      <content:encoded><![CDATA[<p>On 26 March, QuantumByte won the SelectUSA Tech pitching competition for Indonesia, run through the U.S. Embassy. I am proud of it and grateful to the team. I also want to write down what I think the competition was actually testing, because it was not what most founders prepare for.</p>
<h2>It is not the deck</h2>
<p>Every finalist has a competent deck. Market size, product, traction, team, ask. Judges have seen hundreds. The deck gets you into the room and then stops mattering.</p>
<p>What happens in the room is a conversation, and the conversation probes three things.</p>
<h2>One: do you understand the customer&#39;s problem better than they do?</h2>
<p>Not the market. The customer. A specific person with a specific job who currently does something painful. Judges listen for whether you can describe that person&#39;s day, where it breaks, and what they do today instead of using you. If your answer is a segment and a statistic, you have described a market. If your answer is a workflow and an exception, you have described a customer.</p>
<p>For QuantumByte, that meant talking about the people who actually built tools on the platform: students, village operators, the supervisor who had been running a process in a spreadsheet. Not &quot;SMEs in Southeast Asia.&quot;</p>
<h2>Two: what is your evidence, and how was it established?</h2>
<p>Every founder has traction numbers. The question is what stands behind them. Judges ask, politely, where a number came from, and they notice whether you answer with a source or with a bigger number. A modest figure with a clear origin beats an impressive figure with a vague one, every time.</p>
<p>This is the same discipline I wrote about in <a href="/writing/the-numbers-i-will-and-wont-put-on-a-slide/">the numbers I will and won&#39;t put on a slide</a>. It applies to pitches exactly as it applies to case studies.</p>
<h2>Three: what is the smallest credible next step?</h2>
<p>The weakest answer to &quot;what would you do with this&quot; is &quot;scale.&quot; The strongest is a specific, bounded next step with a named outcome: this customer, this capability, this evidence of success, by this date. It shows you know what you do not know yet and have a plan to find out cheaply.</p>
<p>Investors and judges are pattern-matching for founders who ship in slices, even if they never use that word. A giant plan is a risk. A sharp next step is a bet they can size.</p>
<h2>Why this is the same test a client runs</h2>
<p>If you strip the competition context away, the three questions are what every serious buyer asks a builder. Do you understand my people&#39;s work? Can you show me evidence, honestly sourced? What is the first small thing we do together, and how will we know it worked?</p>
<p>I did not prepare for the competition by rehearsing the deck. I prepared by rehearsing those three answers until they were boring. That is the preparation I would recommend to any founder walking into a pitch, a sales call, or a board meeting.</p>
<h2>One more thing</h2>
<p>Winning a national round is a milestone, not an outcome. It does not change a single customer&#39;s Monday morning. The work that earned it, and the work that follows it, is where the value is.</p>
<h2>What we did the week after</h2>
<p>We went back to the customers whose stories carried the pitch and asked what they needed next. Not a bigger platform. In every case it was a smaller thing: an export in the format their office already used, an exception the tool did not yet handle, a way to hand the app to a colleague. That list became the next month of work. Winning gave us attention. The customers gave us the plan.</p>
<p><strong>Judges, like clients, test whether you know the customer, can source your evidence, and can name the next small step.</strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>The numbers I will and won't put on a slide</title>
      <link>https://kevindps.com/writing/the-numbers-i-will-and-wont-put-on-a-slide/</link>
      <guid isPermaLink="true">https://kevindps.com/writing/the-numbers-i-will-and-wont-put-on-a-slide/</guid>
      <pubDate>Mon, 02 Feb 2026 08:00:00 GMT</pubDate>
      <description>After the AIIP white-paper launch: the difference between reported and measured outcomes, how to read a case study, and why this site labels where every figure comes from.</description>
      <content:encoded><![CDATA[<p>Last week I was part of the AIIP Impact Showcase and white-paper launch. Sessions like that are full of numbers: percentages improved, days saved, costs cut. Some of them are real. Some are honest estimates. Some are a hope that got promoted to a fact over three rounds of slide editing. Sitting there, I decided to write down the rules I use for my own numbers.</p>
<h2>Three kinds of outcome</h2>
<p><strong>Measured.</strong> A baseline was recorded before the change, the same thing was measured after, and both are in a document I can show you. This is rare, and it is the only kind I state without qualification.</p>
<p><strong>Reported.</strong> The client or the project team stated the result. I believe it, it came from people who were there, but I did not measure it and cannot reproduce it. This is most of what appears in any consultancy&#39;s case studies, including ours from the Quantum years.</p>
<p><strong>Projected.</strong> Somebody calculated what should happen if the system is used as designed. Useful for planning. Not an outcome.</p>
<p>The sin is not having reported or projected numbers. The sin is presenting them as measured.</p>
<h2>How to read a case study</h2>
<p>When you read any builder&#39;s case study, including the ones on this site, ask four questions of every figure:</p>
<ol>
<li>Who measured it, and when?</li>
<li>What was the baseline, and was it recorded before the work started?</li>
<li>Is the arithmetic internally consistent? A &quot;50 days to 3 days&quot; claim is a 94 percent reduction, not &quot;around 80 percent.&quot; If the percentage and the days disagree, one of them is a slogan.</li>
<li>Does the number describe a product feature or an organizational result? &quot;Five times faster batch processing&quot; is about the software. &quot;Restructuring finished a quarter earlier&quot; is about the organization. Both can be true; they are different claims.</li>
</ol>
<h2>What I do on this site</h2>
<p>Every project story here has a &quot;what changed&quot; list, and under it a provenance line saying where those outcomes come from: the project&#39;s own case-study record, a public source, or a measurement. When a figure in the original record was inconsistent, I dropped the inconsistent part and kept the part I can stand behind. Where I only have the scope of what was built and no outcome evidence, I say what was built and stop.</p>
<p>The <a href="/work/telkomsel/">Telkomsel competency-mapping story</a> is a good example. The project record describes the mapping time falling from around fifty working days to three. I am comfortable stating the days, because they describe an observed change in a specific process. I am not comfortable turning that into a marketing percentage that does not match the arithmetic. So you will see the days, not the percentage.</p>
<h2>Why bother</h2>
<p>Because the buyer I want to work with is going to check. Founders and operating leaders who have been burned by vendor decks read case studies with a pencil. If they find one inflated number, they discount everything else, including the parts that are true. Labeling provenance costs me a few impressive-sounding percentages and buys me a conversation with someone who now trusts the rest of the page.</p>
<h2>For anyone writing their own case studies</h2>
<p>Keep a column in your project record for how each outcome was established. Write the provenance on the slide, in small type if you must. And when a number and its percentage disagree, fix it before someone else finds it.</p>
<p>It also means some of the strongest-sounding figures from the original deck do not appear here at all, because the record did not say how they were established. Their absence is the point.</p>
<p><strong>State measured numbers plainly, label reported ones, and never let a slogan outrank the arithmetic.</strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>Small observable slices</title>
      <link>https://kevindps.com/writing/small-observable-slices/</link>
      <guid isPermaLink="true">https://kevindps.com/writing/small-observable-slices/</guid>
      <pubDate>Mon, 27 Oct 2025 08:00:00 GMT</pubDate>
      <description>After live product demos at the Tech in Asia conference: how enterprise software gets shipped without a big-bang launch, one beneficiary and one outcome at a time.</description>
      <content:encoded><![CDATA[<p>Last week we ran live product demos at the Tech in Asia conference in Jakarta. Live, not recorded, on real software. A few people asked afterwards how we ship enterprise systems without the six-month silence followed by a launch that everyone dreads. The answer is not a methodology. It is a unit of work.</p>
<p>We ship in slices, and every slice has to be observable.</p>
<h2>What a slice is</h2>
<p>A slice is the smallest piece of software that produces one outcome for one beneficiary, end to end. Not a component, not a screen, not &quot;the backend for phase two.&quot; One person, one thing they can now do, from trigger to done.</p>
<p>For a telecom-expense tool, a slice might be: a finance analyst uploads one carrier contract and sees its plan details extracted into a searchable record with a source reference. Nothing else. No dashboard, no chatbot, no recommendations yet. But the analyst can do something on Friday that they could not do on Monday, and they can see it.</p>
<h2>The loop</h2>
<p>Every slice runs through the same five steps. I have written them up in more detail on the <a href="/process/">process page</a>, but the shape is simple.</p>
<ol>
<li><strong>Promise.</strong> Before any code, a short card: the outcome, the scope, what evidence will show it works, who will verify it, by when, what it depends on, and what would make us stop.</li>
<li><strong>Back-brief.</strong> The engineer explains, in their own words, the user&#39;s problem, the approach, what will be tested, and what will not change. If the explanation does not match the promise, we have caught the misunderstanding before it cost a week.</li>
<li><strong>Build.</strong> Small enough to inspect and reverse. Linked to the promise. AI-generated code treated as untrusted until reviewed, like any other contribution.</li>
<li><strong>Verify.</strong> The primary workflow, the likely failure, the permission case, and the &quot;what if the integration is down&quot; case. Recorded with the exact environment and data used, and with what was not checked.</li>
<li><strong>Demo.</strong> To the person who will use it, in a real scenario, including a failure. Then a disposition: accept, accept with conditions, or go again.</li>
</ol>
<h2>Why observable matters more than small</h2>
<p>Small is easy to fake. A team can ship tiny pieces of nothing for months. Observable is the discipline: at the end of the slice, a specific person can watch a specific outcome happen. If they cannot, the slice is not done, however much code was written.</p>
<p>This is also what makes the demos possible. When every slice has already been shown to a user in a real scenario, demonstrating in front of a conference audience is just doing it again in a bigger room.</p>
<h2>What it changes for the client</h2>
<p>You see progress every week or two, on your data, with your people. You can stop, redirect, or expand at any slice boundary without losing work. And you never arrive at a launch day, because there is no launch day. There is a slice, then another, and at some point the team notices the work has moved into the tool.</p>
<h2>If you are commissioning software</h2>
<p>Ask the builder what the first slice is, who benefits, and how you will observe it. If the answer is &quot;the data model and authentication,&quot; ask again. Those are ingredients. You are buying outcomes, one at a time.</p>
<h2>When a slice is not ready</h2>
<p>A slice does not start until it has a beneficiary, a confirmed requirement, a starting state, its acceptance and failure scenarios, a named verifier with a date, and the access and data it needs. If any of those is missing in a way that would change the design, the slice waits and the gap becomes this week&#39;s work. That rule is what stops the loop from becoming a treadmill of half-started pieces.</p>
<p><strong>One beneficiary, one outcome, observed by a real person: that is the unit of shipping.</strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>Keeping AI inside the lines</title>
      <link>https://kevindps.com/writing/keeping-ai-inside-the-lines/</link>
      <guid isPermaLink="true">https://kevindps.com/writing/keeping-ai-inside-the-lines/</guid>
      <pubDate>Mon, 07 Jul 2025 08:00:00 GMT</pubDate>
      <description>Catalog-only outputs, confidence and reasoning beside every match, human review, and batch visibility: the pattern that makes AI usable inside a large organization.</description>
      <content:encoded><![CDATA[<p>The AI projects that survive inside large organizations are not the most impressive ones. They are the ones where the model was never allowed to say anything the organization had not already approved.</p>
<p>That sounds limiting. It is the opposite. Constraints are what turn a demo into a system people trust with real decisions.</p>
<h2>The problem constraints solve</h2>
<p>Take the <a href="/work/telkomsel/">competency-mapping work for Telkomsel</a>. Thousands of job positions had to be mapped to an approved competency catalog. A person doing this reads a role, interprets the organizational context, and picks entries from the catalog. It is slow, it is inconsistent between people, and every time the catalog changes, the work starts again.</p>
<p>An unconstrained language model would produce beautiful, fluent competency descriptions. It would also invent competencies that do not exist in the catalog, and HR would spend the next quarter cleaning up. The output would be plausible and unusable.</p>
<h2>The pattern</h2>
<p>Four rules make the difference.</p>
<p><strong>Catalog-only outputs.</strong> The model can only choose from the approved list. It reads the role, extracts the job functions, and matches them to existing entries. It cannot write a new one. This single rule removes most of the risk of AI in enterprise settings: the vocabulary is the organization&#39;s, not the model&#39;s.</p>
<p><strong>Confidence and reasoning beside every match.</strong> Each result carries a confidence score and a short explanation of why. A reviewer can sort by confidence, read the reasoning for the borderline cases, and ignore the rest. Without this, a reviewer has to check everything, and the time saving disappears.</p>
<p><strong>Human review, by design.</strong> The tool does not &quot;decide.&quot; It proposes, and a named person confirms. The review step is part of the workflow, with its own screen, not an afterthought bolted on when someone gets nervous.</p>
<p><strong>Batch visibility.</strong> Thousands of roles are processed in runs. A dashboard shows which run is in progress, what has finished, and where it stopped. Results export to Excel, because that is the format the downstream planning actually uses.</p>
<h2>Rules on top of the model</h2>
<p>One more piece is easy to miss: predefined rules adjust the matching. The organization&#39;s own policies, which roles map to which families, which functions outrank others, are encoded as weights the model has to respect. The model provides the reading comprehension. The rules provide the institution&#39;s judgment.</p>
<h2>How to tell if an AI vendor understands this</h2>
<p>Ask three questions. Can the system produce an answer that is not in my approved vocabulary? Can a reviewer see why each answer was chosen? What does the screen look like when the model is unsure? If the answers are &quot;yes,&quot; &quot;no,&quot; and &quot;it just picks something,&quot; you are buying a demo.</p>
<h2>For founders</h2>
<p>If you are building AI for organizations, spend your effort on the boundaries: the allowed outputs, the review interface, the run visibility, and the export. The model is the least differentiated part of your product. The lines you draw around it are what a buyer is paying for.</p>
<h2>When the catalog changes</h2>
<p>The hardest moment for any mapping system is not the first run. It is the day the catalog is revised. Entries are renamed, merged, or retired, and every previous mapping is suddenly in doubt. This is the property to design for from the start: when outputs are catalog-only and every match carries its reasoning, a re-run can be mechanical. The roles whose matched entries changed can be found, re-matched against the new catalog, and routed back through review with the earlier reasoning beside the new proposal. Without those constraints, a catalog change means starting the whole project again.</p>
<p><strong>Constrain the vocabulary, show the reasoning, keep a person in the loop, and make every run visible.</strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>Teenagers shipped real apps in two days</title>
      <link>https://kevindps.com/writing/teenagers-shipped-real-apps-in-two-days/</link>
      <guid isPermaLink="true">https://kevindps.com/writing/teenagers-shipped-real-apps-in-two-days/</guid>
      <pubDate>Mon, 10 Mar 2025 08:00:00 GMT</pubDate>
      <description>What QuantumByte's two-day workshops with high-school students and village participants proved about who should build operational tools, and what the tools have to be like.</description>
      <content:encoded><![CDATA[<p>Over the past months QuantumByte has run two-day builder workshops with two groups who, on paper, have no business building software: high-school students at Penabur with no coding background, and community members in Banyuwangi with a practical problem and no technical staff. In both cases, working applications existed by the end of the second day. Several of the student apps were adopted by their schools.</p>
<p>I want to be careful about what this does and does not prove.</p>
<h2>What it does not prove</h2>
<p>It does not prove that anyone can replace a software team. The enterprise systems Quantum builds, for command centers, logistics networks, and certification bodies, need engineers, security review, integration, and the discipline of a delivery process. Two days does not produce that, and nobody in the workshops thought it would.</p>
<h2>What it does prove</h2>
<p>It proves something more useful: the person closest to a workflow can build the first version of the tool for that workflow, if the platform meets them where they are.</p>
<p>The village applications are the clearest example. A rice-stock tool for Duda Timur, a child-health monitoring tool for Kauman, a harvest-recording tool for the women&#39;s farming group in Cibiru Wetan. None of these would ever have reached the top of a software company&#39;s roadmap. They were built by the people who needed them, because those people understood the trigger, the steps, the exceptions, and what &quot;done&quot; looks like better than any outside analyst could.</p>
<p>That is the same discovery material I spend weeks extracting from enterprise clients. The builders already had it in their heads.</p>
<h2>What the platform has to do</h2>
<p>The lesson for anyone building tools, low-code or otherwise, is about where the effort goes:</p>
<ol>
<li><strong>Make the first hour rewarding.</strong> Both groups had a working screen with their own data in it before lunch on day one. Without that, you lose the room.</li>
<li><strong>Speak the workflow, not the schema.</strong> Nobody in Banyuwangi wanted to define an entity. They wanted to record a harvest. The platform has to start from the action and derive the data.</li>
<li><strong>Make exceptions cheap.</strong> Real workflows have a &quot;what if the stock arrives damaged&quot; case. If handling it takes an engineer, the tool stays a toy.</li>
<li><strong>Keep the result shareable.</strong> An app that only runs on the builder&#39;s laptop is a demo. The moment the school could hand a link to other teachers, the app became real.</li>
</ol>
<h2>Why a founder should care</h2>
<p>If you run an operation, the fastest path to a useful internal tool is often not a vendor and not your IT backlog. It is the supervisor who has been keeping the process alive in a spreadsheet, given a platform that respects their knowledge and a couple of days of guidance.</p>
<p>That does not remove the need for professional engineering when the tool has to scale, integrate, or carry sensitive data. It does change where you start. Start with the person who knows the work.</p>
<h2>What the two days looked like</h2>
<p>The format was the same for both groups. Day one started with each participant naming one thing they record, track, or report in real life, and building a screen for exactly that before lunch. The afternoon was spent adding the second step of their workflow and the first exception. Day two was about making it real: entering actual data, letting someone else use it, and fixing what confused them. Nobody was taught what a database is. Several people built one anyway, because their workflow needed it, and that is the correct order to learn it in.</p>
<p><strong>The person closest to the problem can build the first version, if the tool speaks their workflow instead of your schema.</strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>Acceptance is not adoption</title>
      <link>https://kevindps.com/writing/acceptance-is-not-adoption/</link>
      <guid isPermaLink="true">https://kevindps.com/writing/acceptance-is-not-adoption/</guid>
      <pubDate>Mon, 25 Nov 2024 08:00:00 GMT</pubDate>
      <description>Acceptance, adoption, value, and renewal are four different events. Confusing them is how software projects are declared successful and quietly abandoned.</description>
      <content:encoded><![CDATA[<p>Here is a pattern I have seen enough times to name it. A project ends. The sponsor signs the acceptance form. The vendor sends the final invoice. Six months later the tool has four active users, the team is back on spreadsheets, and everyone involved still calls the project a success.</p>
<p>Nothing was faked. The problem is that four different events were treated as one.</p>
<h2>Four events, four questions</h2>
<p><strong>Acceptance</strong> is a contractual event. A named person confirms that the agreed scope works against the agreed scenarios. The question it answers: did we build what we said we would build?</p>
<p><strong>Adoption</strong> is a behavioral event. The people the tool was made for use it for the real work, in place of whatever they did before. The question: is the work now happening inside the tool?</p>
<p><strong>Value</strong> is an operational event. Something the organization cares about has measurably changed against a baseline: less time, fewer errors, faster escalation, a risk that no longer occurs. The question: is the operation better, and can we show it?</p>
<p><strong>Renewal</strong> is a relationship event. The client chooses to continue, extend, or start something new. The question: do they want more of this?</p>
<p>None of these proves another. Acceptance does not create adoption. Adoption does not guarantee value. Value does not guarantee renewal, and renewal sometimes happens without value, which is its own problem.</p>
<h2>What to measure for each</h2>
<p>Each event needs its own evidence, and it should be planned during discovery, not discovered at the end.</p>
<ul>
<li>For <strong>acceptance</strong>: the scenario list, including the failure and permission cases, and the name of the person who verifies them. Written before the build starts.</li>
<li>For <strong>adoption</strong>: the share of the real workload that passes through the tool, week by week, and the number of people who touch it. A tool used by one champion is a pilot, not a product.</li>
<li>For <strong>value</strong>: the baseline you measured in discovery, and the same measurement after adoption. If there was no baseline, say so honestly and start one now.</li>
<li>For <strong>renewal</strong>: a conversation with the sponsor about what they would do next, held before the current work ends, not after.</li>
</ul>
<h2>Why this matters more for workflow software</h2>
<p>Consumer apps get adopted or deleted; the signal is fast. Enterprise workflow software can be accepted, installed, and ignored for a year, because the people who bought it are not the people who would have to use it. The <a href="/work/bsmr/">certification lifecycle work for BSMR</a> only counts if training providers, verification admins, and finance admins are actually moving submissions through it. The <a href="/work/avian/">transport platform for Avian</a> only counts if dispatchers and drivers run their day inside it.</p>
<p>So the design of the project has to include the adoption plan: who is trained, who is coached in the first weeks, what the fallback is when the tool is unavailable, and who on the client side owns the change. That is not a consultant&#39;s add-on. It is the second half of the build.</p>
<h2>For sponsors</h2>
<p>When a builder tells you the project is done, ask which of the four events they mean. Then ask for the evidence for the other three. If you get an honest &quot;not yet&quot; with a plan, you have a partner. If you get a puzzled look, you have a vendor.</p>
<h2>The champion problem</h2>
<p>There is a specific failure worth naming. One enthusiastic person on the client side uses the tool constantly, reports back that it is wonderful, and unintentionally hides the fact that nobody else has logged in. Adoption metrics have to count people and workload, not sessions. If ninety percent of the activity comes from one account, the project is a pilot with a fan, and the honest next step is to find out why the other nine people are still on the old path.</p>
<p><strong>Sign acceptance, then watch adoption, measure value, and only then talk about renewal.</strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>From data to decisions</title>
      <link>https://kevindps.com/writing/from-data-to-decisions/</link>
      <guid isPermaLink="true">https://kevindps.com/writing/from-data-to-decisions/</guid>
      <pubDate>Mon, 03 Jun 2024 08:00:00 GMT</pubDate>
      <description>After a talk on machine learning from data to decisions: why a recommendation is only useful with its reasoning beside it, and how leaders actually act on briefs.</description>
      <content:encoded><![CDATA[<p>Last week I gave a talk titled &quot;Machine learning, from data to decisions.&quot; The title is the whole argument. Most organizations are drowning in data and starving for decisions, and the gap between the two is not a bigger model. It is a brief a leader can act on.</p>
<h2>What a decision actually needs</h2>
<p>Picture the person who has to decide. A division head with fifteen minutes between meetings, three dashboards open, and a report from last month that nobody trusts. They do not need more charts. They need four things:</p>
<ol>
<li><strong>What is happening</strong>, in one sentence, with the number that matters.</li>
<li><strong>Why the system thinks so</strong>, in plain language, with the signals it used.</li>
<li><strong>What it recommends</strong>, as a specific action with an owner.</li>
<li><strong>What would change its mind</strong>, so they know when to revisit.</li>
</ol>
<p>A recommendation without the second item is an order from a machine. Leaders do not take orders from machines, and they should not. A recommendation with its reasoning beside it is a colleague&#39;s memo. That, they can act on, argue with, or overrule with a reason.</p>
<h2>Early warning beats late analysis</h2>
<p>The most valuable output of a decision-support system is not the quarterly analysis. It is the signal that arrives two weeks before the problem, when a small action still fixes it. That means the system has to watch continuously, compare against a baseline, and speak up only when the pattern is real.</p>
<p>The design question is not &quot;can we detect it.&quot; It is &quot;how do we present it so the person believes it early enough to act.&quot; The answer, again, is reasoning next to the alert, and a short history of how often that kind of alert turned out to be right.</p>
<h2>Explainable by construction</h2>
<p>There is a lot of talk about explainable AI as a technical property. In practice, explainability is a product decision made at the start. If the system stores the signals it used, the rule or model that fired, and the confidence it assigned, then explaining is a matter of showing. If it does not store them, no amount of later work will make it trustworthy.</p>
<p>This is the pattern behind the <a href="/work/qompass/">Qompass decision-support work</a>: a unified view of internal and external information, early-warning analysis, and recommendations that carry their reasoning with them into executive and departmental dashboards. The technical components matter. The reason leaders use it is that every suggestion can be interrogated.</p>
<h2>A test you can run tomorrow</h2>
<p>Take the last automated recommendation your organization received. Ask whoever received it three questions: did you act on it, why or why not, and could you tell where it came from. If the answer to the third question is no, the first two do not matter. Fix the third.</p>
<h2>For founders building in this space</h2>
<p>Do not sell prediction. Sell the brief. Show the decision-maker a screen with the situation, the reasoning, the action, and the owner, and let them tell you what is missing. What is missing is your roadmap, and it will not be a better model.</p>
<h2>Where the baseline comes from</h2>
<p>None of this works without a baseline, and most organizations do not have one. The first job of a decision-support system is often not to recommend anything. It is to watch quietly for a few weeks, establish what normal looks like for each signal, and show that history to the people who will later receive alerts. When the first early warning arrives, they can see it against the pattern. An alert without a visible baseline is just a red badge, and people learn to ignore red badges within a month.</p>
<p><strong>Data becomes a decision when the reasoning travels with the recommendation and reaches the person who can act.</strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>What a national platform taught me about scope</title>
      <link>https://kevindps.com/writing/what-a-national-platform-taught-me-about-scope/</link>
      <guid isPermaLink="true">https://kevindps.com/writing/what-a-national-platform-taught-me-about-scope/</guid>
      <pubDate>Mon, 19 Feb 2024 08:00:00 GMT</pubDate>
      <description>From the INA Digital launch-planning discussions: why decision rights, acceptance authority, and the smallest end-to-end outcome matter more than the feature list.</description>
      <content:encoded><![CDATA[<p>Two weeks ago I sat in a room at the Ministry of PANRB for launch-planning discussions on INA Digital, Indonesia&#39;s government digital-services initiative. Quantum&#39;s part is one contribution among many, and I am not going to describe the program from the inside. What I can write about is what a room like that does to your understanding of scope.</p>
<h2>Scope is not a list of features</h2>
<p>At national scale, the feature list is the least interesting document on the table. Everybody agrees that citizens should be able to do the thing. The hard questions are about authority:</p>
<ul>
<li>Who decides what &quot;the thing&quot; is when two agencies describe it differently?</li>
<li>Who accepts that it works, and against which scenario?</li>
<li>Who can say stop?</li>
</ul>
<p>If those three questions have no names attached, the feature list is fiction. Work will proceed, demos will happen, and nothing will be released, because nobody is allowed to say yes.</p>
<p>I had learned a version of this on smaller projects. Seeing it at this scale made it a rule: before any build starts, name the decision owner, the acceptance authority, and the person who can halt the work. Three names, written down, agreed by both sides.</p>
<h2>The smallest end-to-end outcome</h2>
<p>The second lesson is about size. When the ambition is national, the temptation is to plan for the whole thing at once, because anything smaller looks unambitious in a room full of ministries.</p>
<p>The opposite is true. The credible plan is the smallest outcome that runs end to end for one real user: one service, one citizen, one complete journey, on real infrastructure, accepted by a named person. Everything that follows is a repetition of a pattern that already works. Everything planned before that first slice exists is a hope.</p>
<p>This is not a small-company bias. It is how any system that has to survive contact with the public gets built. You find the narrowest path that proves the whole chain, you walk it, and then you widen it.</p>
<h2>What I carry back to client work</h2>
<p>Three practices came home with me from that room, and they now apply to every engagement, including the ones for companies of fifty people.</p>
<ol>
<li><strong>Decision rights before design.</strong> A workshop that ends without named owners for decisions and acceptance has not ended. Schedule the next one.</li>
<li><strong>One slice that touches everything.</strong> The first deliverable should cross every boundary the final system will cross: the user, the data, the permission, the integration, the report. Thin, but complete.</li>
<li><strong>Separate what was decided from what was discussed.</strong> Meeting notes are not decisions. A decision has an owner, a date, a reason, and the document it changed.</li>
</ol>
<h2>If you are sponsoring a large program</h2>
<p>Ask, in the first planning meeting, who can accept the first release and who can stop it. If the answer is a committee, ask which member signs. If nobody can say, you have found the real first deliverable of the program, and it is not software.</p>
<h2>The boring documents are the real ones</h2>
<p>What I took away had nothing to do with architecture diagrams. On any platform with many stakeholders, the documents that decide the outcome are the list of who can decide what, the scenario a first release will be judged against, and a dated record of the decisions already made. Those are dull to write and easy to skip when everyone is enthusiastic. They are also the only things that survive a change of personnel, a change of minister, or a change of vendor. On a program that will outlive every individual contributor, they are the product, and the software is an implementation of them.</p>
<p><strong>Name who decides, who accepts, and who can stop, then build the thinnest slice that touches everything.</strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>Design the operator's day before the database</title>
      <link>https://kevindps.com/writing/design-the-operators-day-before-the-database/</link>
      <guid isPermaLink="true">https://kevindps.com/writing/design-the-operators-day-before-the-database/</guid>
      <pubDate>Mon, 11 Sep 2023 08:00:00 GMT</pubDate>
      <description>Why I map a dispatcher's or a driver's day from trigger to end state before touching the data model, and what changes when you do.</description>
      <content:encoded><![CDATA[<p>Most software projects begin with a data model. Someone lists the entities, draws the relationships, and the screens are whatever the tables allow. The result is software that is technically correct and useless at nine in the morning, when a dispatcher has forty deliveries to assign and the tool wants her to create a &quot;shipment record&quot; first.</p>
<p>I do it the other way around. The first artifact is a person&#39;s day.</p>
<h2>Start with one person, one day</h2>
<p>Pick the person whose day the software has to survive. For a transport system, that is the dispatcher and the driver. Not the sponsor, not the IT lead. The person with the tightest loop.</p>
<p>Then write their day as a sequence:</p>
<p><code>trigger → what they do → what they look at → who they hand off to → where they wait → what decision they make → what goes wrong → how they know it is done</code></p>
<p>Do this for the most common case and for the exception they mention first. The exception is never optional. It is usually the reason the last tool was abandoned.</p>
<h2>What that sequence tells you</h2>
<p>Each step of the day translates directly into a design decision.</p>
<ul>
<li><strong>The trigger</strong> is your entry screen. If the day starts with a phone call, the first screen should accept a phone call&#39;s worth of information, not a form with twenty fields.</li>
<li><strong>What they look at</strong> is your default view. For a dispatcher, that means seeing deliveries, drivers, and progress together, with exceptions visible at a glance.</li>
<li><strong>The handoff</strong> is where a second role appears. In the <a href="/work/avian/">Avian project</a>, the dispatcher&#39;s plan becomes the driver&#39;s task list. Two people, two devices, one record.</li>
<li><strong>The wait</strong> is where you either show status or lose trust. Nobody minds waiting when they can see why.</li>
<li><strong>How they know it is done</strong> is your acceptance test. For a driver, done is a photo at the door. For the dispatcher, done is the day&#39;s board with nothing red on it.</li>
</ul>
<h2>Then, and only then, the data</h2>
<p>By the time the day is mapped, the data model is mostly written for you. The entities are the nouns in the sequence. The states are the columns of the dispatcher&#39;s board. The permissions are the handoffs. You still have to design it properly, but you are designing something you have already watched being used.</p>
<p>Doing it in this order also protects you from the most common enterprise failure: a beautiful schema that forces people to enter data the tool needs but they do not have yet. The day tells you what is actually known at each step.</p>
<h2>A practical test</h2>
<p>Before I show a first slice to anyone, I run the operator&#39;s day through it, out loud, as that person. If I have to explain a step, the step is wrong. If I have to switch to another tool for a piece of information, the screen is incomplete. If the exception has no home, we are not ready.</p>
<p>If you are commissioning software, ask your builder to walk you through one person&#39;s day in the product before they show you an entity diagram. It is a small request, and it tells you almost everything about whether the result will be used.</p>
<p><strong>Map the day, then the data. Software that fits the hours gets used; software that fits the schema gets routed around.</strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>Journo: a pipeline that turns articles into places</title>
      <link>https://kevindps.com/writing/journo-a-pipeline-that-turns-articles-into-places/</link>
      <guid isPermaLink="true">https://kevindps.com/writing/journo-a-pipeline-that-turns-articles-into-places/</guid>
      <pubDate>Mon, 22 May 2023 08:00:00 GMT</pubDate>
      <description>How I built Journo for Postcard: per-source crawlers, parsers, spaCy enrichment, SerpApi and Who's On First matching, a scoring threshold, and an operator dashboard.</description>
      <content:encoded><![CDATA[<p>Postcard helps people discover places worth visiting. To do that, the app needs a steady stream of recommendations from publishers, and every publisher writes about places differently. One puts the restaurant name in a heading. One buries it in a paragraph. One publishes structured JSON, one publishes a wall of HTML. The place names then have to become real, deduplicated records with coordinates before the app can use them.</p>
<p>That is the job Journo does. I designed and built it end to end, and the code is public at <a href="https://github.com/rndm-jpg/journo">github.com/rndm-jpg/journo</a>. This post is the walkthrough I wish someone had written for me before I started.</p>
<h2>The shape of the problem</h2>
<p>Three things make this harder than &quot;scrape and save&quot;:</p>
<ol>
<li><strong>Every source is its own structure.</strong> A single generic scraper produces garbage. Each source needs a crawler that knows where the content lives and a parser that knows what a place mention looks like there.</li>
<li><strong>A name is not a place.</strong> &quot;Sunda Kelapa&quot; is a harbor, a mosque, a district, and several restaurants. The pipeline has to turn a string into a specific location with coordinates, or admit it cannot.</li>
<li><strong>The work never ends.</strong> New articles arrive daily, and a good match today should not be rediscovered and re-uploaded tomorrow.</li>
</ol>
<h2>How it is built</h2>
<p><strong>Source registration.</strong> A source is an identifier tied to a crawler function and a parser module. Adding a publisher means adding those two pieces and registering them. Nothing else in the pipeline changes.</p>
<p><strong>Crawl and parse.</strong> Crawlers collect raw content per source. Parsers pull candidate place mentions out of that source&#39;s HTML or JSON, along with whatever context sits around them.</p>
<p><strong>Enrichment with spaCy.</strong> Before matching, spaCy adds location context to each candidate, so &quot;the cafe on the corner in Kemang&quot; carries &quot;Kemang&quot; into the search rather than losing it.</p>
<p><strong>Matching with SerpApi and Who&#39;s On First.</strong> Each enriched candidate is searched, then cross-referenced against Who&#39;s On First gazetteer data so the coordinates and the administrative context agree.</p>
<p><strong>Scoring and thresholds.</strong> A match is scored on names, descriptions, contacts, and websites. A configurable threshold drops weak matches. A unique place identifier stops the same place being processed twice across sources and runs.</p>
<p><strong>Operator dashboard.</strong> A React and Next.js frontend, backed by Django APIs, shows each source&#39;s processing session, how many pages and places it has handled, and where it stopped. Nobody should have to read logs to know whether last night&#39;s run worked.</p>
<p><strong>Parallelization.</strong> The amount of concurrent work is configurable, so the same pipeline runs on a laptop and on a proper server.</p>
<h2>What I would tell a founder</h2>
<p>The interesting engineering was not the scraping. It was deciding where a human needs to be able to look. Every stage writes its state where the dashboard can show it, because a pipeline that fails silently costs more than one that never ran.</p>
<p>The second lesson: keep the per-source code small and boring. The clever parts, enrichment, matching, scoring, are shared. The parts that break, the parsers, are isolated and cheap to fix.</p>
<p>If your product depends on turning messy public content into structured records, this is a workable pattern. Read the <a href="https://github.com/rndm-jpg/journo/blob/master/welcome-to-journo/cutting-edge-cross-referencing-power.md">matching write-up</a> in the repository if you want the detail, and the <a href="/work/journo/">project story</a> for the shorter version.</p>
<h2>What I deliberately left out</h2>
<p>There are no throughput numbers in this post, because the honest answer is &quot;it depends on the source, the hardware, and the threshold you choose.&quot; A strict threshold gives you fewer, cleaner places. A loose one gives you volume and a review queue. That trade-off belongs to the product owner, which is why it is a configuration value and not a constant buried in the code. The same goes for parallelization: the pipeline should fit the machine you have, not demand the machine I had.</p>
<p><strong>Isolate what breaks, share what is clever, and make every stage visible to a person.</strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>One year in: what enterprise clients actually pay for</title>
      <link>https://kevindps.com/writing/one-year-in-what-enterprise-clients-actually-pay-for/</link>
      <guid isPermaLink="true">https://kevindps.com/writing/one-year-in-what-enterprise-clients-actually-pay-for/</guid>
      <pubDate>Mon, 14 Nov 2022 08:00:00 GMT</pubDate>
      <description>After a year of building software for large organizations, the three things a buyer is really checking, and none of them is the feature list.</description>
      <content:encoded><![CDATA[<p>Quantum turned one this month. We have shipped for a national police command system, for logistics teams, and for a handful of companies whose names I cannot use. Somewhere in that year I stopped believing that enterprise clients buy features.</p>
<p>They do not. They buy a workflow that works on Monday morning, with their people, on their data, in their building. Everything else is decoration.</p>
<h2>The three checks</h2>
<p>When a serious buyer evaluates a builder, they are quietly running three checks. If you sell software, you should know what they are. If you buy software, you should run them on purpose.</p>
<p><strong>Check one: will the thing survive contact with my operation?</strong> They have seen demos. They have bought platforms that looked wonderful in the vendor&#39;s environment and collapsed the first time a field officer had no signal, or an invoice arrived in a format nobody expected. The question behind the question is: has this builder seen a real case, and did they design for the exception?</p>
<p><strong>Check two: who is accountable when it does not work?</strong> Large organizations are built from handoffs. A vendor who says &quot;the integration team will handle that&quot; has just told the buyer where the project will stall. What they want to hear is one name that owns the outcome, and a plan for what happens when a dependency fails.</p>
<p><strong>Check three: can I show my boss the result without a presentation?</strong> Every sponsor has a sponsor. If the result of the project needs a slide deck to be understood, the sponsor is exposed. If the result is a screen that a manager can open on Monday and see work moving through, the sponsor is safe. Buyers pay for safety.</p>
<h2>What this did to how we sell</h2>
<p>We stopped leading with capabilities. We lead with a recent case from the client&#39;s own operation, mapped from trigger to completion, with the exceptions marked. Then we propose the smallest end-to-end slice that would remove one wait or one re-entry from that map, and we name who on their side will confirm it works.</p>
<p>The proposal is shorter. The conversation is longer, because it is a real conversation about how their work happens. Deals take about the same time to close, but the projects that follow are calmer, because nobody is discovering the workflow after the contract.</p>
<h2>What this did to how we build</h2>
<p>Every slice we deliver has to pass a simple test before it is demonstrated: run the primary workflow, run the most likely failure, run the permission case, and record exactly which environment and which data it was tested on. Then show it to the person who will use it, not only the person who bought it.</p>
<p>That last part matters more than any feature. The people who use the tool decide whether it lives. If the dispatcher, the officer, or the analyst cannot get through their real case faster than before, the project is not done, whatever the contract says.</p>
<h2>If you are buying</h2>
<p>Ask the builder to describe the last exception they designed for. Ask who owns the outcome by name. Ask to see the result on a screen, not a slide. If the answers are quick and specific, you have found someone who understands what you are paying for.</p>
<h2>What it did to hiring</h2>
<p>The rule from day one still holds: people are paid by clients who have already paid. It has meant growing slowly and choosing engineers who are comfortable sitting with a dispatcher or an officer and asking what happened last Tuesday. That is a different skill from writing code, and it is the one I now interview for first. A brilliant engineer who cannot describe the user&#39;s day will build a brilliant system that the user routes around.</p>
<p><strong>Enterprises pay for a workflow that works on Monday, owned by a name, visible without a deck.</strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>Show me the last time this happened</title>
      <link>https://kevindps.com/writing/show-me-the-last-time-this-happened/</link>
      <guid isPermaLink="true">https://kevindps.com/writing/show-me-the-last-time-this-happened/</guid>
      <pubDate>Mon, 30 May 2022 08:00:00 GMT</pubDate>
      <description>Why I stopped asking teams to describe their process and started asking for the most recent real case, with the six questions that follow.</description>
      <content:encoded><![CDATA[<p>We have spent the past weeks inside a national operations system for the police, the kind of environment where the gap between the process on paper and the process on the ground is the whole project. It has settled something for me about how discovery should start.</p>
<p>I no longer open with &quot;walk me through your process.&quot; I open with &quot;show me the last time this happened.&quot;</p>
<h2>Why the described process is fiction</h2>
<p>When you ask a manager to describe how work flows, you get the happy path. It is honest, but it is an average of a hundred cases, and averages do not have exceptions. The exceptions are where the software will break, and where the people doing the work spend most of their day.</p>
<p>A recent real case has none of that smoothing. It has a specific trigger, a specific person, a specific wait, and the moment somebody made a judgment call that no document mentions. That is the material a workflow tool is actually made of.</p>
<h2>The six questions</h2>
<p>Once someone has a real case in front of them, I ask the same six things every time:</p>
<ol>
<li><strong>What triggered this?</strong> A call, a form, a message, a missed deadline. The trigger defines the entry point of any tool.</li>
<li><strong>What did you do next, and why?</strong> The &quot;why&quot; reveals the rule they are following, which is usually not the written one.</li>
<li><strong>What information did you need but not have?</strong> This is the list of things the system should put on the screen before anyone asks.</li>
<li><strong>Where did you wait, or type the same thing twice?</strong> Waits and re-entry are the cost centers. They are also the easiest wins.</li>
<li><strong>What was unusual about this case?</strong> Every case has something. That something is the exception path, and it needs a home in the design.</li>
<li><strong>How did you know it was safely done?</strong> The answer is the real definition of complete, and it becomes the acceptance test.</li>
</ol>
<p>Then I write each answer down with a label: observed, reported, or my interpretation. Three weeks later, when the team disagrees about how something works, that label is what stops the argument.</p>
<h2>What it changes in the build</h2>
<p>Discovery done this way produces a map that looks like this: trigger, action, artifact, handoff, decision, exception, end state, downstream consumer. It is not beautiful. It should not be beautiful yet. It is true, which matters more.</p>
<p>From that map, the first slice of software almost designs itself. It is the shortest path from the trigger to &quot;safely done&quot; for the most common case, with the most common exception handled and the rest visibly parked. Everything else waits until that slice is in someone&#39;s hands.</p>
<h2>If you are about to brief a builder</h2>
<p>Bring a recent case, not a process document. Bring the person who handled it, not only their manager. Expect the builder to ask what was unusual, and be honest about the part where you improvised. That improvisation is not a flaw in your operation. It is the requirement nobody wrote down.</p>
<h2>A note on recording</h2>
<p>The point of the labels is not bureaucracy. It is memory. In a police operations project, the person who told you how a dispatch actually works may be on a different shift next week, and the person replacing them may describe it differently. If the first account was recorded as &quot;reported&quot; with a date and a name, the difference becomes a question to resolve, not a contradiction that stalls the build. I keep the notes short, one line per answer, and I keep the labels honest even when the interpretation is mine and probably right.</p>
<p><strong>Ask for the last real case, label what you heard, and design for the exception you were told about.</strong></p>
]]></content:encoded>
    </item>
    <item>
      <title>The rule I set on day one: revenue before headcount</title>
      <link>https://kevindps.com/writing/starting-quantum-with-twenty-thousand-dollars/</link>
      <guid isPermaLink="true">https://kevindps.com/writing/starting-quantum-with-twenty-thousand-dollars/</guid>
      <pubDate>Tue, 18 Jan 2022 08:00:00 GMT</pubDate>
      <description>Two months into founding Quantum with $20K of my own money, the one rule that decides who gets hired, what gets built, and which projects I turn down.</description>
      <content:encoded><![CDATA[<p>Quantum is two months old. I started it in November 2021 with $20K of my own money, no investors, and one rule that I wrote down before I wrote a single line of code: every person we pay is paid by a client who has already paid us.</p>
<p>That sounds obvious. In practice it is the hardest discipline in a young software company, because everything about the early days pushes you the other way. You want a team. You want to look like a real firm when you walk into a meeting. You want to say yes to the interesting project that needs four people you do not have yet.</p>
<h2>Why the rule exists</h2>
<p>A services business runs on one number: cash collected from work that is finished and accepted. Not pipeline, not proposals, not &quot;we are close.&quot; I have watched good teams die of optimism, hiring for the deal that was about to close. The deal slips a quarter. Payroll does not.</p>
<p>So the rule is simple. Headcount follows revenue. Revenue follows delivered outcomes. Delivered outcomes follow clear scope. If I cannot trace a hire back to an invoice, the hire waits.</p>
<p>It has a second benefit that I did not expect. When you know the money is real, you can afford to be honest with a client. You can say the workflow does not need an app yet. You can say the scope they described is three projects, not one. You are not desperate, so you can be useful.</p>
<h2>What &quot;revenue first&quot; changes about the work</h2>
<p>It forces me to price outcomes, not hours of enthusiasm. Every engagement has to answer three questions before anyone starts:</p>
<ol>
<li>What result must exist at the end, and who will confirm it exists?</li>
<li>What is the smallest version of that result we can show working?</li>
<li>What does the client have to provide, and by when?</li>
</ol>
<p>If a prospect cannot answer the first question with me, we are not ready to start, no matter how excited both sides are. That is not a sales tactic. It is the only way I know to keep a small company from drowning in half-finished work.</p>
<h2>Saying no early</h2>
<p>The most expensive projects are the ones you should have declined in the first meeting. This month I turned down two. One wanted a platform with no owner on their side who could accept it. The other wanted a fixed price for a scope that changed twice during the call.</p>
<p>Declining early is a service to the client too. They lose nothing except a vendor who would have disappointed them slowly. If you run a company and a builder tells you no in the first conversation, that is the person worth calling back with a smaller, sharper problem.</p>
<h2>What this means if you are thinking of hiring us</h2>
<p>You will get a small team that grows only when the work has earned it. You will get a scope that names the outcome, the evidence, and the person who accepts it. You will get straight answers about what is worth building, including &quot;not yet.&quot;</p>
<p>The $20K is not a war chest. It is a runway that ends fast, and it is meant to. It keeps me focused on the only thing that matters in the first year: finish something a client is glad they paid for, then do it again.</p>
<h2>What I have already gotten wrong</h2>
<p>Two months is enough time to make mistakes. I underpriced the first engagement because I wanted the logo, and I am still paying for that in hours. I also let one scope conversation drift into a second and third meeting without writing anything down, and had to reconstruct what we agreed from memory. Both errors have the same fix: write the outcome, the price, and the acceptance in one page before the second meeting, and read it aloud at the start of the third.</p>
<p><strong>Pay for people with money you have already collected, and you will never have to lie to a client to make payroll.</strong></p>
]]></content:encoded>
    </item>
  </channel>
</rss>
