<?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 Quote Comparison Needs an Equivalence Policy</title>
      <dc:creator>Ricardo Feldhaus Krisanoski</dc:creator>
      <pubDate>Sun, 18 Oct 2026 21:00:00 +0000</pubDate>
      <link>https://dev.to/rkrisa/a-quote-comparison-needs-an-equivalence-policy-55f</link>
      <guid>https://dev.to/rkrisa/a-quote-comparison-needs-an-equivalence-policy-55f</guid>
      <description>&lt;p&gt;Sorting supplier offers by price is easy. Establishing what those prices refer to is the part that needs a policy.&lt;/p&gt;

&lt;p&gt;An offer may use a different unit, specification, delivery condition or validity period. A clean comparison table can conceal those differences if normalization turns them into apparently equivalent rows without recording a judgment.&lt;/p&gt;

&lt;p&gt;My public procurement case separates original supplier evidence, normalized working data, a frozen comparison snapshot and a justified human decision. This technical note focuses on the boundary between normalization and equivalence. It does not report a new deployment or a measured purchasing benefit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Normalization does not grant eligibility
&lt;/h2&gt;

&lt;p&gt;Normalization makes information easier to compare. It can standardize a unit name, preserve the quoted quantity and expose a delivery term in a consistent field.&lt;/p&gt;

&lt;p&gt;Equivalence asks a different question: does this offer satisfy the approved need under the comparison policy?&lt;/p&gt;

&lt;p&gt;A unit conversion can be mathematically valid while the product remains unsuitable. An apparently matching description may omit a required specification. A delivery date can be acceptable for one requisition and disqualifying for another.&lt;/p&gt;

&lt;p&gt;The data model should let a reviewer inspect those distinctions. A normalized price should retain its relationship to the original offer, and an unresolved equivalence check should remain unresolved. It should not become eligible because a parser successfully populated the numeric fields.&lt;/p&gt;

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

&lt;p&gt;Imagine a fictional requisition for mounting kits. One offer describes a pack of compatible kits with delivery within the required window. Another describes individual brackets with a lower headline price, but leaves the fasteners and delivery condition unclear.&lt;/p&gt;

&lt;p&gt;Converting both offers into a price per component would not establish that either component meets the requested kit specification. The missing fasteners could change the required purchase, and uncertain delivery could change whether the offer is usable.&lt;/p&gt;

&lt;p&gt;Under a proposed category policy, the second offer would need clarification before entering an eligible-price comparison. The point is not that it must lose. It is that its eligibility cannot be inferred from the lower number. This is an invented example, not a published supplier quote.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make the policy reviewable
&lt;/h2&gt;

&lt;p&gt;I would describe an equivalence policy in terms of required attributes, permitted transformations and unresolved conditions.&lt;/p&gt;

&lt;p&gt;Required attributes establish what must be known. Permitted transformations describe how quantities or units can be reconciled. Review conditions identify judgments that cannot safely be automated, such as whether a substitute material satisfies the operational need.&lt;/p&gt;

&lt;p&gt;Policy versioning matters because a justified decision belongs to the rules and evidence available at the time. If a category policy changes later, the system should preserve the original decision context rather than silently reinterpreting it.&lt;/p&gt;

&lt;p&gt;The procurement case uses frozen comparison snapshots for that reason. New evidence can support a new comparison. It should not rewrite what an earlier buyer saw or the reason they recorded.&lt;/p&gt;

&lt;h2&gt;
  
  
  A checklist before sorting eligible prices
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Is the approved need explicit enough to define a comparable item?&lt;/li&gt;
&lt;li&gt;Are unit, quantity and specification checks recorded separately?&lt;/li&gt;
&lt;li&gt;Are commercial and delivery conditions available for inspection?&lt;/li&gt;
&lt;li&gt;Is every transformed value linked to its original evidence?&lt;/li&gt;
&lt;li&gt;Can an offer remain pending without receiving a fabricated equivalent value?&lt;/li&gt;
&lt;li&gt;Is the policy version bound to the frozen comparison?&lt;/li&gt;
&lt;li&gt;Does an authorized person record the final choice and justification?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This checklist is a design aid. A completed checklist does not independently prove that a particular product is suitable or that the buying decision saved money.&lt;/p&gt;

&lt;p&gt;The next useful measurements would include clarification frequency, unresolved equivalence cases and the time required to reconstruct a prior decision. Those remain measurement work, rather than benefits inferred from the presence of a comparison interface.&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;public procurement case&lt;/a&gt; documents the evidence and authority pattern behind this note.&lt;/p&gt;

&lt;p&gt;Which attributes would your system need to establish before it is allowed to call two offers comparable?&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>A Useful Context Packet Should Explain What It Left Out</title>
      <dc:creator>Ricardo Feldhaus Krisanoski</dc:creator>
      <pubDate>Sat, 17 Oct 2026 21:00:00 +0000</pubDate>
      <link>https://dev.to/rkrisa/a-useful-context-packet-should-explain-what-it-left-out-4jo1</link>
      <guid>https://dev.to/rkrisa/a-useful-context-packet-should-explain-what-it-left-out-4jo1</guid>
      <description>&lt;p&gt;A small context packet can make an AI response easier to control. It can also hide an important decision: which available information did the system exclude, and why?&lt;/p&gt;

&lt;p&gt;In my public context-aware reception case, the central design is a resolver before generation. It reads operational context, selects an approved commercial directive and passes a smaller package to the response agent. The model does not receive every campaign clue, historical message and response rule as an undifferentiated bundle.&lt;/p&gt;

&lt;p&gt;This technical note explores an extension to that pattern: an exclusion record for the reviewer. It is a design proposal, not a claim that a new exclusion ledger has been deployed or improved response quality.&lt;/p&gt;

&lt;h2&gt;
  
  
  Selection creates a second explanation problem
&lt;/h2&gt;

&lt;p&gt;When a reply is wrong, inspecting the final prompt may explain what the model saw. It cannot necessarily explain what a preceding resolver discarded.&lt;/p&gt;

&lt;p&gt;That distinction matters when sources disagree. A campaign attribution can indicate one product family while the current conversation points elsewhere. A historical CRM field can still be populated even though its meaning is no longer current. An approved directive may exist without being applicable to this interaction.&lt;/p&gt;

&lt;p&gt;The resolver needs a selection policy before generation. A reviewer also needs to distinguish “not available,” “available but stale,” and “available but deliberately excluded.” Those states imply different corrective work.&lt;/p&gt;

&lt;p&gt;An absent source may require an integration check. An outdated source may need a freshness rule. A valid source excluded under the wrong policy may reveal a resolver defect. Adding more material to the prompt would not necessarily fix any of them.&lt;/p&gt;

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

&lt;p&gt;Consider a fictional interaction about a replacement accessory. The system has a campaign signal for a complete product, an old CRM category and an approved accessory-support directive.&lt;/p&gt;

&lt;p&gt;The proposed resolver output could identify the support directive as selected, record that the campaign signal was insufficient to establish the current request, and mark the old category as requiring freshness review. It would retain sanitized source references rather than copying the conversation into another log.&lt;/p&gt;

&lt;p&gt;The response agent would receive the relevant directive and remaining uncertainty. A reviewer could separately inspect the exclusion reasons. This example describes a proposed contract; it is not a real customer exchange or an observed outcome.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the packet and the review record distinct
&lt;/h2&gt;

&lt;p&gt;I would avoid solving this by placing every excluded source back into the agent's context. That would recreate the ambiguity the resolver was introduced to reduce.&lt;/p&gt;

&lt;p&gt;Instead, the response packet would contain the selected context, the applicable directive and any uncertainty needed to answer safely. A separate review record would capture source categories considered, the selection-policy version and concise exclusion reasons.&lt;/p&gt;

