<?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: Ricardo Feldhaus Krisanoski</title>
    <description>The latest articles on DEV Community by Ricardo Feldhaus Krisanoski (@rkrisa).</description>
    <link>https://dev.to/rkrisa</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%2F3955754%2F6dfa9872-3be5-407e-907c-168ea2ded9c3.jpg</url>
      <title>DEV Community: Ricardo Feldhaus Krisanoski</title>
      <link>https://dev.to/rkrisa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rkrisa"/>
    <language>en</language>
    <item>
      <title>A Public Case Study Should Be an Evidence Map</title>
      <dc:creator>Ricardo Feldhaus Krisanoski</dc:creator>
      <pubDate>Sat, 31 Oct 2026 21:00:00 +0000</pubDate>
      <link>https://dev.to/rkrisa/a-public-case-study-should-be-an-evidence-map-5b29</link>
      <guid>https://dev.to/rkrisa/a-public-case-study-should-be-an-evidence-map-5b29</guid>
      <description>&lt;p&gt;A public case study asks a reader to infer something about your work. The structure should make that inference inspectable.&lt;/p&gt;

&lt;p&gt;A diagram can explain a design without proving deployment. A passing test suite can support software behavior without establishing usefulness. A strong metric can still describe a weak target.&lt;/p&gt;

&lt;p&gt;When I updated my portfolio with recent AI-assisted technical work, I wanted each case to connect its claim to the available evidence and to the limits of that evidence. This is a publishing practice, not a new experiment or a claim of independent personal mastery.&lt;/p&gt;

&lt;h2&gt;
  
  
  Name the claim before selecting the artifact
&lt;/h2&gt;

&lt;p&gt;Different claims need different support.&lt;/p&gt;

&lt;p&gt;“Implemented a retrieval path” calls for execution evidence and clear component boundaries. “Improved review quality” needs a workflow comparison with suitable references. “The original source is available” requires an actual source release, rather than a README describing private work.&lt;/p&gt;

&lt;p&gt;An entirely invented example shows the distinction. A case says, “The tool reduced review effort.” Its evidence link opens an architecture diagram and a screenshot. Those artifacts might explain the intended interaction, but they cannot establish the claimed reduction.&lt;/p&gt;

&lt;p&gt;A stronger version would state what was actually observed and list review effort as a measurement still needed. That gives the reader a useful conclusion without asking them to fill the evidence gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preserve denominators and the unit of repetition
&lt;/h2&gt;

&lt;p&gt;My recent retrieval case uses fictional documents and constructed references. Its evaluation contains 48 document/query cases per method, with 21 positive and 27 negative cases. Reporting top-three hits without the negative cases would hide an important part of the comparison.&lt;/p&gt;

&lt;p&gt;The controlled SMS experiment has 80 model runs across 20 paired seed blocks and four conditions. Those runs share one corpus partition. They are not 80 independent datasets.&lt;/p&gt;

&lt;p&gt;The RAG case has three held-out synthetic questions, only two answerable. Four variants generate twelve answers, but twelve answers do not become twelve independent questions. The original and adjusted rerankers tie on the answerable ranking metric, while human answer review remains pending.&lt;/p&gt;

&lt;p&gt;These are separate tasks. Their numbers cannot be pooled into a general score for AI-system quality.&lt;/p&gt;

&lt;h2&gt;
  
  
  State which artifact the reader actually receives
&lt;/h2&gt;

&lt;p&gt;The portfolio contains public writeups and reported aggregates. The original training packages, checkpoints, individual predictions, and private data are not released there.&lt;/p&gt;

&lt;p&gt;The small aggregate checker verifies arithmetic and consistency. It does not rerun models, reproduce bootstrap intervals from original predictions, or independently authenticate the measurements.&lt;/p&gt;

&lt;p&gt;That boundary belongs near the evidence links. A reader should not discover it only after trying to reproduce a training experiment from a case-study repository.&lt;/p&gt;

&lt;p&gt;The same applies to older operational pages. A blueprint, a draft case, and a completed local experiment should retain their own status. Updating the portfolio introduction should not silently promote all earlier material to verified production work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make personal contribution discussable
&lt;/h2&gt;

&lt;p&gt;AI-assisted execution can create real technical artifacts. It does not automatically establish that the author can explain every choice, modify the implementation independently, or correct a failure without a script.&lt;/p&gt;

&lt;p&gt;A credible case leaves room for those demonstrations. I can distinguish the implementation record from the next learning checkpoint and prepare to defend the target, comparison, and interpretation.&lt;/p&gt;

&lt;p&gt;That is more useful in a technical conversation than treating tool execution as a substitute for understanding.&lt;/p&gt;

&lt;h2&gt;
  
  
  Review the inference your page invites
&lt;/h2&gt;

&lt;p&gt;Before publishing a case, I use a short checklist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What precise capability does the main claim describe?&lt;/li&gt;
&lt;li&gt;Which artifact supports that claim?&lt;/li&gt;
&lt;li&gt;What are the denominator and independent unit?&lt;/li&gt;
&lt;li&gt;Is a planned step clearly separated from an observed result?&lt;/li&gt;
&lt;li&gt;Does the page identify assistance and source-release boundaries?&lt;/li&gt;
&lt;li&gt;What evidence would change the current conclusion?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://github.com/rkrisa/portfolio-ai-ops" rel="noopener noreferrer"&gt;portfolio evidence map&lt;/a&gt; links the &lt;a href="https://github.com/rkrisa/portfolio-ai-ops/tree/main/cases/traceable-document-evidence-retrieval" rel="noopener noreferrer"&gt;document-retrieval case&lt;/a&gt;, &lt;a href="https://github.com/rkrisa/portfolio-ai-ops/tree/main/cases/controlled-pytorch-experiments" rel="noopener noreferrer"&gt;controlled SMS experiment&lt;/a&gt;, and &lt;a href="https://github.com/rkrisa/portfolio-ai-ops/tree/main/cases/controlled-rag-reranker-experiment" rel="noopener noreferrer"&gt;RAG reranker comparison&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;What should a reader be able to verify before accepting the strongest claim in your next case study?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>architecture</category>
      <category>writing</category>
    </item>
    <item>
      <title>What a Small RAG Fine-Tuning Experiment Can Actually Prove</title>
      <dc:creator>Ricardo Feldhaus Krisanoski</dc:creator>
      <pubDate>Fri, 30 Oct 2026 21:00:00 +0000</pubDate>
      <link>https://dev.to/rkrisa/what-a-small-rag-fine-tuning-experiment-can-actually-prove-19ib</link>
      <guid>https://dev.to/rkrisa/what-a-small-rag-fine-tuning-experiment-can-actually-prove-19ib</guid>
      <description>&lt;p&gt;I fine-tuned a pretrained reranker, verified that its weights changed, reloaded the selected checkpoint, and ran a controlled comparison with the original model.&lt;/p&gt;

&lt;p&gt;The measured ranking gain on the held-out synthetic slice was zero.&lt;/p&gt;

&lt;p&gt;That result was useful. It showed that the training and evaluation path executed while giving me no reason to claim an improvement. The slice contained three questions, only two of them answerable. Both rerankers reached nDCG@5 of 1.0 on those two answerable questions.&lt;/p&gt;

&lt;p&gt;This is a local, AI-assisted experiment in progress. Real-domain fine-tuning and a sealed real held-out comparison have not been completed. Human review of generated answers is also pending. The current evidence supports a working experimental pipeline and a tied result on a tiny synthetic fixture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with the component and the decision
&lt;/h2&gt;

&lt;p&gt;The domain question is whether adjusting the reranker helps a retrieval-assisted answer system find useful source material and produce better supported answers.&lt;/p&gt;

&lt;p&gt;That question contains several mechanisms. Retrieval selects candidates. Reranking orders them. Generation turns the selected context into an answer. An output can fail because of any of these stages, and improving one metric does not guarantee improvement downstream.&lt;/p&gt;

&lt;p&gt;I chose to isolate reranking. The component being trained was a pretrained multilingual cross-encoder. The embedding model and answer generator remained fixed.&lt;/p&gt;

&lt;p&gt;The concrete model identities were:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Embeddings&lt;/td&gt;
&lt;td&gt;&lt;code&gt;intfloat/multilingual-e5-small&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reranker&lt;/td&gt;
&lt;td&gt;&lt;code&gt;cross-encoder/mmarco-mMiniLMv2-L12-H384-v1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Answer generator&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Qwen/Qwen3-1.7B&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These official model weights were downloaded and actually exercised locally. The experiment used a CPU runtime. I have no verified CUDA execution to report.&lt;/p&gt;