&lt;p&gt;Access rules would apply to both records. A trace reference should not become a route around document permissions, and a reason code should not accidentally reveal sensitive source content.&lt;/p&gt;

&lt;p&gt;The record would also need a bounded vocabulary. “Lower priority” is weak evidence if nobody can explain which rule established priority. Useful reasons describe a check: outside the current request, superseded version, unresolved conflict, insufficient attribution or unavailable source.&lt;/p&gt;

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

&lt;p&gt;Before adopting an exclusion record, I would check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can the reviewer distinguish missing input from deliberate exclusion?&lt;/li&gt;
&lt;li&gt;Does every exclusion reason correspond to an explicit rule?&lt;/li&gt;
&lt;li&gt;Can the selected directive be traced to an approved version?&lt;/li&gt;
&lt;li&gt;Does unresolved conflict remain visible to the response path?&lt;/li&gt;
&lt;li&gt;Are references sanitized and subject to the original access boundaries?&lt;/li&gt;
&lt;li&gt;Can a reviewer reconstruct the resolver decision without expanding the model's prompt?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These checks establish an inspectable design. They do not demonstrate that the resolver selects correctly. That would require reviewed cases, disagreement analysis and a measured baseline for wrong-context replies.&lt;/p&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;public context-aware reception case&lt;/a&gt; provides the underlying resolver pattern and its current evidence limits.&lt;/p&gt;

&lt;p&gt;When you review an AI response, can you explain both the context it received and the relevant context the system chose to leave out?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>programming</category>
    </item>
    <item>
      <title>An Evaluation Score Is Only as Useful as Its Target</title>
      <dc:creator>Ricardo Feldhaus Krisanoski</dc:creator>
      <pubDate>Fri, 16 Oct 2026 12:09:52 +0000</pubDate>
      <link>https://dev.to/rkrisa/an-evaluation-score-is-only-as-useful-as-its-target-4kia</link>
      <guid>https://dev.to/rkrisa/an-evaluation-score-is-only-as-useful-as-its-target-4kia</guid>
      <description>&lt;p&gt;My small document-evidence model agreed with its reference labels on 36 of 40 observations. The headline was 90%.&lt;/p&gt;

&lt;p&gt;Then I inspected the confusion matrix. It missed the only reference labeled as documented evidence.&lt;/p&gt;

&lt;p&gt;That error mattered more to the intended workflow than the headline suggested. I was building an assistant to help someone locate and check evidence in a document. Reproducing the dominant “not found” state while missing the sole positive example did not establish that the assistant was useful.&lt;/p&gt;

&lt;p&gt;This was a local prototype, evaluated on its own training observations against AI-origin references. It was not an independent test, a measure of candidate ability, or evidence of improved hiring outcomes. Those qualifications change what the score means.&lt;/p&gt;

&lt;p&gt;The exercise made me treat the target definition as part of the system design.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was the model being asked to predict?
&lt;/h2&gt;

&lt;p&gt;The prototype assigned a documentary state to each of four dimensions in a document. Its four possible states were documented evidence, not located, explicit absence, and ambiguous.&lt;/p&gt;

&lt;p&gt;Each state needs a precise interpretation. “Not located” describes what the available document and process revealed. It does not establish that a person lacks a skill. A document can omit something the person knows. Extraction can fail. A relevant passage can use unexpected language.&lt;/p&gt;

&lt;p&gt;“Documented” also requires care. A statement can mention a tool without describing completed work. An intention to learn is different from evidence of practice. Conflicting passages may require a reviewer rather than a forced positive or negative label.&lt;/p&gt;

&lt;p&gt;The references for this run came from AI, without a new independent human annotation. Agreement with them measured reproduction of those references. Calling that number “accuracy” without naming the target would invite a much broader interpretation than the experiment supported.&lt;/p&gt;

&lt;h2&gt;
  
  
  Put class support beside the aggregate
&lt;/h2&gt;

&lt;p&gt;The forty observations came from ten documents, with four dimensions per document. Their reference distribution was highly uneven:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Reference state&lt;/th&gt;
&lt;th&gt;Observations&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Documented evidence&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Not located&lt;/td&gt;
&lt;td&gt;33&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Explicit absence&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ambiguous&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The model reproduced all 33 “not located” references and three of the six ambiguous references. It predicted “not located” for the remaining three ambiguous observations and for the one documented-evidence observation.&lt;/p&gt;

&lt;p&gt;Those outcomes explain the 36/40 agreement. They also show why the score could conceal a failure in the capability I wanted to investigate.&lt;/p&gt;

&lt;p&gt;There were no explicit-absence references. A reporting convention can include that class in a four-class macro-F1 calculation, but its numerical contribution does not become measured performance on that state. The class had no evaluation support.&lt;/p&gt;

&lt;p&gt;I want a report to make unsupported capabilities visible. A reader should be able to distinguish “the method failed on these examples” from “this dataset did not test the capability.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Forty rows are not forty independent documents
&lt;/h2&gt;

&lt;p&gt;The four dimensions within one document share text, formatting, extraction quality, and source context. That creates correlation between observations.&lt;/p&gt;

&lt;p&gt;It would be misleading to describe this as forty independent cases. It would also be risky to split the rows randomly and allow dimensions from one document to appear in both training and evaluation. A model could encounter much of the same underlying input on both sides.&lt;/p&gt;

&lt;p&gt;For a future document-level evaluation, I would group observations by source document before assigning splits. Closely related versions and duplicated documents need the same treatment. The unit of separation should reflect how information can cross the boundary, rather than whichever unit makes the table easiest to partition.&lt;/p&gt;

&lt;p&gt;This particular run had an even simpler limitation: all forty observations were training observations. It demonstrated technical learning and exposed errors. It did not measure performance on unseen documents.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep a baseline, then ask what it measures
&lt;/h2&gt;

&lt;p&gt;An earlier, separate benchmark compared a TF-IDF logistic-regression baseline with a small PyTorch model on a frozen document split. Its labels were derived from a lexical rubric, not from independently observed outcomes.&lt;/p&gt;

&lt;p&gt;Across five additional seeds on that same split, the baseline's test macro-F1 stayed at approximately 0.902. The neural model ranged from approximately 0.576 to 0.902.&lt;/p&gt;

&lt;p&gt;That was a useful diagnostic. The baseline was stable under that setup, while the neural model showed substantial sensitivity to initialization and optimization. Reporting only the best neural run would have hidden that sensitivity.&lt;/p&gt;

&lt;p&gt;However, the baseline also shared vocabulary with the labeling rubric. A high score could reflect successful reproduction of the proxy. It did not establish the quality of an operational decision.&lt;/p&gt;

&lt;p&gt;Repeated seeds examine one source of variability. They do not produce new independent documents, repair a weak target, or make an already inspected test set fresh again. I keep those historical results separate from the forty-observation prototype because they answer different questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  More examples can introduce a different task
&lt;/h2&gt;

&lt;p&gt;The next data problem was semantic compatibility. A larger synthetic corpus used eight graded criteria and levels from zero to four. The documentary prototype used four dimensions and four evidence states.&lt;/p&gt;

&lt;p&gt;These are different targets. Concatenating their rows would not make them equivalent.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I have explored a video-editing tool through tutorials and would
like to use it in a future team project.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A generated grading rubric might award a low level for exposure to the tool. A documentary rule might classify the passage as insufficient evidence of completed editing work. Neither label automatically specifies an operational decision.&lt;/p&gt;

&lt;p&gt;The mapping needs an explicit definition, reviewed examples, and a record of the original target. Ambiguous or incompatible cases should remain visible. A score threshold is not a substitute for deciding what the label means.&lt;/p&gt;

&lt;p&gt;A later local experiment preserved the synthetic corpus's own eight-criterion target rather than silently converting it into the earlier four-state task. That preserves an important boundary: a result on the synthetic task remains a result on that task.&lt;/p&gt;

&lt;h2&gt;
  
  
  An unseen identifier can still contain familiar language
&lt;/h2&gt;

&lt;p&gt;Synthetic data makes it easier to construct coverage and contrastive examples. It also makes shortcuts easy to repeat.&lt;/p&gt;

&lt;p&gt;Two documents can have different identifiers, names, section orders, and small wording changes while retaining the same underlying phrase template. An exact-duplicate check can pass even when the train and test examples remain linguistically very similar.&lt;/p&gt;

&lt;p&gt;In the corpus I inspected, variants reused phrase bases with added framing. That is a reason to investigate template overlap, not evidence that every result is invalid or that all leakage has been removed.&lt;/p&gt;

&lt;p&gt;For a stronger evaluation, I would track template families, inspect similarity across splits, and reserve genuinely different evidence formulations. I would also check whether length, section structure, or stylistic cues reveal the generated label. An unseen record is only useful to the extent that it tests the intended difficulty.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evaluate the workflow the model is meant to help
&lt;/h2&gt;

&lt;p&gt;The product question is whether the suggestion helps a reviewer find and assess evidence.&lt;/p&gt;

&lt;p&gt;The next useful comparison would be document plus search versus document plus search plus a model suggestion. It would need independently reviewed references, positive and ambiguous examples, missing-evidence cases, and explicit handling of extraction failures.&lt;/p&gt;

&lt;p&gt;I would measure missed evidence, misleading suggestions, corrections, abstentions, and review effort. The model suggestion and retrieved passage should remain separately inspectable: the search result is not automatically an explanation of the neural output.&lt;/p&gt;

&lt;p&gt;Reference review should also avoid showing the model's suggestion first. Otherwise, the evaluation can inherit the model's framing. Disagreements need resolution or a recorded pending state, rather than an invented consensus.&lt;/p&gt;

&lt;p&gt;That study has not been completed. It is the next evidence needed to judge usefulness, rather than another interpretation of the existing training score.&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions I now put before the score
&lt;/h2&gt;

&lt;p&gt;Before comparing methods, I write down:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What does the reference label mean, and who or what produced it?&lt;/li&gt;
&lt;li&gt;Which classes and operational failures have actual support?&lt;/li&gt;
&lt;li&gt;What is the independent unit: a row, a document, or a source family?&lt;/li&gt;
&lt;li&gt;Has the evaluation set already influenced design decisions?&lt;/li&gt;
&lt;li&gt;Are new labels compatible with the existing task?&lt;/li&gt;
&lt;li&gt;Which workflow outcome would justify adding the model?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The 90% headline was useful because inspecting it changed my next step. The system needed better reference coverage and an independent workflow comparison before a claim of utility.&lt;/p&gt;

&lt;p&gt;What does the target in your current evaluation actually represent?&lt;/p&gt;

</description>
      <category>python</category>
      <category>machinelearning</category>
      <category>datascience</category>
      <category>ai</category>
    </item>
    <item>
      <title>A Daily Production Brief Is a Coordination Interface, Not a Dashboard</title>
      <dc:creator>Ricardo Feldhaus Krisanoski</dc:creator>
      <pubDate>Wed, 23 Sep 2026 10:28:13 +0000</pubDate>
      <link>https://dev.to/rkrisa/a-daily-production-brief-is-a-coordination-interface-not-a-dashboard-5epb</link>
      <guid>https://dev.to/rkrisa/a-daily-production-brief-is-a-coordination-interface-not-a-dashboard-5epb</guid>
      <description>&lt;p&gt;A production team should not reconstruct today’s priorities manually.&lt;/p&gt;

&lt;p&gt;In a personalized-products operation, a paid order is only the start of a chain of commitments. Artwork may need review. A customer may still need to approve a design. Materials may be unavailable. An item may already be partway through production while its delivery deadline is getting closer.&lt;/p&gt;

&lt;p&gt;The information needed to act can live across sales channels, task boards, documents, and the experience of individual team members. A status dashboard may show that an order exists without answering the more useful question: what should the team pay attention to now?&lt;/p&gt;

&lt;p&gt;I built a daily production brief as part of an AI-assisted operating layer for an anonymized, multichannel personalized-products ecommerce operation. The brief is a coordination interface: it brings together the context needed for the team to start the day and handle exceptions with human judgment.&lt;/p&gt;

&lt;h2&gt;
  
  
  The brief starts with operational questions
&lt;/h2&gt;

&lt;p&gt;A useful brief should make it easy to see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what needs to be made;&lt;/li&gt;
&lt;li&gt;by when;&lt;/li&gt;
&lt;li&gt;which production stage each item is in;&lt;/li&gt;
&lt;li&gt;whether artwork, materials, personalization, or approval is still a dependency;&lt;/li&gt;
&lt;li&gt;which exceptions or risks need attention;&lt;/li&gt;
&lt;li&gt;which cases still need a human decision.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those details connect a commercial promise to the work required to fulfill it. Without them, the team has to rebuild the same picture manually by switching between systems and asking colleagues for context.&lt;/p&gt;

&lt;h2&gt;
  
  
  From channel events to a shared starting point
&lt;/h2&gt;

&lt;p&gt;The operating flow is straightforward to describe:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sales channels
  -&amp;gt; integration and normalization
  -&amp;gt; operational data layer
  -&amp;gt; deadlines, stages, and dependencies
  -&amp;gt; exception detection
  -&amp;gt; daily production brief
  -&amp;gt; human prioritization and execution
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each sales platform remains authoritative for its own records. Integration turns the relevant events into consistent operational objects and keeps a reference to the source record. That gives the team a shared view without pretending that one new interface replaces every source system.&lt;/p&gt;

&lt;p&gt;The system also needs to handle interruptions safely. Reprocessing an event should not silently create duplicate work. Missing or conflicting information should become an explicit exception rather than being filled with a plausible guess. The brief is only useful when people can tell which items are ready, which are blocked, and where the underlying context is incomplete.&lt;/p&gt;

&lt;h2&gt;
  
  
  A queue is more useful when it explains dependencies
&lt;/h2&gt;

&lt;p&gt;Consider two orders with similar due dates. One may have approved artwork and all required materials. The other may be waiting for a customer decision. A simple chronological list hides the difference; an operational brief makes the dependency visible.&lt;/p&gt;

&lt;p&gt;That does not mean the system should decide every production sequence. A machine constraint, quality issue, late approval, or urgent exception can change what makes sense on the floor. The system surfaces the work, deadlines, dependencies, and risks. The production team remains able to reprioritize critical work and record why.&lt;/p&gt;

&lt;p&gt;This boundary keeps the automation useful without turning an incomplete model of the operation into an unreviewable authority.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design the brief around exceptions
&lt;/h2&gt;

&lt;p&gt;The brief should help answer three questions before work begins:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;What is ready?&lt;/li&gt;
&lt;li&gt;What is blocked?&lt;/li&gt;
&lt;li&gt;What needs judgment?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This framing directs attention to the cases where coordination matters most. A missing material, unresolved artwork approval, or conflicting deadline is not just a bad value in a report. It is an exception with an owner and a next decision.&lt;/p&gt;

&lt;p&gt;In the implementation, normalized order information, production stage, deadlines, dependencies, and exception signals feed the brief. The team uses it to begin execution and to identify what needs human attention. The architecture keeps source data, calculated facts, AI interpretation, and human decisions distinguishable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measure whether it improves the start of the day
&lt;/h2&gt;