&lt;p&gt;Saying “I fine-tuned the RAG system” would leave too much unspecified. The adjusted weights belonged to the reranker; the experiment did not fine-tune the answer-generating language model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four variants with a fixed generator
&lt;/h2&gt;

&lt;p&gt;I implemented four comparisons to make the source of a difference easier to inspect:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variant&lt;/th&gt;
&lt;th&gt;Retrieval&lt;/th&gt;
&lt;th&gt;Reranking&lt;/th&gt;
&lt;th&gt;Generation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Fixed Qwen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;BM25 + E5, combined with reciprocal-rank fusion&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Same Qwen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;Same hybrid candidates&lt;/td&gt;
&lt;td&gt;Original pretrained cross-encoder&lt;/td&gt;
&lt;td&gt;Same Qwen&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;Same hybrid candidates&lt;/td&gt;
&lt;td&gt;Adjusted cross-encoder checkpoint&lt;/td&gt;
&lt;td&gt;Same Qwen&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The hybrid retriever returns up to twenty candidates. C and D score the same candidate set, including cases where it contains no relevant material. Injecting the known correct passage into one variant would make the comparison answer a different question.&lt;/p&gt;

&lt;p&gt;The generator identity includes the prompt, chat-template version, and decoding settings. Thinking was disabled for this comparison. Keeping those settings fixed matters because a prompt change can alter an answer even if retrieval is unchanged.&lt;/p&gt;

&lt;p&gt;A versus B examines the addition of retrieval in this setup. B versus C examines the pretrained reranker. C versus D is the direct comparison for the adjusted weights. The differences remain conditional on this corpus, candidate generation, prompt, and evaluation design.&lt;/p&gt;

&lt;h2&gt;
  
  
  A training command is not training evidence
&lt;/h2&gt;

&lt;p&gt;The synthetic training fixture contained forty pairs. I ran one epoch for each of three seeds: 42, 314, and 2026, with an effective batch size of sixteen.&lt;/p&gt;

&lt;p&gt;The verification checked actual weight updates. It also checked that the saved selected weights matched the intended checkpoint and that independently reloading it preserved the expected predictions.&lt;/p&gt;

&lt;p&gt;Those checks address concrete implementation mistakes: a frozen model that never updates, saving the wrong state, loading the original weights again, or evaluating a component whose identity does not match the recorded run.&lt;/p&gt;

&lt;p&gt;They establish that training happened. They do not establish useful learning on the domain task.&lt;/p&gt;

&lt;p&gt;On three answerable synthetic validation queries, nDCG@5 remained approximately 0.6667 before and after adjustment. The separately sealed synthetic held-out comparison also showed no ranking gain. I keep those two evaluations distinct rather than treating their denominators or scores as interchangeable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the denominator with the result
&lt;/h2&gt;

&lt;p&gt;The held-out fixture had two answerable questions and one unanswerable question. Four variants generated twelve answers in total.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Observation&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;th&gt;What it supports&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Answerable held-out questions&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;A very small ranking check&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unanswerable held-out questions&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Execution of an unsupported-question case&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C nDCG@5&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;Original reranker ordering on the answerable slice&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D nDCG@5&lt;/td&gt;
&lt;td&gt;1.0&lt;/td&gt;
&lt;td&gt;Adjusted reranker ordering on the same slice&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paired D minus C difference&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;No observed ranking gain on this slice&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Human answer ratings&lt;/td&gt;
&lt;td&gt;Pending&lt;/td&gt;
&lt;td&gt;No measured answer-quality conclusion yet&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A perfect score on two answerable questions leaves no visible room for an improvement in that metric. It does not establish that the original model is sufficient for deployment, or that fine-tuning would never help.&lt;/p&gt;

&lt;p&gt;The useful decision is narrower: this fixture cannot justify retaining the adjusted component on the basis of a measured benefit. A harder, independently reviewed domain evaluation is needed.&lt;/p&gt;

&lt;p&gt;Three training seeds also do not turn two answerable questions into six independent examples. Seed variation and variation across evaluation questions are different sources of uncertainty.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate retrieval from citations and factual support
&lt;/h2&gt;

&lt;p&gt;The evaluation has three layers because each catches a different failure.&lt;/p&gt;

&lt;p&gt;Retrieval relevance asks whether the system recovered and ranked the passages needed to answer a question. Recall@20, MRR@5, and nDCG@5 are computed over answerable questions. Unanswerable questions receive null retrieval metrics and are counted separately. A system cannot retrieve a nonexistent relevant passage.&lt;/p&gt;

&lt;p&gt;Citation integrity asks whether an emitted reference identifies a source that actually exists and belongs to the allowed context. This catches invented identifiers and broken provenance. It cannot establish that the cited text supports the claim.&lt;/p&gt;

&lt;p&gt;Human factual and utility review asks whether the answer is supported, whether the actual cited sources are correct, whether the response is useful, and whether clarification or handoff was appropriate.&lt;/p&gt;

&lt;p&gt;Consider this entirely invented example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Source: "This material supports engraving. Delivery timing depends
on the order and must be confirmed separately."

Answer: "Engraving is available, and delivery takes two days. [S1]"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The identifier could be valid, and the source could be highly relevant. The delivery claim would still be unsupported. A citation parser passing would not repair the answer.&lt;/p&gt;

&lt;p&gt;The lab prepares a blinded review packet with shuffled groups and answer ordering. Missing or unreviewed ratings remain pending. The generator does not approve its own factual correctness. The twelve synthetic answers currently have no completed human quality evaluation to report.&lt;/p&gt;

&lt;h2&gt;
  
  
  Freeze what the comparison depends on
&lt;/h2&gt;

&lt;p&gt;The pipeline binds corpus, splits, configuration, model identities, and actual weight hashes before the held-out evaluation. It verifies those bindings before inference.&lt;/p&gt;

&lt;p&gt;A one-use receipt is anchored beside the freeze record. Repeating a completed request with unchanged inputs returns its saved, hash-checked results instead of generating fresh predictions. Interrupted or changed-input runs remain recorded rather than becoming opportunities to quietly try again.&lt;/p&gt;

&lt;p&gt;This reduces accidental test reuse and configuration drift. It does not make the local operator unable to tamper with every file and receipt together. Independent storage and clear provenance still matter for an audit.&lt;/p&gt;

&lt;p&gt;For the real experiment, checkpoint selection must use validation only. The protocol retains validation results from all three seeds and selects the confirmatory comparison before observing the test. Picking whichever seed wins on the held-out result would change the role of that test.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real data introduces a different bottleneck
&lt;/h2&gt;

&lt;p&gt;Work on the real corpus has progressed: the factual sources were reviewed, an index was built, and relevance annotation is underway. That progress is not a completed real-domain experiment.&lt;/p&gt;

&lt;p&gt;Annotation needs usable positive passages, appropriate negatives, explicit answerability, and privacy review. A checkbox saying “reviewed” cannot substitute for missing passage labels or resolve a contradiction between “answerable” and “handoff.”&lt;/p&gt;

&lt;p&gt;Equivalent questions introduce another constraint. Reusing a reviewed decision can reduce repeated annotation, but the copied decision is not independent evidence. Equivalent questions need to remain in the same split component, with provenance linking the reuse.&lt;/p&gt;

&lt;p&gt;The protocol groups related customers, conversations, and near-duplicate questions before split assignment. It also keeps privacy review separate from relevance review. Approval to use a factual source does not automatically approve every conversation connected to it.&lt;/p&gt;

&lt;p&gt;Until those requirements are met, producing more training steps would run ahead of the evidence. The pending work is reference quality and dataset preparation, followed by actual training and a separately frozen comparison.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would change in the next evaluation
&lt;/h2&gt;

&lt;p&gt;I would include cases that make the components work harder: similar product sizes, material versus engraving questions, conflicting facts, missing price or delivery information, ambiguous requests, and prompt injection attempts.&lt;/p&gt;

&lt;p&gt;I would report failure categories alongside aggregate ranking scores: missing retrieval, misranking, unsupported claims, unnecessary abstention, and incorrect handoff. Human review would use the same factual sources for every answer.&lt;/p&gt;