&lt;p&gt;I am not publishing a time-saved or error-reduction percentage without a validated baseline. The useful measures to collect include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;time required to prepare the daily production plan;&lt;/li&gt;
&lt;li&gt;exceptions surfaced before work starts;&lt;/li&gt;
&lt;li&gt;how often each brief item has an explicit dependency;&lt;/li&gt;
&lt;li&gt;orders represented from each relevant channel;&lt;/li&gt;
&lt;li&gt;how often a human changes a suggested priority;&lt;/li&gt;
&lt;li&gt;whether a reprioritization has a clear reason and owner.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These measures would help answer whether the brief reduces manual reconstruction, improves visibility of blockers, and gives the team a better starting point. They also help reveal missing rules or data when human overrides happen repeatedly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The design lesson
&lt;/h2&gt;

&lt;p&gt;A production brief is not valuable because it puts more fields on a screen. It is valuable when it connects demand to operational context and gives people a reliable place to see readiness, blockers, and decisions.&lt;/p&gt;

&lt;p&gt;That lesson applies beyond ecommerce. In any operation where a request passes through several systems and roles, a useful AI layer must make responsibilities, dependencies, uncertainty, and authority visible. The brief prepares a decision surface; the people accountable for the work still decide how to handle critical exceptions.&lt;/p&gt;

&lt;p&gt;The full anonymized case and architecture are available in 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 portfolio repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Which exception would you want surfaced first in your team’s daily brief?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>productivity</category>
      <category>ecommerce</category>
    </item>
    <item>
      <title>Operational Knowledge Is a Product Surface, Not a Folder</title>
      <dc:creator>Ricardo Feldhaus Krisanoski</dc:creator>
      <pubDate>Wed, 16 Sep 2026 10:03:08 +0000</pubDate>
      <link>https://dev.to/rkrisa/operational-knowledge-is-a-product-surface-not-a-folder-3e03</link>
      <guid>https://dev.to/rkrisa/operational-knowledge-is-a-product-surface-not-a-folder-3e03</guid>
      <description>&lt;p&gt;When an AI workflow needs operational context, the usual instinct is to collect documents in one place and call it a knowledge base.&lt;/p&gt;

&lt;p&gt;That is a start. It is not yet a product surface.&lt;/p&gt;

&lt;p&gt;A folder answers a storage question: where do files live?&lt;/p&gt;

&lt;p&gt;Operational knowledge answers a different question: what should a person or workflow be allowed to rely on while making a decision?&lt;/p&gt;

&lt;p&gt;That distinction changes the design.&lt;/p&gt;

&lt;h2&gt;
  
  
  Documents are not the interface
&lt;/h2&gt;

&lt;p&gt;Policies, SOPs, product notes, escalation rules and commercial guidance usually begin their lives as documents. They are written by different people, revised at different times, and stored in different places.&lt;/p&gt;

&lt;p&gt;For a human operator, that often means searching across drives, chat history and institutional memory. For an AI workflow, it means the risk of retrieving a plausible paragraph without knowing whether it is current, approved, or relevant to the situation.&lt;/p&gt;

&lt;p&gt;The answer is not to put every document into a larger prompt.&lt;/p&gt;

&lt;p&gt;The answer is to make knowledge usable under explicit operating rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with source authority
&lt;/h2&gt;

&lt;p&gt;Every source should have an owner and a role.&lt;/p&gt;

&lt;p&gt;Some sources are authoritative for customer-facing language. Some are reference-only. Some are historical and useful for understanding how a decision was made, but should never guide a new action.&lt;/p&gt;

&lt;p&gt;That is why a retrieval layer needs metadata alongside text:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;source and version;&lt;/li&gt;
&lt;li&gt;business domain;&lt;/li&gt;
&lt;li&gt;approved use;&lt;/li&gt;
&lt;li&gt;owner and review date;&lt;/li&gt;
&lt;li&gt;whether the source can inform a customer-facing response;&lt;/li&gt;
&lt;li&gt;whether a human approval is required.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not administrative overhead. It is the boundary between a grounded answer and an answer that merely sounds grounded.&lt;/p&gt;

&lt;h2&gt;
  
  
  Retrieval is a contract
&lt;/h2&gt;

&lt;p&gt;I think of retrieval as a contract between knowledge and the workflow that consumes it.&lt;/p&gt;

&lt;p&gt;The workflow needs to know what it is trying to decide, which domain applies, whose permissions are in scope, and what it must do when evidence is missing.&lt;/p&gt;

&lt;p&gt;The knowledge layer needs to return more than passages. It should return the evidence needed to judge whether a passage can be used: source, version, allowed use, and the conditions under which the workflow should hand the decision back to a person.&lt;/p&gt;

&lt;p&gt;That produces a different kind of system behavior.&lt;/p&gt;

&lt;p&gt;Instead of: “Here is the most similar text,” the system can say: “Here is the approved source for this situation,” or “There is no approved source with enough confidence, so this needs human review.”&lt;/p&gt;

&lt;p&gt;The no-answer path is not a defect. In operational systems, it is part of the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Permissions are part of the experience
&lt;/h2&gt;

&lt;p&gt;Knowledge permissions and action permissions solve different problems.&lt;/p&gt;

&lt;p&gt;An employee may be allowed to read a support procedure but not change an order. A workflow may be allowed to retrieve a product policy but not use it to approve a refund. A manager may see a comparison report without being the person authorized to finalize the supplier decision.&lt;/p&gt;

&lt;p&gt;Treating all of these as one generic “access” rule creates risk.&lt;/p&gt;

&lt;p&gt;A practical design separates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what a role can retrieve;&lt;/li&gt;
&lt;li&gt;what it can propose;&lt;/li&gt;
&lt;li&gt;what it can execute;&lt;/li&gt;
&lt;li&gt;what requires approval;&lt;/li&gt;
&lt;li&gt;what must be logged for later review.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That keeps retrieval helpful without quietly extending authority.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make quality observable
&lt;/h2&gt;

&lt;p&gt;Knowledge systems need evaluation just as much as generation systems do.&lt;/p&gt;

&lt;p&gt;For each important workflow, I want a small set of golden cases that describe the operating expectation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What source should be retrieved?&lt;/li&gt;
&lt;li&gt;What evidence must be visible in the answer or recommendation?&lt;/li&gt;
&lt;li&gt;What response is forbidden?&lt;/li&gt;
&lt;li&gt;When should the workflow escalate instead of answering?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then I want the retrieval trace, the final output and the human review outcome in the same review surface.&lt;/p&gt;

&lt;p&gt;Without that feedback loop, a team can improve the wording of an answer while missing the more important failure: the workflow retrieved the wrong policy in the first place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Knowledge needs a maintenance loop
&lt;/h2&gt;

&lt;p&gt;Operational knowledge is not finished when it is indexed.&lt;/p&gt;

&lt;p&gt;Real work changes. A frontline correction exposes a missing SOP. A product exception reveals that a policy is unclear. A recurring handoff shows that the workflow cannot safely resolve a case with the sources it has.&lt;/p&gt;

&lt;p&gt;Those signals should feed a controlled loop:&lt;/p&gt;

&lt;p&gt;frontline gap → structured proposal → process owner → approver → versioned publication → reuse.&lt;/p&gt;

&lt;p&gt;The point is not to let an AI rewrite policy on its own. The point is to make the gap visible, give the right owner a structured proposal, and preserve a versioned record of what changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical lesson
&lt;/h2&gt;

&lt;p&gt;The useful question is not: “Where should we put our documents?”&lt;/p&gt;

&lt;p&gt;It is: “What knowledge does this decision need, who owns it, how fresh must it be, and what happens when it is not enough?”&lt;/p&gt;

&lt;p&gt;That is why operational knowledge is a product surface. It sits at the point where people, workflows and AI systems decide what is safe to do next.&lt;/p&gt;