&lt;p&gt;Loading time and warmed inference time would remain separate. Any operational benefit would need its own measured evidence rather than being inferred from a short model call or a passing software test.&lt;/p&gt;

&lt;p&gt;The current experiment proves that the selected models can run through a controlled local pipeline and that the pretrained reranker can be adjusted, saved, reloaded, and compared. Its synthetic held-out comparison found zero ranking gain. The next decision depends on independently reviewed domain examples and human answer evaluation.&lt;/p&gt;

&lt;p&gt;I have published the architecture, comparison table, results, and evidence boundaries in the &lt;a href="https://github.com/rkrisa/portfolio-ai-ops/blob/main/cases/controlled-rag-reranker-experiment/README.md" rel="noopener noreferrer"&gt;GitHub case study&lt;/a&gt;. It is a public writeup; the original training package, checkpoints, private sources, and individual predictions are not exported in that repository. The accompanying aggregate checker validates the arithmetic of the reported counts. It does not rerun the models, reproduce the training, or independently establish answer quality.&lt;/p&gt;

&lt;p&gt;What evidence would make you keep—or remove—a fine-tuned component from your retrieval pipeline?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>python</category>
      <category>rag</category>
    </item>
    <item>
      <title>Your AI Workflow Needs an Exception Contract</title>
      <dc:creator>Ricardo Feldhaus Krisanoski</dc:creator>
      <pubDate>Thu, 29 Oct 2026 21:00:00 +0000</pubDate>
      <link>https://dev.to/rkrisa/your-ai-workflow-needs-an-exception-contract-5gnh</link>
      <guid>https://dev.to/rkrisa/your-ai-workflow-needs-an-exception-contract-5gnh</guid>
      <description>&lt;p&gt;An operational brief can look complete while the information needed to act is still missing.&lt;/p&gt;

&lt;p&gt;A production item may have a deadline but no approved artwork. Two systems may disagree about its stage. A suggested next action may require an authority the current operator does not hold.&lt;/p&gt;

&lt;p&gt;In the anonymized ecommerce operating-layer case in my portfolio, exceptions and human decisions are part of the architecture. A related observability case describes a shared trace contract. Neither public page establishes a quantified benefit from exception handling. This note proposes a concrete contract for making unresolved work visible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Describe the unresolved condition as data
&lt;/h2&gt;

&lt;p&gt;A free-text warning can alert a person, but it is difficult to route, reconcile, or close consistently. A useful exception needs a type, source context, affected work, owner, and resolution state.&lt;/p&gt;

&lt;p&gt;It should also distinguish an observation from an interpretation. “Approval field unavailable” is different from “approval denied.” Missing data cannot safely become a negative business fact.&lt;/p&gt;

&lt;p&gt;Here is a wholly invented exception record:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"approval_context_missing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"observed_state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"required approval could not be established"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"proposed_action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"hold for review"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"owner_role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"production_coordinator"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"resolution_state"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"open"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"execution_allowed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This example is an illustrative contract, not an operational export. An implementation would need authorized source references and stable identity, without exposing private payloads in public logs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make the next human action specific
&lt;/h2&gt;

&lt;p&gt;A queue entry saying “AI uncertainty” asks the operator to investigate everything. A more useful entry asks them to confirm the applicable approval, resolve a source conflict, or assign an owner.&lt;/p&gt;

&lt;p&gt;The daily brief can then show what is known, which dependency is unresolved, and why a suggested action remains blocked. Human prioritization stays explicit.&lt;/p&gt;

&lt;p&gt;The same principle applies to a process change. An agent can structure a proposed SOP update, but the proposal remains a draft until the responsible owner and required approver act. A missing review is an exception state, not permission to publish the draft.&lt;/p&gt;

&lt;p&gt;These distinctions keep the system's narrative from outrunning its authority.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design recovery as part of the state machine
&lt;/h2&gt;

&lt;p&gt;Exceptions change over time. A missing field may arrive, a conflict may be resolved, or a decision may become stale after the source changes again.&lt;/p&gt;

&lt;p&gt;The workflow needs to recognize those transitions. A retry should update or reconcile the existing unresolved item where appropriate, rather than multiplying notifications. Closing an exception should preserve the reason and the evidence used to close it.&lt;/p&gt;

&lt;p&gt;Some failures belong to infrastructure; others belong to the business process. A temporarily unavailable connector can support a technical retry. An unresolved policy decision needs a person. Treating both as “retry later” hides the organizational work.&lt;/p&gt;

&lt;p&gt;This is a proposed implementation detail, not a claim that all transition paths in the case have already been verified.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connect exceptions to observability carefully
&lt;/h2&gt;

&lt;p&gt;A trace should identify the workflow, decision, outcome, risk, and review state without dumping customer messages or credentials. Sanitized references can connect the trace to authorized evidence.&lt;/p&gt;

&lt;p&gt;The observability pattern also keeps logging failures from becoming an uncontrolled failure of the operational workflow. That does not mean the system should conceal missing audit coverage. The appropriate degraded behavior depends on the action's requirements and must be defined explicitly.&lt;/p&gt;

&lt;p&gt;A practical review checklist is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can missing, conflicting, and unauthorized states be distinguished?&lt;/li&gt;
&lt;li&gt;Does each open item request a specific next action?&lt;/li&gt;
&lt;li&gt;Is ownership explicit when escalation occurs?&lt;/li&gt;
&lt;li&gt;Can retries avoid duplicate unresolved work?&lt;/li&gt;
&lt;li&gt;Does resolution retain its reason and source context?&lt;/li&gt;
&lt;li&gt;Can operators see when coverage or audit information is incomplete?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Measurements to collect include unresolved age, repeated transfers, missing ownership, and exceptions reopened after source changes. They should accompany review effort and error analysis.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/rkrisa/portfolio-ai-ops/tree/main/cases/ai-assisted-operating-system-personalized-ecommerce" rel="noopener noreferrer"&gt;ecommerce operating-layer case&lt;/a&gt; and &lt;a href="https://github.com/rkrisa/portfolio-ai-ops/tree/main/cases/ai-workflow-observability-contract" rel="noopener noreferrer"&gt;observability contract&lt;/a&gt; describe the surrounding design. Which unresolved state would make today's brief unsafe to treat as an execution plan?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>observability</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The Cost of Changing Your Automation Is Part of Its Design</title>
      <dc:creator>Ricardo Feldhaus Krisanoski</dc:creator>
      <pubDate>Wed, 28 Oct 2026 21:00:00 +0000</pubDate>
      <link>https://dev.to/rkrisa/the-cost-of-changing-your-automation-is-part-of-its-design-1lf6</link>
      <guid>https://dev.to/rkrisa/the-cost-of-changing-your-automation-is-part-of-its-design-1lf6</guid>
      <description>&lt;p&gt;The first automation demo usually shows the happy path. The more revealing demonstration is what happens when the process changes.&lt;/p&gt;

&lt;p&gt;Can an operator update the rule? Does the change require code, configuration, or another approval? How much has to be retested? Who can explain the effect afterward?&lt;/p&gt;

&lt;p&gt;These questions sit inside Decision Path Challenger, a public skill I built to examine a proposed technical path before meaningful implementation. The skill compares solution classes and their build, run, change, maintenance, and failure costs. This article develops the change-cost question; it reports no new deployment or measured savings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Define the operating change before the platform
&lt;/h2&gt;

&lt;p&gt;A request such as “create an agent for this workflow” already contains a mechanism. Before adopting it, I want to understand the outcome, the experience of doing the work, and the constraints that shape it.&lt;/p&gt;

&lt;p&gt;An entirely invented example makes the tradeoff concrete. A small operations team wants to route requests under a policy that changes frequently. Three plausible approaches are a native approval rule, a lightweight integration, and a custom agent-backed service.&lt;/p&gt;

&lt;p&gt;All three may produce a convincing demo. They distribute future change work differently.&lt;/p&gt;

&lt;p&gt;A native rule may be easy for the owner to inspect but limited in expressiveness. A lightweight integration may connect the existing tools while adding another runtime to maintain. A custom service can express richer behavior while increasing responsibility for code, releases, monitoring, and recovery.&lt;/p&gt;

&lt;p&gt;Those are hypotheses to examine, not universal rankings of the approaches.&lt;/p&gt;

&lt;h2&gt;
  
  
  Follow one rule through the system
&lt;/h2&gt;

&lt;p&gt;For each option, I would trace an example policy update from the person requesting it to the person experiencing the result.&lt;/p&gt;

&lt;p&gt;The path might involve editing a form, migrating stored values, changing a prompt, revising a permission, or updating a report. A small-looking change can touch several components when the same business rule has been copied across them.&lt;/p&gt;

&lt;p&gt;That is why “easy to build” and “easy to change” are separate claims. Prompt editing can also be consequential: a wording change may alter routing or make previously unsupported responses seem allowed.&lt;/p&gt;

&lt;p&gt;The useful comparison names the owner, artifact, verification, release path, and recovery step for the expected change. It should also reveal who becomes a permanent dependency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Include the cost of finding the mistake
&lt;/h2&gt;

&lt;p&gt;Change effort extends beyond applying the edit. Someone must determine whether the intended behavior occurred and whether an unrelated behavior regressed.&lt;/p&gt;

&lt;p&gt;A system with visible rules and a focused replay set may be easier to validate than one where the same logic is spread across several opaque steps. Conversely, a familiar native tool may still be difficult to inspect if it hides history or cannot show which version made a decision.&lt;/p&gt;

&lt;p&gt;I would ask each proposed design to demonstrate one representative change on invented inputs. The demonstration should include an expected failure and a reversal. This produces more useful evidence than arguing from a platform's general capabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choose the smallest reversible test
&lt;/h2&gt;

&lt;p&gt;The skill's output calls for a decisive recommendation and a small reversible next step. That step should reduce a meaningful uncertainty.&lt;/p&gt;

&lt;p&gt;For the invented routing example, the test might compare one native rule with a small integration on the same fictional cases. The objective would be to inspect ownership and change effort before expanding scope.&lt;/p&gt;

&lt;p&gt;A review checklist for that comparison is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which likely change would be expensive under this design?&lt;/li&gt;
&lt;li&gt;Where does the rule live, and where is it duplicated?&lt;/li&gt;
&lt;li&gt;Can its owner explain and revise it?&lt;/li&gt;
&lt;li&gt;Which evidence will confirm the revised behavior?&lt;/li&gt;
&lt;li&gt;Can the previous version be restored without losing history?&lt;/li&gt;
&lt;li&gt;What ongoing dependency does this choice create?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No cost reduction follows automatically from choosing the simpler option. The right path depends on the operating constraints and what the bounded test reveals.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/rkrisa/decision-path-challenger" rel="noopener noreferrer"&gt;public Decision Path Challenger repository&lt;/a&gt; contains the skill and its supporting artifacts. Which change would you ask an automation to survive before committing to its architecture?&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>ai</category>
      <category>productivity</category>
      <category>devops</category>
    </item>
    <item>
      <title>A Retrieval Result Needs an Allowed-Use Field</title>
      <dc:creator>Ricardo Feldhaus Krisanoski</dc:creator>
      <pubDate>Tue, 27 Oct 2026 21:00:00 +0000</pubDate>
      <link>https://dev.to/rkrisa/a-retrieval-result-needs-an-allowed-use-field-2hel</link>
      <guid>https://dev.to/rkrisa/a-retrieval-result-needs-an-allowed-use-field-2hel</guid>
      <description>&lt;p&gt;A passage can be relevant to a question and still be unsuitable for the response the system is preparing.&lt;/p&gt;

&lt;p&gt;An internal exception procedure might explain how a team works without granting permission to promise that exception to a customer. An old instruction might be semantically close to the query while no longer carrying authority.&lt;/p&gt;

&lt;p&gt;This is why the operational retrieval blueprint in my portfolio includes allowed-use metadata. The public artifact is a starter design with schema, synthetic documents, and evaluation questions. It is not proof of a fully deployed knowledge service or a measured improvement in answers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Relevance answers only part of the question
&lt;/h2&gt;

&lt;p&gt;A retriever ranks text according to a query and its scoring method. That score does not establish who may read the passage, whether it remains current, or which use it supports.&lt;/p&gt;

&lt;p&gt;The blueprint gives retrieved chunks source information, domain, version or updated date, allowed use, and an approval requirement. It also distinguishes customer-facing language from internal context.&lt;/p&gt;

&lt;p&gt;These fields describe different decisions. A passage may be available to a reviewer, allowed as internal context, and still require approval before it supports an external commitment.&lt;/p&gt;

&lt;p&gt;The permissions cannot depend only on the model noticing a warning in the prompt. The application needs to determine which sources are eligible before generation and which proposed operations remain authorized afterward.&lt;/p&gt;

&lt;h2&gt;
  
  
  Walk a result through its intended use
&lt;/h2&gt;

&lt;p&gt;Consider this wholly invented source record:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"heading"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Exceptional delivery requests"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"domain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"operations"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"allowed_use"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"internal_review"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"customer_facing"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"requires_human_approval"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is an illustrative metadata contract, not a record from an operational system.&lt;/p&gt;

&lt;p&gt;If a customer asks for an exceptional delivery arrangement, the source might help route the request to a reviewer. It should not be treated as a preapproved promise.&lt;/p&gt;

&lt;p&gt;The same retrieved text can therefore support a handoff explanation while being excluded from final customer wording. That is a more precise contract than attaching a generic “sensitive” label and hoping every downstream component interprets it consistently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preserve the rule with the passage
&lt;/h2&gt;

&lt;p&gt;Chunking can separate a paragraph from the qualification that made it safe to interpret. The eligibility metadata needs to travel with each chunk, and the source reference needs to lead back to the surrounding context.&lt;/p&gt;

&lt;p&gt;Updates create another problem. A new document version may change allowed use without greatly changing the text. A cached embedding or familiar similarity score does not establish that the previous permission still applies.&lt;/p&gt;

&lt;p&gt;The design should define what happens when metadata is missing, the source is superseded, or approval status cannot be established. A no-answer or review path is preferable to silently assigning the most permissive interpretation.&lt;/p&gt;

&lt;p&gt;These are requirements to validate in an implementation. The blueprint's existence does not establish that every invalidation or permission path has been exercised in a live workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evaluate inappropriate matches deliberately
&lt;/h2&gt;

&lt;p&gt;Retrieval evaluation should include sources that look useful but must not be used for the requested purpose.&lt;/p&gt;

&lt;p&gt;For example, a synthetic question could retrieve an internal exception procedure beside an approved public response. The expected behavior should specify which source may inform routing, which may support wording, and when no authorized answer exists.&lt;/p&gt;

&lt;p&gt;My practical review would ask:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is source access checked before results are exposed?&lt;/li&gt;
&lt;li&gt;Is allowed use carried through chunking and retrieval?&lt;/li&gt;
&lt;li&gt;Can the system distinguish internal context from quotable language?&lt;/li&gt;
&lt;li&gt;Does source versioning invalidate stale permissions?&lt;/li&gt;
&lt;li&gt;What happens when the relevant passage requires approval?&lt;/li&gt;
&lt;li&gt;Can the trace show which rule permitted the eventual use?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I would measure inappropriate-source selection, missing metadata, stale-version use, and review outcomes separately from ranking quality. Those are proposed measurements; this blueprint has no validated production results.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/rkrisa/portfolio-ai-ops/tree/main/cases/operational-knowledge-retrieval-layer" rel="noopener noreferrer"&gt;Operational Knowledge Retrieval Layer&lt;/a&gt; contains the starter contract and its synthetic scope. What does your system check after it decides that a passage is relevant?&lt;/p&gt;

</description>
      <category>rag</category>
      <category>ai</category>
      <category>architecture</category>
      <category>security</category>
    </item>
    <item>
      <title>A Read-Only Integration Is a Deliberate Product Boundary</title>
      <dc:creator>Ricardo Feldhaus Krisanoski</dc:creator>
      <pubDate>Mon, 26 Oct 2026 21:00:00 +0000</pubDate>
      <link>https://dev.to/rkrisa/a-read-only-integration-is-a-deliberate-product-boundary-1hlp</link>
      <guid>https://dev.to/rkrisa/a-read-only-integration-is-a-deliberate-product-boundary-1hlp</guid>
      <description>&lt;p&gt;An integration can provide useful operational visibility before it can change anything. That boundary deserves a product decision of its own.&lt;/p&gt;

&lt;p&gt;In a portfolio case, I describe a prepared marketplace ERP integration that exposes catalog and order reads through a protected proxy. The public case records the read-first design and credential boundaries. It does not provide a validated operational baseline or establish that a future write phase has been completed.&lt;/p&gt;