&lt;p&gt;The public prototype behind this approach is available on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/rkrisa/portfolio-ai-ops/tree/main/cases/operational-knowledge-retrieval-layer" rel="noopener noreferrer"&gt;https://github.com/rkrisa/portfolio-ai-ops/tree/main/cases/operational-knowledge-retrieval-layer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you operate a difficult knowledge workflow, I would be interested in the failure mode that keeps showing up.&lt;/p&gt;

</description>
      <category>productivity</category>
    </item>
    <item>
      <title>What I log from AI workflows before I trust the automation</title>
      <dc:creator>Ricardo Feldhaus Krisanoski</dc:creator>
      <pubDate>Sun, 16 Aug 2026 18:58:02 +0000</pubDate>
      <link>https://dev.to/rkrisa/what-i-log-from-ai-workflows-before-i-trust-the-automation-3pdf</link>
      <guid>https://dev.to/rkrisa/what-i-log-from-ai-workflows-before-i-trust-the-automation-3pdf</guid>
      <description>&lt;p&gt;Most AI workflow posts focus on prompts, tools or output quality.&lt;/p&gt;

&lt;p&gt;Those matter, but they are not the first thing I want to trust.&lt;/p&gt;

&lt;p&gt;The first thing I want to trust is the audit trail.&lt;/p&gt;

&lt;p&gt;If an AI workflow suggests a commercial follow-up, changes a queue, routes a conversation or asks for human review, I want to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what surface executed the decision;&lt;/li&gt;
&lt;li&gt;what system would be affected;&lt;/li&gt;
&lt;li&gt;whether human approval was required;&lt;/li&gt;
&lt;li&gt;what context or evidence shaped the suggestion;&lt;/li&gt;
&lt;li&gt;what it likely cost;&lt;/li&gt;
&lt;li&gt;what happened after a human reviewed it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why I started writing an observability contract for AI workflows before expanding the automation surface.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Problem
&lt;/h2&gt;

&lt;p&gt;In operational systems, the hardest bug is often not "the model answered badly."&lt;/p&gt;

&lt;p&gt;It is "nobody can explain the path from context to action."&lt;/p&gt;

&lt;p&gt;That creates a few predictable failures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;follow-up suggestions with no clean handoff reason;&lt;/li&gt;
&lt;li&gt;invisible cost growth;&lt;/li&gt;
&lt;li&gt;logs spread across workflow history, scripts and chat tools;&lt;/li&gt;
&lt;li&gt;human edits that never become quality signals;&lt;/li&gt;
&lt;li&gt;no reliable way to compare one workflow against another.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I Log
&lt;/h2&gt;

&lt;p&gt;I now prefer a small contract that every AI-assisted workflow can emit, whether it runs inside n8n or through a wrapper around an agent script.&lt;/p&gt;

&lt;p&gt;At minimum, I want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a stable workflow name;&lt;/li&gt;
&lt;li&gt;a trace or execution ID;&lt;/li&gt;
&lt;li&gt;the execution surface, like &lt;code&gt;n8n&lt;/code&gt; or an agent wrapper;&lt;/li&gt;
&lt;li&gt;the business unit and target system;&lt;/li&gt;
&lt;li&gt;a risk level;&lt;/li&gt;
&lt;li&gt;a flag for human approval;&lt;/li&gt;
&lt;li&gt;the decision itself;&lt;/li&gt;
&lt;li&gt;the outcome;&lt;/li&gt;
&lt;li&gt;the model and estimated cost when applicable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then I add the fields that make review actually useful:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;prompt or skill version;&lt;/li&gt;
&lt;li&gt;retrieved sources or evidence references;&lt;/li&gt;
&lt;li&gt;handoff reason;&lt;/li&gt;
&lt;li&gt;human review outcome;&lt;/li&gt;
&lt;li&gt;latency and token estimates.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That structure is much more useful than a raw dump of prompts and responses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters For Commercial Workflows
&lt;/h2&gt;

&lt;p&gt;Imagine a workflow that suggests a commercial follow-up.&lt;/p&gt;

&lt;p&gt;If the trace only says "AI replied" or "task created", the review loop is weak.&lt;/p&gt;

&lt;p&gt;I want the system to answer higher-value questions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Was this a suggestion or an action?&lt;/li&gt;
&lt;li&gt;Which system would have been touched next?&lt;/li&gt;
&lt;li&gt;Was approval required before any outbound step?&lt;/li&gt;
&lt;li&gt;If it went to human review, why?&lt;/li&gt;
&lt;li&gt;If the human edited it, was the edit approved, rejected or escalated?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is the difference between using AI as a black box and using it as an operational component.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bridge Pattern
&lt;/h2&gt;

&lt;p&gt;One practical detail mattered a lot in my implementation work:&lt;/p&gt;

&lt;p&gt;I did not want workflow JSON carrying observability secrets everywhere.&lt;/p&gt;

&lt;p&gt;So instead of wiring keys directly into each workflow, I prefer a small internal bridge:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;workflow -&amp;gt; trace payload -&amp;gt; internal bridge -&amp;gt; observability backend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That keeps the trace contract shared while reducing secret sprawl.&lt;/p&gt;

&lt;p&gt;It also makes it easier to instrument different surfaces with the same schema.&lt;/p&gt;

&lt;h2&gt;
  
  
  Human Review Is Part Of Observability
&lt;/h2&gt;

&lt;p&gt;The most useful signal is often not the first model decision.&lt;/p&gt;

&lt;p&gt;It is what happened after a person saw it.&lt;/p&gt;

&lt;p&gt;Did they approve it?&lt;br&gt;
Did they edit it?&lt;br&gt;
Did they reject it?&lt;br&gt;
Did they mark it as needing review?&lt;/p&gt;

&lt;p&gt;Those outcomes turn observability into the start of an eval loop instead of a passive log archive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Public-Safe By Design
&lt;/h2&gt;

&lt;p&gt;For operational AI, public proof needs constraints.&lt;/p&gt;

&lt;p&gt;So the public version of this work avoids:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;raw customer messages;&lt;/li&gt;
&lt;li&gt;phone numbers or candidate data;&lt;/li&gt;
&lt;li&gt;private workflow URLs;&lt;/li&gt;
&lt;li&gt;webhook paths;&lt;/li&gt;
&lt;li&gt;internal secrets or auth headers;&lt;/li&gt;
&lt;li&gt;unsupported metric claims.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Where a number is not approved, I keep it as &lt;code&gt;metrics to collect&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Practical Lesson
&lt;/h2&gt;

&lt;p&gt;Before expanding an AI workflow, I want to make its decisions inspectable.&lt;/p&gt;

&lt;p&gt;Not just its prompt.&lt;br&gt;
Not just its output.&lt;br&gt;
Its actual operational path.&lt;/p&gt;

&lt;p&gt;That is why I now treat observability as part of workflow design:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;trace the decision;&lt;/li&gt;
&lt;li&gt;trace the risk;&lt;/li&gt;
&lt;li&gt;trace the human review;&lt;/li&gt;
&lt;li&gt;trace the cost;&lt;/li&gt;
&lt;li&gt;keep the action path explainable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Public case study:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/rkrisa/portfolio-ai-ops/tree/main/cases/ai-workflow-observability-contract" rel="noopener noreferrer"&gt;https://github.com/rkrisa/portfolio-ai-ops/tree/main/cases/ai-workflow-observability-contract&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>observability</category>
      <category>n8n</category>
      <category>architecture</category>
    </item>
    <item>
      <title>AI Coding Agents Need a Decision Gate Before the Implementation Loop</title>
      <dc:creator>Ricardo Feldhaus Krisanoski</dc:creator>
      <pubDate>Thu, 13 Aug 2026 13:00:00 +0000</pubDate>
      <link>https://dev.to/rkrisa/ai-coding-agents-need-a-decision-gate-before-the-implementation-loop-3eb8</link>
      <guid>https://dev.to/rkrisa/ai-coding-agents-need-a-decision-gate-before-the-implementation-loop-3eb8</guid>
      <description>&lt;p&gt;AI-assisted development has changed the economics of implementation.&lt;/p&gt;