&lt;p&gt;The interesting question is what a read-only phase lets the team learn while the authority to mutate business records remains closed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate context from authority
&lt;/h2&gt;

&lt;p&gt;An internal agent may need to know whether a product exists, which attributes are recorded, or how an order is represented. None of those needs automatically requires permission to create products, change stock, or edit prices.&lt;/p&gt;

&lt;p&gt;Giving an agent a broadly privileged credential makes that distinction depend on every caller behaving correctly. A narrower proxy can express the intended boundary directly.&lt;/p&gt;

&lt;p&gt;The documented pattern keeps OAuth credentials inside the automation layer and exposes a protected lookup surface to internal scripts or agents. Secrets and private endpoints are not part of the public case.&lt;/p&gt;

&lt;p&gt;This remains an integration design, not a guarantee that all read access is harmless. Product and order data can still be sensitive. Authorization, data minimization, and access review belong in the read phase too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make the boundary observable
&lt;/h2&gt;

&lt;p&gt;A useful read-first phase should establish which fields are available and how reliably they represent the operational source.&lt;/p&gt;

&lt;p&gt;An entirely invented example illustrates the distinction. A lookup returns a product description that differs from an internal planning note. The integration can present both references for review. It should not infer that the planning note authorizes updating the source catalog.&lt;/p&gt;

&lt;p&gt;That disagreement is valuable evidence. It reveals a data-contract question before an automated write would make it harder to untangle.&lt;/p&gt;

&lt;p&gt;The first checks should include refusal of unauthenticated requests, success of an authorized read, and rejection of unsupported operations. A successful happy-path lookup alone would not demonstrate that the permission boundary holds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Avoid designing a universal proxy
&lt;/h2&gt;

&lt;p&gt;A proxy that forwards arbitrary paths and methods can recreate the original broad API surface under another name.&lt;/p&gt;

&lt;p&gt;For a bounded integration, I would expose named operations with explicit request validation and constrained response fields. Catalog lookup and order visibility need their own contracts. Internal callers should not have to understand the upstream credential or receive fields unrelated to their task.&lt;/p&gt;

&lt;p&gt;Errors also need interpretation. An unavailable source, an unauthorized request, and an item that does not exist are different states. Treating all of them as an empty result can make an agent invent an operational explanation.&lt;/p&gt;

&lt;p&gt;These are design recommendations for the next review, not a claim that this public writeup contains a released production proxy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Treat writes as a separate capability
&lt;/h2&gt;

&lt;p&gt;Enabling writes changes the failure cost. A mistaken read may mislead a reviewer; a mistaken stock update can alter downstream work.&lt;/p&gt;

&lt;p&gt;Before enabling a write phase, I would name the allowed mutation, its owner, preconditions, expected effect, and recovery procedure. Idempotency and readback become essential because a retry must not create another effect and a successful request does not necessarily prove the intended final state.&lt;/p&gt;

&lt;p&gt;A review checklist for that transition is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What concrete task requires a write?&lt;/li&gt;
&lt;li&gt;Can its scope be narrower than the upstream API?&lt;/li&gt;
&lt;li&gt;Which source version or precondition must still hold?&lt;/li&gt;
&lt;li&gt;How will retries avoid duplicate effects?&lt;/li&gt;
&lt;li&gt;What readback will confirm the resulting state?&lt;/li&gt;
&lt;li&gt;Who can stop, reverse, or investigate an incorrect mutation?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No write-phase outcome, speed improvement, or prevented-error count is claimed here. Those require separate evidence.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/rkrisa/portfolio-ai-ops/tree/main/cases/marketplace-erp-catalog-proxy" rel="noopener noreferrer"&gt;read-only ERP integration case&lt;/a&gt; describes the prepared boundary. Which information would let your users make progress before you grant the system authority to change it?&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>api</category>
      <category>security</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Make Handoffs Explainable Before You Make Them Automatic</title>
      <dc:creator>Ricardo Feldhaus Krisanoski</dc:creator>
      <pubDate>Sun, 25 Oct 2026 21:00:00 +0000</pubDate>
      <link>https://dev.to/rkrisa/make-handoffs-explainable-before-you-make-them-automatic-kn1</link>
      <guid>https://dev.to/rkrisa/make-handoffs-explainable-before-you-make-them-automatic-kn1</guid>
      <description>&lt;p&gt;“Send this to a person” looks like a complete fallback until the person opens the queue.&lt;/p&gt;

&lt;p&gt;They still need to discover why the item arrived, what the system already checked, which source is authoritative, and what action they are expected to take. If that reconstruction is missing from the design, the handoff transfers work without transferring enough context.&lt;/p&gt;

&lt;p&gt;I have documented context-aware reception and human-reviewed commercial follow-up patterns in my portfolio. Those public pages describe design directions, with operational outcomes still listed as metrics to collect. This note develops the handoff contract; it does not report a new live automation or a measured productivity improvement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with the decision the recipient owns
&lt;/h2&gt;

&lt;p&gt;A reception workflow and a commercial follow-up workflow do not share every responsibility. A conversation about an unresolved service issue should not automatically become a sales reactivation opportunity.&lt;/p&gt;

&lt;p&gt;The documented patterns therefore distinguish commercial context, follow-up lanes, operational limits, and human review. The handoff should preserve that distinction rather than route every uncertain item to a generic inbox.&lt;/p&gt;

&lt;p&gt;The recipient needs an answerable request: inspect a conflicting source, decide whether a message can be sent, or redirect the matter to the appropriate team. “Low confidence” can explain part of the trigger, but it does not define the work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use a packet a person can challenge
&lt;/h2&gt;

&lt;p&gt;Here is an entirely invented handoff example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Reason: current request conflicts with earlier campaign context
Current interpretation: product clarification may be required
Evidence: latest message and approved response guidance
Unresolved: which product the person means
Action requested: choose the appropriate clarification
Ownership: reception reviewer
External action: pending human decision
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is an illustrative contract, not an export from a customer conversation.&lt;/p&gt;

&lt;p&gt;The packet should distinguish observed facts from the system's interpretation. A reviewer can then reject the interpretation without losing the evidence. It should also show what remains unresolved, rather than presenting an AI summary as a completed investigation.&lt;/p&gt;

&lt;p&gt;Evidence references must respect the recipient's access. A handoff is not a reason to copy every historical message into every queue. The useful context is the minimum needed for the assigned decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Model ownership after delivery
&lt;/h2&gt;

&lt;p&gt;A route is not complete merely because an item appears in a queue. The design needs an owner, an accepted or pending state, and an escalation path if the receiving role cannot act.&lt;/p&gt;

&lt;p&gt;A sales reviewer may be able to approve a follow-up but unable to resolve a policy exception. That should become an explicit transfer with a reason. Otherwise, the queue can look active while responsibility is still absent.&lt;/p&gt;

&lt;p&gt;Similarly, a retry should not create several independent tasks for the same unresolved situation. Stable identity and explicit state transitions are important even when the final action remains human.&lt;/p&gt;

&lt;p&gt;These are proposed engineering requirements for a dependable handoff. The portfolio pages do not establish that every requirement has been deployed or that every queue transition has been measured.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the outcome in the quality loop
&lt;/h2&gt;

&lt;p&gt;A reviewer may confirm the interpretation, correct it, request more context, or decline the proposed action. Those outcomes help explain which handoffs were useful and which merely moved ambiguity around.&lt;/p&gt;

&lt;p&gt;I would measure unresolved ownership, missing evidence, repeated transfers, and corrected interpretations alongside response time. A fast transfer can still be a poor result if the next person cannot make the decision.&lt;/p&gt;

&lt;p&gt;A practical handoff review asks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is the requested human decision named?&lt;/li&gt;
&lt;li&gt;Are source facts separate from interpretation?&lt;/li&gt;
&lt;li&gt;Is the trigger specific enough to investigate?&lt;/li&gt;
&lt;li&gt;Does the recipient have the necessary authority and access?&lt;/li&gt;
&lt;li&gt;What happens when ownership is rejected or unclear?&lt;/li&gt;
&lt;li&gt;Can the system record the human outcome without inventing one?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://github.com/rkrisa/portfolio-ai-ops/tree/main/cases/context-aware-ai-reception-agent" rel="noopener noreferrer"&gt;context-resolution case&lt;/a&gt; and &lt;a href="https://github.com/rkrisa/portfolio-ai-ops/tree/main/cases/human-in-the-loop-commercial-follow-up" rel="noopener noreferrer"&gt;commercial follow-up design&lt;/a&gt; provide the surrounding patterns. What would a colleague need to receive a handoff and act without rebuilding the entire conversation?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>productivity</category>
      <category>ux</category>
    </item>
    <item>
      <title>Freeze the Comparison, Not the Working Document</title>
      <dc:creator>Ricardo Feldhaus Krisanoski</dc:creator>
      <pubDate>Sat, 24 Oct 2026 21:00:00 +0000</pubDate>
      <link>https://dev.to/rkrisa/freeze-the-comparison-not-the-working-document-4g8e</link>
      <guid>https://dev.to/rkrisa/freeze-the-comparison-not-the-working-document-4g8e</guid>
      <description>&lt;p&gt;A supplier comparison is a moving object. A revised offer arrives, a quantity changes, and someone corrects the delivery condition. The working document should accommodate those changes. The decision record needs to preserve what was actually compared.&lt;/p&gt;

&lt;p&gt;That distinction shaped an internal procurement implementation documented in my public portfolio. This article discusses its anonymized design pattern. It introduces no new deployment or measured purchasing benefit.&lt;/p&gt;

&lt;p&gt;The central question is simple: when someone revisits a purchase decision, can the system show the evidence and assumptions that existed when the choice was made?&lt;/p&gt;

&lt;h2&gt;
  
  
  Give the objects different lifecycles
&lt;/h2&gt;

&lt;p&gt;The original supplier document, normalized offer, working comparison, and decision snapshot serve different purposes.&lt;/p&gt;

&lt;p&gt;The document records what the supplier provided. Normalization records an interpretation: which number is the unit price, which unit applies, and what conditions accompany it. A working comparison lets the team resolve uncertainties. The snapshot preserves the comparison context submitted for a decision.&lt;/p&gt;

&lt;p&gt;Collapsing these into one editable row creates a subtle failure. A correction made today can make yesterday's decision appear to have used information that was not available then.&lt;/p&gt;

&lt;p&gt;In the documented implementation, originals are preserved with integrity metadata. Reprocessing creates another version. A human decision attaches to a frozen comparison and a justification, while the audit trail retains subsequent events.&lt;/p&gt;

&lt;h2&gt;
  
  
  A cheaper offer can be a different offer
&lt;/h2&gt;

&lt;p&gt;Consider this entirely invented example:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Offer&lt;/th&gt;
&lt;th&gt;Commercial statement&lt;/th&gt;
&lt;th&gt;Unresolved question&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Supplier Cedar&lt;/td&gt;
&lt;td&gt;Material priced per pack&lt;/td&gt;
&lt;td&gt;How many usable units does a pack contain?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Supplier Harbor&lt;/td&gt;
&lt;td&gt;Material priced per unit&lt;/td&gt;
&lt;td&gt;Does the specification match the approved requirement?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Neither headline value establishes the better purchase. Before comparing price, the buyer needs an equivalence rule covering the relevant specification, unit, quantity, and commercial conditions.&lt;/p&gt;

&lt;p&gt;The snapshot should capture the result of that review, including unresolved conditions. Recording only the chosen supplier and total would lose the reasoning that made the selection defensible.&lt;/p&gt;

&lt;p&gt;A source hash helps identify the document used. It does not prove that an extracted number is correct or that two items are equivalent. Those remain distinct checks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Freeze at the authority boundary
&lt;/h2&gt;

&lt;p&gt;Freezing every draft edit would burden the workflow without clarifying the decision. The useful boundary is the transition from a mutable comparison to a context on which an authorized person may act.&lt;/p&gt;

&lt;p&gt;At that transition, the system should validate the eligible offers and relevant policies, create the snapshot, and connect the human choice to it. Competing changes need explicit handling so that the choice cannot accidentally refer to one version while the displayed table shows another.&lt;/p&gt;

&lt;p&gt;A later correction should remain possible. It should produce an amendment, replacement decision, or new snapshot with a reason. It should not silently rewrite the earlier context.&lt;/p&gt;

&lt;p&gt;This also changes interface design. The buyer needs to recognize whether they are viewing the current workspace or the historical decision context. An attractive table is insufficient if that distinction is hidden.&lt;/p&gt;

&lt;h2&gt;
  
  
  Review the transition before adding extraction
&lt;/h2&gt;

&lt;p&gt;AI extraction could eventually help structure incoming evidence. In this case, external AI processing and other integrations remain separately gated. The comparison model must remain understandable before a parser adds another source of interpretation.&lt;/p&gt;

&lt;p&gt;My practical review checklist is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can a reviewer recover the original evidence associated with the decision?&lt;/li&gt;
&lt;li&gt;Are units and equivalence assumptions explicit?&lt;/li&gt;
&lt;li&gt;Does reprocessing create a version rather than overwrite evidence?&lt;/li&gt;
&lt;li&gt;Can a concurrent edit change an already confirmed comparison?&lt;/li&gt;
&lt;li&gt;Is the approver's choice connected to a snapshot and reason?&lt;/li&gt;
&lt;li&gt;Can a correction preserve the previous decision history?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Useful future measurements include the effort to reconstruct a decision, unresolved-equivalence frequency, and time from approved need to justified choice. I have no validated public baseline for those outcomes.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/rkrisa/portfolio-ai-ops/tree/main/cases/evidence-first-procurement-supplier-comparison" rel="noopener noreferrer"&gt;procurement case&lt;/a&gt; describes the wider implementation and its limits. What needs to remain inspectable after the working document changes?&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>database</category>
      <category>productivity</category>
      <category>ai</category>
    </item>
    <item>
      <title>What a Production Brief Should Say When the Data Is Incomplete</title>
      <dc:creator>Ricardo Feldhaus Krisanoski</dc:creator>
      <pubDate>Fri, 23 Oct 2026 21:00:00 +0000</pubDate>
      <link>https://dev.to/rkrisa/what-a-production-brief-should-say-when-the-data-is-incomplete-l64</link>
      <guid>https://dev.to/rkrisa/what-a-production-brief-should-say-when-the-data-is-incomplete-l64</guid>
      <description>&lt;p&gt;A production brief can be well written and still give the team the wrong impression of readiness. The danger is especially clear when the report combines current facts with missing channel data or unresolved dependencies.&lt;/p&gt;

&lt;p&gt;In my public operating-layer case, the daily brief connects normalized demand with deadlines, stages, artwork, materials, approvals and exceptions. Human prioritization remains part of the flow. This technical note develops how the brief should communicate incomplete information. It does not introduce a new deployment or claim a measured planning improvement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Completeness has more than one meaning
&lt;/h2&gt;

&lt;p&gt;An order can be present in the operational layer while its artwork approval remains unknown. A source can be reachable while its latest update is unavailable. A report can contain every field it was programmed to display while excluding a channel whose ingestion failed.&lt;/p&gt;

&lt;p&gt;Those are different gaps. A single “complete” indicator would make them difficult to distinguish.&lt;/p&gt;

&lt;p&gt;For a report design, I would separate source coverage, record readiness and decision readiness. Source coverage describes which inputs contributed. Record readiness describes the dependencies known for a particular item. Decision readiness describes whether the person has enough evidence and authority to select the next action.&lt;/p&gt;

&lt;p&gt;These are proposed reporting distinctions. The public case establishes the need to disclose missing coverage and uncertainty; it does not certify this exact field structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  An invented morning brief
&lt;/h2&gt;

&lt;p&gt;Consider a fictional brief with two visible work items. One has a confirmed deadline and material availability but still needs artwork approval. The other has an approved design, while its delivery commitment could not be refreshed from the source.&lt;/p&gt;

&lt;p&gt;Suppose another sales channel did not contribute data to this run. A polished summary saying “today's work is ready” would hide both item-level and coverage-level uncertainty.&lt;/p&gt;

&lt;p&gt;A more useful brief would state the known dependencies, identify the stale commitment, disclose the excluded channel and direct the unresolved decisions to a person. It would not invent an approval, silently reuse a date as current or claim that the visible items represent all demand.&lt;/p&gt;

&lt;p&gt;This is an invented example, not a real order list or a report from a production team.&lt;/p&gt;

&lt;h2&gt;
  
  
  Facts should remain separate from interpretation
&lt;/h2&gt;