&lt;p&gt;A plausible architecture can become a working prototype before the team has finished asking whether it solves the right problem.&lt;/p&gt;

&lt;p&gt;That is useful — and dangerous.&lt;/p&gt;

&lt;p&gt;The failure mode I kept seeing was not poor execution. It was premature commitment: a request arrived with a tool, repository, architecture, or output format already selected, and the implementation loop started before the decision had been challenged.&lt;/p&gt;

&lt;p&gt;That is why I built &lt;a href="https://github.com/rkrisa/decision-path-challenger" rel="noopener noreferrer"&gt;Decision Path Challenger&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It is an open-source Agent Skill for OpenAI Codex and Claude Code. Its job is to create a decision gate before meaningful implementation work begins.&lt;/p&gt;

&lt;h2&gt;
  
  
  The solution is often baked into the request
&lt;/h2&gt;

&lt;p&gt;Consider a request such as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Build a weekly sales dashboard in Notion.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It sounds concrete. It also contains several decisions that may never have been made consciously:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the output must be a dashboard;&lt;/li&gt;
&lt;li&gt;the dashboard must be interactive;&lt;/li&gt;
&lt;li&gt;the work must live in Notion;&lt;/li&gt;
&lt;li&gt;storage and delivery should happen in the same system;&lt;/li&gt;
&lt;li&gt;someone will maintain that workspace every week.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The actual outcome may be much simpler:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Deliver a consistent weekly decision brief that managers can review, archive, and forward to the sales team.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once the outcome is clear, the solution space changes. A collaborative dashboard remains possible, but so do a controlled HTML report, a PDF snapshot, a spreadsheet template, a concise automated briefing, or a hybrid workflow with human approval.&lt;/p&gt;

&lt;p&gt;The point is not that Notion is wrong. The point is that the tool should not silently define the outcome.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four layers before technology
&lt;/h2&gt;

&lt;p&gt;Decision Path Challenger separates a request into four layers.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Outcome
&lt;/h3&gt;

&lt;p&gt;What must become true for the user, team, or business?&lt;/p&gt;

&lt;p&gt;This should be stated without inheriting the proposed tool. A weekly decision brief is an outcome. A Notion dashboard is a possible mechanism and technology choice.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Operating experience
&lt;/h3&gt;

&lt;p&gt;How will the result be consumed, reviewed, shared, maintained, and repeated?&lt;/p&gt;

&lt;p&gt;This layer surfaces practical questions that architecture discussions often miss. Does the result need to be editable? Must it be forwarded? Do historical copies matter? Who corrects errors? Is the user opening a workspace, receiving an alert, or approving a fixed artifact?&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Mechanism
&lt;/h3&gt;

&lt;p&gt;What is the simplest reliable way to produce that operating experience?&lt;/p&gt;

&lt;p&gt;The mechanism may be a template, a script, a native feature, a scheduled workflow, a human review step, or a custom service. It should earn its complexity.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Technology
&lt;/h3&gt;

&lt;p&gt;Which tools, repositories, models, APIs, and frameworks implement the chosen mechanism?&lt;/p&gt;

&lt;p&gt;Technology comes last because it is easier to evaluate once the outcome and operating model are explicit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why exactly three questions
&lt;/h2&gt;

&lt;p&gt;An effective decision gate cannot become another long intake form.&lt;/p&gt;

&lt;p&gt;The skill asks exactly three high-value questions. Together they resolve three categories:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Success and consumption&lt;/strong&gt; — what the result must enable and how people will use it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operating constraints&lt;/strong&gt; — frequency, maintenance, acceptable manual work, control, cost, and reliability.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hard boundaries and hidden flexibility&lt;/strong&gt; — what is truly mandatory and what is merely inherited from the first proposed solution.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Three is a deliberate constraint. One question rarely exposes enough. Ten questions create friction and encourage generic answers. Three forces the skill to select the decisions that materially change the path.&lt;/p&gt;

&lt;p&gt;If the answers already exist in the current context, the skill does not ask them again. It states the inferred answers and continues.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compare solution classes, not cosmetic alternatives
&lt;/h2&gt;

&lt;p&gt;Tool comparison often means evaluating three products from the same category. That is useful only after the category itself has been justified.&lt;/p&gt;

&lt;p&gt;Decision Path Challenger compares materially different solution classes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Native or no-code:&lt;/strong&gt; built-in features, templates, exports, or scheduled functions in tools already in use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lightweight composition:&lt;/strong&gt; HTML, spreadsheets, scripts, low-code workflows, serverless functions, or simple API orchestration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom product:&lt;/strong&gt; a bespoke application, agent, service, dashboard, or data pipeline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hybrid:&lt;/strong&gt; native storage combined with custom rendering, or automation combined with human approval.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Process redesign:&lt;/strong&gt; changing the workflow or output so that less technology is needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At least one option must challenge the original framing. Otherwise the comparison only optimizes a decision that has already been made.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build cost is not total cost
&lt;/h2&gt;

&lt;p&gt;Implementation speed is only one part of the decision.&lt;/p&gt;

&lt;p&gt;The skill distinguishes four costs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Build cost:&lt;/strong&gt; what it takes to create the first working version.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Run cost:&lt;/strong&gt; infrastructure, licenses, manual operations, monitoring, and recurring attention.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Change cost:&lt;/strong&gt; how difficult it is to modify the system when the process evolves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Failure cost:&lt;/strong&gt; what happens when the workflow is wrong, unavailable, stale, or trusted too much.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also considers reversibility. An uncertain workflow should not begin with a hard-to-exit architecture unless there is evidence that the extra commitment is justified.&lt;/p&gt;

&lt;p&gt;This is especially important in AI-assisted development. Generating code quickly can make build cost look small while run, change, and failure costs remain hidden.&lt;/p&gt;

&lt;p&gt;Possible is not the same as appropriate.&lt;/p&gt;

&lt;h2&gt;
  
  
  A decisive output
&lt;/h2&gt;

&lt;p&gt;The skill is not designed to end with “it depends.”&lt;/p&gt;

&lt;p&gt;It returns one of seven decision labels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Proceed as proposed&lt;/li&gt;
&lt;li&gt;Proceed with simplification&lt;/li&gt;
&lt;li&gt;Adapt the proposed path&lt;/li&gt;
&lt;li&gt;Use a hybrid&lt;/li&gt;
&lt;li&gt;Run a small proof of concept first&lt;/li&gt;
&lt;li&gt;Choose another path&lt;/li&gt;
&lt;li&gt;Do not implement yet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every recommendation includes the reason, the most tempting rejected alternative, what was intentionally excluded, and the smallest reversible next step.&lt;/p&gt;

&lt;p&gt;For the recurring-report example, the decision may be &lt;strong&gt;Proceed with simplification&lt;/strong&gt;: use a controlled HTML template rendered to PDF, populate it from existing sources, and preserve a human approval step before distribution.&lt;/p&gt;

&lt;p&gt;That recommendation is not universally better than a dashboard. It wins only when consistency, portability, archival snapshots, and low weekly maintenance matter more than collaborative editing and interactive exploration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cross-agent by design
&lt;/h2&gt;

&lt;p&gt;The canonical behavior lives in a platform-neutral &lt;code&gt;SKILL.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The repository includes installation paths for both Codex and Claude Code, Codex-specific interface metadata, examples, evaluation references, a static validator, and a GitHub Actions workflow.&lt;/p&gt;

&lt;p&gt;For Codex:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$decision-path-challenger

I found a repository that may help me orchestrate multiple coding agents.
Evaluate the approach before installing or modifying my project.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/decision-path-challenger