&lt;p&gt;The operating-layer case calculates and reconciles facts before AI interpretation. That separation helps when the report is incomplete.&lt;/p&gt;

&lt;p&gt;The fact layer can state what arrived, what was checked and what remains unknown. The narrative can explain why an exception deserves attention. The explanation should not transform uncertainty into a confident priority simply to produce a cleaner opening paragraph.&lt;/p&gt;

&lt;p&gt;I would also preserve the source relationship behind important statements. If the brief says that approval is missing, a reviewer should be able to determine whether the source explicitly says “pending” or whether the approval source was unavailable. The operating responses can be very different.&lt;/p&gt;

&lt;p&gt;A generation timestamp alone cannot settle that question. The report may be newly generated from older or partially missing inputs. Freshness belongs to the contributing facts as well as the final document.&lt;/p&gt;

&lt;h2&gt;
  
  
  A checklist for a partial brief
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Does the opening state which sources contributed and which did not?&lt;/li&gt;
&lt;li&gt;Are unknown, pending and conflicting dependencies distinguishable?&lt;/li&gt;
&lt;li&gt;Can the reader identify stale facts without inspecting every system?&lt;/li&gt;
&lt;li&gt;Are statements about “all work” supported by actual source coverage?&lt;/li&gt;
&lt;li&gt;Does each exception show the decision or clarification still required?&lt;/li&gt;
&lt;li&gt;Can a person correct or reprioritize the brief without losing the original context?&lt;/li&gt;
&lt;li&gt;Are report generation and delivery retries kept from duplicating operational work?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The purpose is a usable partial report, not a perfect-looking report. Whether it helps the team would need evidence such as corrections, missed dependencies and planning effort measured against an appropriate baseline.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/rkrisa/portfolio-ai-ops/tree/main/cases/ai-assisted-operating-system-personalized-ecommerce" rel="noopener noreferrer"&gt;public operating-layer case&lt;/a&gt; describes the brief's role in the larger system and keeps quantitative benefits as metrics to collect.&lt;/p&gt;

&lt;p&gt;If an input disappears tomorrow morning, will your production brief explain the missing coverage before anyone acts on its priorities?&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>productivity</category>
      <category>ai</category>
    </item>
    <item>
      <title>Read Access and Action Authority Belong to Different Contracts</title>
      <dc:creator>Ricardo Feldhaus Krisanoski</dc:creator>
      <pubDate>Thu, 22 Oct 2026 21:00:00 +0000</pubDate>
      <link>https://dev.to/rkrisa/read-access-and-action-authority-belong-to-different-contracts-5d65</link>
      <guid>https://dev.to/rkrisa/read-access-and-action-authority-belong-to-different-contracts-5d65</guid>
      <description>&lt;p&gt;An employee may need to understand a procedure without having authority to change the records governed by it. An AI assistant inherits the same distinction when it retrieves knowledge and prepares a tool request.&lt;/p&gt;

&lt;p&gt;My public operating-layer case separates a knowledge plane from an action plane. Document groups and approved sources control retrieval. Roles, policy and approval rules control operational changes. This note examines the contract between those planes rather than claiming a new security certification or a completed authorization rollout.&lt;/p&gt;

&lt;h2&gt;
  
  
  A document can describe an action without granting it
&lt;/h2&gt;

&lt;p&gt;An approved procedure can explain how a financial exception is handled. That makes the procedure useful to someone who needs to recognize and route an exception. It does not necessarily authorize that reader to execute the financial change.&lt;/p&gt;

&lt;p&gt;The same issue arises when retrieved text reaches a model. The model can explain the procedure, summarize required evidence or identify the relevant authority. A generated request to perform the operation is still a request.&lt;/p&gt;

&lt;p&gt;Treating access to instructions as access to execution would let knowledge retrieval silently expand operational privileges. The output would look informed while the action boundary had disappeared.&lt;/p&gt;

&lt;p&gt;The two contracts therefore need different questions. Retrieval asks whether this identity may consult this approved source. Execution asks whether this identity may perform this operation on this object under the present conditions.&lt;/p&gt;

&lt;h2&gt;
  
  
  An invented exception request
&lt;/h2&gt;

&lt;p&gt;Imagine a fictional production operator who can read a procedure for dealing with an incorrect personalization. The operator asks the assistant what should happen next.&lt;/p&gt;

&lt;p&gt;The assistant retrieves the relevant procedure and prepares a proposed customer-remedy request. That can help explain the next step. It does not establish that the operator may authorize a financial adjustment.&lt;/p&gt;

&lt;p&gt;The action path would need to evaluate the requested operation, the affected object and the applicable approval rule. If additional authority is required, the request should remain a proposal with its evidence rather than being described as an executed remedy.&lt;/p&gt;

&lt;p&gt;This is an invented example. It does not disclose an actual customer case or assert that a particular remedy tool is connected in the public implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preserve the boundary after generation
&lt;/h2&gt;

&lt;p&gt;Putting role instructions into a prompt can help the assistant explain its scope. I would still require the action interface to enforce the actual authorization contract when a request arrives.&lt;/p&gt;

&lt;p&gt;That interface needs to distinguish the assistant's service identity from the human role represented in the request. The exact implementation depends on the system, but the review question is stable: whose authority is being evaluated, and what evidence binds it to this operation?&lt;/p&gt;

&lt;p&gt;Current state also matters. A source retrieved earlier can remain readable while the target object changes or the approval becomes invalid. An execution decision should therefore use the applicable current authorization state, not merely reuse the model's earlier narrative.&lt;/p&gt;

&lt;p&gt;The public case includes deterministic authorization and audit boundaries at the system-pattern level. It does not publish its production policy definitions. The details here are questions to apply during design and testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test the contracts separately
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Can an authorized reader retrieve the right approved procedure?&lt;/li&gt;
&lt;li&gt;Is an unrelated or restricted source excluded from that retrieval?&lt;/li&gt;
&lt;li&gt;Can the same reader be denied an operation outside their authority?&lt;/li&gt;
&lt;li&gt;Does a proposed tool request remain distinguishable from a completed action?&lt;/li&gt;
&lt;li&gt;Are object state and required approvals checked at execution time?&lt;/li&gt;
&lt;li&gt;Does the audit record identify the operation, authority decision and outcome without copying unnecessary private content?&lt;/li&gt;
&lt;li&gt;Can a reviewer explain a denial without treating it as a retrieval failure?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those checks examine different responsibilities. Passing the knowledge checks does not certify action safety, and passing a tool authorization test does not establish retrieval quality.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/rkrisa/portfolio-ai-ops/tree/main/cases/ai-assisted-operating-system-personalized-ecommerce" rel="noopener noreferrer"&gt;public operating-layer case&lt;/a&gt; describes the two planes and their intended relationship.&lt;/p&gt;

&lt;p&gt;Where in your system is an informed suggestion converted into an authorized operation, and can you inspect that boundary independently of the prompt?&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>Do Not Turn an Observability Failure into a Business Outage</title>
      <dc:creator>Ricardo Feldhaus Krisanoski</dc:creator>
      <pubDate>Wed, 21 Oct 2026 21:00:00 +0000</pubDate>
      <link>https://dev.to/rkrisa/do-not-turn-an-observability-failure-into-a-business-outage-4f55</link>
      <guid>https://dev.to/rkrisa/do-not-turn-an-observability-failure-into-a-business-outage-4f55</guid>
      <description>&lt;p&gt;The rule in my public AI workflow observability contract is direct: observability failures must not break the production workflow.&lt;/p&gt;

&lt;p&gt;Applying that rule requires a precise boundary. A trace-delivery error should not silently become a business failure, but an authorization failure cannot be dismissed as optional telemetry. Both may appear in the same execution history while requiring very different responses.&lt;/p&gt;

&lt;p&gt;This technical note examines that distinction. The public contract describes standardized, sanitized trace fields and a bridge pattern. It does not provide measured availability guarantees or certify the recovery behavior discussed below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Name the failed responsibility
&lt;/h2&gt;

&lt;p&gt;A workflow can perform a business operation, evaluate an authorization rule and emit a trace. These responsibilities may be adjacent in code without sharing the same failure policy.&lt;/p&gt;

&lt;p&gt;If a permission check is unavailable, the system cannot simply assume permission. If the trace destination is unavailable after an authorized operation completes, replaying the operation to recover the missing trace may duplicate work.&lt;/p&gt;

&lt;p&gt;The useful first question is therefore not “Should this exception be swallowed?” It is “Which responsibility failed, and what state is already known?”&lt;/p&gt;

&lt;p&gt;I would represent the business outcome and observability outcome separately. The business operation might be confirmed while trace delivery remains pending or failed. That state is more informative than replacing the entire execution with a generic error.&lt;/p&gt;

&lt;h2&gt;
  
  
  An invented trace timeout
&lt;/h2&gt;

&lt;p&gt;Consider a fictional workflow that routes an item to human review. The routing operation confirms success. A subsequent request to the observability bridge times out.&lt;/p&gt;

&lt;p&gt;If the orchestrator treats every downstream error as a reason to rerun the whole workflow, it could create a second review item. The missing trace would have caused a business duplication.&lt;/p&gt;

&lt;p&gt;In the proposed design, recovery would retry or reconcile the trace operation using its existing relationship to the execution. It would not assume the routing failed. A separate operational signal would expose the missing visibility.&lt;/p&gt;

&lt;p&gt;This invented example illustrates a failure boundary. It is not a report of an actual outage, an implemented queue configuration or a tested delivery guarantee.&lt;/p&gt;

&lt;h2&gt;
  
  
  Degraded visibility must remain visible
&lt;/h2&gt;

&lt;p&gt;Separating failures does not mean discarding them. If trace delivery fails repeatedly, the system needs another way to reveal the gap. Otherwise, “business flow continues” becomes “nobody knows which evidence is missing.”&lt;/p&gt;

&lt;p&gt;For an implementation review, I would ask how trace attempts are bounded, how execution identity survives retries and how missing outcomes can be reconciled. I would also examine whether a slow trace destination can accumulate enough waiting work to affect the business path indirectly.&lt;/p&gt;

&lt;p&gt;Those are design checks, not claims that buffering or a particular timeout policy already exists in the public case.&lt;/p&gt;

&lt;p&gt;Data minimization remains part of the same contract. Falling back to an unrestricted local log would be a poor recovery if it exposed raw messages, authentication material or private operational payloads. The reduced trace should still describe decisions, risks and review state through approved fields and sanitized references.&lt;/p&gt;

&lt;h2&gt;
  
  
  A boundary checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Is business success recorded independently of trace-delivery success?&lt;/li&gt;
&lt;li&gt;Are authorization and integrity checks kept outside the optional telemetry failure policy?&lt;/li&gt;
&lt;li&gt;Can a trace retry avoid rerunning the business effect?&lt;/li&gt;
&lt;li&gt;Are repeated trace failures discoverable through a separate operating signal?&lt;/li&gt;
&lt;li&gt;Is waiting or buffering bounded rather than allowed to grow invisibly?&lt;/li&gt;
&lt;li&gt;Do degraded paths preserve the same data-minimization rules?&lt;/li&gt;
&lt;li&gt;Can a reviewer distinguish missing telemetry from an absent business event?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The next evidence would come from controlled interruption tests and reconciliation records. A documented rule alone cannot establish that the runtime honors it.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/rkrisa/portfolio-ai-ops/tree/main/cases/ai-workflow-observability-contract" rel="noopener noreferrer"&gt;public observability contract&lt;/a&gt; explains the trace fields and safety boundaries behind this note. Coverage and review-outcome capture remain metrics to collect.&lt;/p&gt;

&lt;p&gt;If your trace store stopped responding, which business effects would your retry policy repeat, and how would you discover the visibility gap?&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>programming</category>
      <category>ai</category>
    </item>
    <item>
      <title>A Retry Needs an Identity, Not Just Another Attempt</title>
      <dc:creator>Ricardo Feldhaus Krisanoski</dc:creator>
      <pubDate>Tue, 20 Oct 2026 21:00:00 +0000</pubDate>
      <link>https://dev.to/rkrisa/a-retry-needs-an-identity-not-just-another-attempt-17a0</link>
      <guid>https://dev.to/rkrisa/a-retry-needs-an-identity-not-just-another-attempt-17a0</guid>
      <description>&lt;p&gt;A workflow timeout tells me that an attempt did not finish cleanly from the caller's perspective. It does not tell me whether the business effect happened.&lt;/p&gt;

&lt;p&gt;That uncertainty is central to retry design. Repeating an operation can recover missing work, duplicate completed work or apply an old instruction after the source has changed.&lt;/p&gt;

&lt;p&gt;My public ecommerce operating-layer case describes normalized demand, explicit exceptions and workflows designed to recover without creating duplicate work. This note develops the identity questions behind that pattern. It proposes a review contract rather than documenting a new production schema or a measured delivery guarantee.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate three things that can look like one event
&lt;/h2&gt;

&lt;p&gt;The source event describes something reported by an authoritative system. The processing attempt describes a particular effort to handle it. The business effect describes the work the application intends to create or change.&lt;/p&gt;

&lt;p&gt;Those identities should not collapse into the same value merely because one trigger started the workflow.&lt;/p&gt;

&lt;p&gt;An attempt identifier helps explain which execution failed. It does not necessarily identify the intended effect. Conversely, an effect identity can remain stable across attempts, while the attempt history records different outcomes.&lt;/p&gt;

&lt;p&gt;The exact keys depend on the domain and source guarantees. I would first ask which source object or revision defines the intent, what makes two effects equivalent, and where the system can authoritatively check completion.&lt;/p&gt;

&lt;h2&gt;
  
  
  An invented interruption
&lt;/h2&gt;

&lt;p&gt;Imagine a fictional order event that should create a production-review item. The worker submits the item, but loses the response before it can record success.&lt;/p&gt;

&lt;p&gt;Starting another worker with a new attempt identifier is appropriate for diagnostics. Creating another production item simply because the attempt is new would duplicate the intended work.&lt;/p&gt;

&lt;p&gt;A proposed retry contract would preserve the original effect identity and consult the authoritative completion state before deciding what to do. If the source order had since changed, that revision would need an explicit relationship to the original intent. It should not be disguised as another attempt at an unchanged operation.&lt;/p&gt;

&lt;p&gt;This is a design illustration, not a real order or a claim that one identifier can guarantee exactly-once execution across arbitrary systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  The check belongs near the effect
&lt;/h2&gt;

&lt;p&gt;A workflow-level flag can be useful, but it can also become stale. If two attempts both read “not completed” before either writes success, the flag alone does not prevent duplicate effects.&lt;/p&gt;

&lt;p&gt;For a concrete implementation, I would inspect the actual effect boundary: what operation can reject an equivalent duplicate, what record establishes completion and how competing attempts are resolved. The answer might involve a transactional constraint or a destination-provided idempotency contract. This note does not prescribe either as an already deployed feature.&lt;/p&gt;

&lt;p&gt;The recovery path also needs to preserve uncertainty. “Request sent” and “effect confirmed” are different outcomes. If the destination cannot confirm either success or absence, the item may require reconciliation rather than another blind send.&lt;/p&gt;

&lt;p&gt;For reports, the same distinction applies to calculation and delivery. Recomputing a narrative can be harmless while sending it again is a separate external effect.&lt;/p&gt;

&lt;h2&gt;
  
  
  A retry review checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Can the source intent be identified independently of the worker attempt?&lt;/li&gt;
&lt;li&gt;Is an updated source revision distinguishable from a replay?&lt;/li&gt;
&lt;li&gt;Is the intended business effect defined precisely enough to detect an equivalent duplicate?&lt;/li&gt;
&lt;li&gt;Where is completion checked, and can competing attempts race past that check?&lt;/li&gt;
&lt;li&gt;Does the record distinguish attempted, uncertain and confirmed effects?&lt;/li&gt;
&lt;li&gt;Can unresolved cases be reconciled without pretending that a timeout means failure?&lt;/li&gt;
&lt;li&gt;Are report generation and report delivery tracked as separate operations?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These questions help make a recovery design inspectable. They do not prove the behavior of a live connector. That requires tests against its actual guarantees, interruption scenarios and observed reconciliation outcomes.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/rkrisa/portfolio-ai-ops/tree/main/cases/ai-assisted-operating-system-personalized-ecommerce" rel="noopener noreferrer"&gt;public ecommerce operating-layer case&lt;/a&gt; provides the operational context for this identity boundary.&lt;/p&gt;

&lt;p&gt;Which identity in your workflow survives a retry, and which identity should change with every attempt?&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