I want to build a weekly operations dashboard in Notion.
Challenge the implementation path before we start.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The skill does not replace project governance, security review, or human approval. It adds a structured pre-implementation review layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the skill intentionally does not do
&lt;/h2&gt;

&lt;p&gt;Decision Path Challenger does not make every task slower. It should not trigger for a small copy edit, a routine command, an emergency restoration, or a narrowly scoped bug with an already-defined fix.&lt;/p&gt;

&lt;p&gt;It also does not treat complexity as a problem by itself. A custom product, agent, or integration can be the right answer. The requirement is that the extra burden is connected to a confirmed operating need rather than to excitement about the technology.&lt;/p&gt;

&lt;p&gt;Finally, the skill does not make the decision on hidden assumptions. When a critical preference cannot be discovered from the environment, it asks the user. The goal is a decision-complete path, not autonomous certainty theater.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it on a real decision
&lt;/h2&gt;

&lt;p&gt;Clone the repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/rkrisa/decision-path-challenger.git
&lt;span class="nb"&gt;cd &lt;/span&gt;decision-path-challenger
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install for Codex:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./scripts/install.sh codex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install for Claude Code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./scripts/install.sh claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or install for both:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./scripts/install.sh all
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PowerShell users can run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;/scripts/install.ps1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-Target&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;all&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The repository is MIT licensed. Issues and contributions are welcome.&lt;/p&gt;

&lt;p&gt;AI agents do not only need more implementation capability.&lt;/p&gt;

&lt;p&gt;They also need better judgment about what deserves to be implemented, how the result will operate, and whether a simpler path would work better.&lt;/p&gt;

&lt;p&gt;Decision Path Challenger is my attempt to make that judgment explicit, repeatable, and inspectable.&lt;/p&gt;

&lt;p&gt;Try it on a real decision. If it changes or confirms your original path, I would like to hear what happened.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>architecture</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Why my first RAG layer starts in Postgres, not in a standalone vector database</title>
      <dc:creator>Ricardo Feldhaus Krisanoski</dc:creator>
      <pubDate>Sat, 13 Jun 2026 12:30:37 +0000</pubDate>
      <link>https://dev.to/rkrisa/why-my-first-rag-layer-starts-in-postgres-not-in-a-standalone-vector-database-29e0</link>
      <guid>https://dev.to/rkrisa/why-my-first-rag-layer-starts-in-postgres-not-in-a-standalone-vector-database-29e0</guid>
      <description>&lt;p&gt;When people say they are "adding RAG" to a workflow, the conversation often jumps too quickly to infrastructure choices.&lt;/p&gt;

&lt;p&gt;Should this use a vector database?&lt;br&gt;
Should there be a reranker?&lt;br&gt;
Should everything go into a knowledge graph?&lt;/p&gt;

&lt;p&gt;Those are valid questions, but they are usually not the first question.&lt;/p&gt;

&lt;p&gt;The first question is narrower:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What approved knowledge should the workflow be allowed to retrieve before an AI decision happens?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is why my first retrieval layer for operational AI workflows starts in Postgres, not in a standalone vector database.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Workflow Problem
&lt;/h2&gt;

&lt;p&gt;In operations-heavy systems, the model usually should not answer from raw memory or from a giant prompt dump.&lt;/p&gt;

&lt;p&gt;The useful context already exists somewhere else:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;approved response rules;&lt;/li&gt;
&lt;li&gt;handoff criteria;&lt;/li&gt;
&lt;li&gt;product or service notes;&lt;/li&gt;
&lt;li&gt;source or campaign guidance;&lt;/li&gt;
&lt;li&gt;operational decisions that were already made by humans.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The hard part is not generating fluent text.&lt;/p&gt;

&lt;p&gt;The hard part is retrieving the right approved context, showing which source influenced the decision and refusing when no safe source exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Postgres First
&lt;/h2&gt;

&lt;p&gt;For this kind of workflow, most of the surrounding data is already relational:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;leads or conversations;&lt;/li&gt;
&lt;li&gt;workflow names;&lt;/li&gt;
&lt;li&gt;stages and owners;&lt;/li&gt;
&lt;li&gt;human review outcomes;&lt;/li&gt;
&lt;li&gt;source metadata;&lt;/li&gt;
&lt;li&gt;trace logs;&lt;/li&gt;
&lt;li&gt;document versions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the first technical choice is not "where do vectors live in the abstract?"&lt;/p&gt;

&lt;p&gt;It is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Where can I keep retrieval close to the operational data model?&lt;/li&gt;
&lt;li&gt;Where can I log the retrieval path and the final decision together?&lt;/li&gt;
&lt;li&gt;Where can I evolve the schema without creating a second system too early?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Postgres plus &lt;code&gt;pgvector&lt;/code&gt; is a good first answer to that set of questions.&lt;/p&gt;

&lt;p&gt;It lets me keep:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;documents and chunks;&lt;/li&gt;
&lt;li&gt;metadata such as allowed use and approval requirements;&lt;/li&gt;
&lt;li&gt;retrieval traces;&lt;/li&gt;
&lt;li&gt;cost estimates;&lt;/li&gt;
&lt;li&gt;human review outcomes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;in one place.&lt;/p&gt;

&lt;h2&gt;
  
  
  What The First Version Needs
&lt;/h2&gt;

&lt;p&gt;The first version does not need to be broad.&lt;/p&gt;

&lt;p&gt;It needs to be inspectable.&lt;/p&gt;

&lt;p&gt;My narrow retrieval scope looks like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;approved response rules;&lt;/li&gt;
&lt;li&gt;product/service notes;&lt;/li&gt;
&lt;li&gt;handoff and escalation criteria;&lt;/li&gt;
&lt;li&gt;campaign/source guidance;&lt;/li&gt;
&lt;li&gt;commercial playbooks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each retrieved chunk should carry more than text. It should also carry metadata such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;source name;&lt;/li&gt;
&lt;li&gt;document version;&lt;/li&gt;
&lt;li&gt;business domain;&lt;/li&gt;
&lt;li&gt;allowed use;&lt;/li&gt;
&lt;li&gt;whether human approval is required.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That metadata matters because a workflow may be allowed to use one chunk as internal reasoning support, but not as customer-facing language.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Eval Mindset
&lt;/h2&gt;

&lt;p&gt;I do not think a retrieval layer is real until it has failure criteria.&lt;/p&gt;

&lt;p&gt;So the public prototype includes a small golden-question set:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the expected source appear in the top results?&lt;/li&gt;
&lt;li&gt;Does the workflow return no-answer or handoff when the source is missing?&lt;/li&gt;
&lt;li&gt;Does customer-facing language come only from allowed chunks?&lt;/li&gt;
&lt;li&gt;Can I review which chunks influenced the decision later?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That matters more than announcing that the system has embeddings.&lt;/p&gt;

&lt;p&gt;Without retrieval checks, a RAG layer can look sophisticated while still pulling the wrong context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Observability Is Part Of The Design
&lt;/h2&gt;

&lt;p&gt;The retrieval step and the AI decision step should be traceable together.&lt;/p&gt;

&lt;p&gt;I want the same review surface to show:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;retrieved chunk IDs;&lt;/li&gt;
&lt;li&gt;similarity or retrieval score;&lt;/li&gt;
&lt;li&gt;model name;&lt;/li&gt;
&lt;li&gt;token and cost estimates;&lt;/li&gt;
&lt;li&gt;final decision;&lt;/li&gt;
&lt;li&gt;handoff reason;&lt;/li&gt;
&lt;li&gt;human review outcome.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the bridge between "the system answered" and "the system answered for a defensible reason."&lt;/p&gt;

&lt;h2&gt;
  
  
  When I Would Add More Infrastructure
&lt;/h2&gt;

&lt;p&gt;I am not against standalone vector databases.&lt;/p&gt;

&lt;p&gt;I would add one later if the system needed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;more search traffic;&lt;/li&gt;
&lt;li&gt;more complex filtering boundaries;&lt;/li&gt;
&lt;li&gt;separate deployment requirements;&lt;/li&gt;
&lt;li&gt;recall/latency needs that justify the extra moving parts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But before that point, I prefer a smaller stack that makes retrieval, evaluation and auditability visible.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Practical Lesson
&lt;/h2&gt;

&lt;p&gt;For AI workflows in revenue or operations contexts, the first retrieval layer should optimize for control, review and schema clarity.&lt;/p&gt;

&lt;p&gt;Not for maximum architectural novelty.&lt;/p&gt;

&lt;p&gt;That is why my first RAG layer starts in Postgres:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;closer to operational data;&lt;/li&gt;
&lt;li&gt;easier to trace;&lt;/li&gt;
&lt;li&gt;easier to evaluate;&lt;/li&gt;
&lt;li&gt;easier to keep human-in-the-loop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The public case study is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/rkrisa/portfolio-ai-ops/tree/main/cases/operational-knowledge-retrieval-layer" rel="noopener noreferrer"&gt;https://github.com/rkrisa/portfolio-ai-ops/tree/main/cases/operational-knowledge-retrieval-layer&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>rag</category>
      <category>postgres</category>
      <category>architecture</category>
    </item>
    <item>
      <title>I added a context resolver before an AI sales agent replies</title>
      <dc:creator>Ricardo Feldhaus Krisanoski</dc:creator>
      <pubDate>Thu, 28 May 2026 05:38:41 +0000</pubDate>
      <link>https://dev.to/rkrisa/i-added-a-context-resolver-before-an-ai-sales-agent-replies-2o5f</link>
      <guid>https://dev.to/rkrisa/i-added-a-context-resolver-before-an-ai-sales-agent-replies-2o5f</guid>
      <description>&lt;p&gt;Most AI sales agents fail before the model writes a single word.&lt;/p&gt;

&lt;p&gt;The failure is not always the prompt. It is usually the context.&lt;/p&gt;

&lt;p&gt;In a real chat-commerce workflow, a lead can arrive with several competing signals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the latest customer message;&lt;/li&gt;
&lt;li&gt;CRM stage and owner;&lt;/li&gt;
&lt;li&gt;previous conversation history;&lt;/li&gt;
&lt;li&gt;campaign or source data;&lt;/li&gt;
&lt;li&gt;product/category assumptions;&lt;/li&gt;
&lt;li&gt;approved response rules;&lt;/li&gt;
&lt;li&gt;handoff and support policies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If all of that gets dumped into a prompt, the model may produce a fluent answer based on the wrong clue.&lt;/p&gt;

&lt;p&gt;That is not an AI problem in the abstract. It is an operating-system problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;I was designing an AI reception agent for a chat-driven commerce operation.&lt;/p&gt;

&lt;p&gt;The goal was simple: help the business reply faster and more consistently without losing the commercial context behind each lead.&lt;/p&gt;

&lt;p&gt;But the first automated reply had a hidden risk.&lt;/p&gt;

&lt;p&gt;A customer might send a short message like "hi" or "I want more information." On its own, that message is weak. The stronger signal may be the campaign, source, CRM stage, product page, previous conversation or approved sales rule.&lt;/p&gt;

&lt;p&gt;If the AI agent receives all possible context at once, it still has to decide what matters.&lt;/p&gt;

&lt;p&gt;That decision should not be left entirely to generation.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Design Choice
&lt;/h2&gt;

&lt;p&gt;I added a context-resolution step before the AI response.&lt;/p&gt;

&lt;p&gt;Instead of asking the model to inspect every clue and improvise, the workflow first resolves a smaller object:&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;"source_priority"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"campaign_or_crm_or_message_or_fallback"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"category"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"resolved_commercial_category"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"confidence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high_or_medium_or_low"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"selected_directive"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"one_approved_response_rule"&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;The important part is not the exact schema. It is the order of decisions.&lt;/p&gt;

&lt;p&gt;The system first decides which commercial context is most trustworthy. Only then does the AI agent write the reply.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;

&lt;p&gt;The workflow looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Incoming chat lead.&lt;/li&gt;
&lt;li&gt;CRM and conversation lookup.&lt;/li&gt;
&lt;li&gt;Campaign or source-context lookup.&lt;/li&gt;
&lt;li&gt;Context resolver.&lt;/li&gt;
&lt;li&gt;Resolved commercial context.&lt;/li&gt;
&lt;li&gt;AI response agent.&lt;/li&gt;
&lt;li&gt;Structured response and routing decision.&lt;/li&gt;
&lt;li&gt;Customer reply or human handoff.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The resolver is intentionally boring.&lt;/p&gt;

&lt;p&gt;It is a control layer, not a creativity layer.&lt;/p&gt;

&lt;p&gt;It exists to answer questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What is the lead probably asking about?&lt;/li&gt;
&lt;li&gt;Which source should win when signals conflict?&lt;/li&gt;
&lt;li&gt;Is confidence high enough to answer directly?&lt;/li&gt;
&lt;li&gt;Which approved sales rule should be used?&lt;/li&gt;
&lt;li&gt;Should the system reply, ask a clarifying question or hand off to a human?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;In business workflows, "more context" is not always better.&lt;/p&gt;

&lt;p&gt;More context can mean more ambiguity:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;old messages compete with new ones;&lt;/li&gt;
&lt;li&gt;generic playbooks compete with campaign-specific offers;&lt;/li&gt;
&lt;li&gt;product assumptions compete with what the customer actually asked;&lt;/li&gt;
&lt;li&gt;internal rules compete with customer-facing language.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The context resolver reduces that ambiguity before the model responds.&lt;/p&gt;

&lt;p&gt;The AI layer becomes easier to debug because every reply can be traced back to a chosen context, confidence level and directive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Guardrails
&lt;/h2&gt;

&lt;p&gt;The workflow keeps several guardrails around the AI response:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;low confidence triggers a consultative fallback;&lt;/li&gt;
&lt;li&gt;sensitive commercial cases can be routed to human review;&lt;/li&gt;
&lt;li&gt;approved response rules are selected before generation;&lt;/li&gt;
&lt;li&gt;the agent receives a compact context package instead of a noisy dump;&lt;/li&gt;
&lt;li&gt;the system logs what context was used.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not about making the AI sound more impressive.&lt;/p&gt;

&lt;p&gt;It is about making the operational decision safer.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Would Measure Next
&lt;/h2&gt;

&lt;p&gt;The current public version keeps metrics as &lt;code&gt;metrics to collect&lt;/code&gt;, because I do not want to publish numbers that are not validated.&lt;/p&gt;

&lt;p&gt;The useful metrics would be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;lead volume handled by the context resolver;&lt;/li&gt;
&lt;li&gt;reduction in wrong-context replies;&lt;/li&gt;
&lt;li&gt;human handoff rate by risk category;&lt;/li&gt;
&lt;li&gt;response-time impact;&lt;/li&gt;
&lt;li&gt;manual review time saved.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Lesson
&lt;/h2&gt;

&lt;p&gt;For AI agents in revenue workflows, the prompt is only one part of the system.&lt;/p&gt;

&lt;p&gt;The harder design question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What should the model be allowed to know, trust and act on?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is why I prefer designing AI agents as operating workflows: context resolution, retrieval, guardrails, structured outputs, human review and observability.&lt;/p&gt;

&lt;p&gt;The public case study is here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/rkrisa/portfolio-ai-ops/tree/main/cases/context-aware-ai-reception-agent" rel="noopener noreferrer"&gt;https://github.com/rkrisa/portfolio-ai-ops/tree/main/cases/context-aware-ai-reception-agent&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>crm</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
