<?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: Ramatech Innovations</title>
    <description>The latest articles on DEV Community by Ramatech Innovations (@ramatechofficial).</description>
    <link>https://dev.to/ramatechofficial</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%2F4204599%2F103bf4cd-365e-466f-b344-535f978a4a6f.png</url>
      <title>DEV Community: Ramatech Innovations</title>
      <link>https://dev.to/ramatechofficial</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ramatechofficial"/>
    <language>en</language>
    <item>
      <title>Reverting Git Won’t Undo Your Database Migration</title>
      <dc:creator>Ramatech Innovations</dc:creator>
      <pubDate>Wed, 04 Nov 2026 06:17:17 +0000</pubDate>
      <link>https://dev.to/ramatechofficial/reverting-git-wont-undo-your-database-migration-4adc</link>
      <guid>https://dev.to/ramatechofficial/reverting-git-wont-undo-your-database-migration-4adc</guid>
      <description>&lt;p&gt;A release introduces an application bug. You revert the deployment configuration, and the previous container image starts successfully.&lt;/p&gt;

&lt;p&gt;But requests still fail.&lt;/p&gt;

&lt;p&gt;The application has returned to its previous version. The database has not.&lt;/p&gt;

&lt;p&gt;For stateful applications, a deployment rollback and a recovery plan cover different things.&lt;/p&gt;

&lt;h2&gt;
  
  
  A simple column rename can break rollback
&lt;/h2&gt;

&lt;p&gt;Consider an application that reads this column:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;customer_name&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A new release renames it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;ALTER&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;
&lt;span class="k"&gt;RENAME&lt;/span&gt; &lt;span class="k"&gt;COLUMN&lt;/span&gt; &lt;span class="n"&gt;customer_name&lt;/span&gt; &lt;span class="k"&gt;TO&lt;/span&gt; &lt;span class="n"&gt;billing_name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The new application expects billing_name. The previous application expects customer_name.&lt;/p&gt;

&lt;p&gt;If the release fails after the migration, deploying the previous image leaves it querying a column that no longer exists.&lt;/p&gt;

&lt;p&gt;The same compatibility problem can appear during a rolling deployment, while old and new application instances run together.&lt;/p&gt;

&lt;p&gt;This is an illustrative example. The locking and operational impact of schema changes depend on the database engine and workload.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate schema evolution into stages
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;expand, migrate, contract&lt;/strong&gt; pattern spreads a breaking change across compatible steps. GitLab documents this approach for changes that must work across application versions. &lt;a href="https://docs.gitlab.com/development/multi_version_compatibility/" rel="noopener noreferrer"&gt;GitLab's compatibility guide&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For this example, a staged approach could look like:&lt;/p&gt;

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

&lt;p&gt;Introduce the new column while keeping the existing one.&lt;/p&gt;

&lt;p&gt;Old application instances can continue using the original schema.&lt;/p&gt;

&lt;p&gt;Adding a column still needs operational review: defaults, constraints, table size and database behavior can affect deployment safety.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Migrate
&lt;/h3&gt;

&lt;p&gt;Introduce application behavior that supports the transition.&lt;/p&gt;

&lt;p&gt;Define how both representations stay consistent while older instances remain active. A one-time backfill is insufficient if ongoing writes can immediately make the columns disagree.&lt;/p&gt;

&lt;p&gt;Backfill existing records in controlled batches where appropriate. Make progress observable and retries safe.&lt;/p&gt;

&lt;p&gt;Check completeness and consistency before switching reads.&lt;/p&gt;

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

&lt;p&gt;Remove the old representation only after its consumers have stopped using it and the intended rollback window has closed.&lt;/p&gt;

&lt;p&gt;Consumers may include background workers, reports, integrations and scheduled jobs—not just web application instances.&lt;/p&gt;

&lt;p&gt;Once the old column is removed, an older application version may no longer be a valid recovery target.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep GitOps reconciliation in the recovery plan
&lt;/h2&gt;

&lt;p&gt;A manual change to a running Deployment can conflict with the desired state maintained by a GitOps controller.&lt;/p&gt;

&lt;p&gt;Decide how recovery changes the authoritative configuration, and how reconciliation behaves during the incident.&lt;/p&gt;

&lt;p&gt;Also distinguish a Git revert from the deployment tool's rollback operation. They are separate mechanisms with their own behavior and constraints. Check the documentation for your deployed version, such as &lt;a href="https://argo-cd.readthedocs.io/en/latest/user-guide/auto_sync/" rel="noopener noreferrer"&gt;Argo CD's automated sync policy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Neither operation inherently reverses database writes or external side effects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test the previous application against the migrated database
&lt;/h2&gt;

&lt;p&gt;A useful compatibility test is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create representative starting data
    → Apply the proposed migration
    → Run the previous application version
    → Exercise important reads and writes
    → Run the new application version
    → Verify transition behavior
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a rolling release, also test the period when both versions operate concurrently.&lt;/p&gt;

&lt;p&gt;A successful migration command proves that the database accepted the change. It does not prove application compatibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  Write down where rollback stops being safe
&lt;/h2&gt;

&lt;p&gt;Before release, answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which application versions support the resulting schema?&lt;/li&gt;
&lt;li&gt;Can migration jobs resume safely after interruption?&lt;/li&gt;
&lt;li&gt;What happens to writes made during the transition?&lt;/li&gt;
&lt;li&gt;At what step does recovery require a forward fix?&lt;/li&gt;
&lt;li&gt;If restoration is necessary, what happens to data written since the backup?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The recovery target is a compatible application-and-data state.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;How does your team define the rollback window for releases that change the database?&lt;/p&gt;

</description>
      <category>devops</category>
      <category>database</category>
      <category>architecture</category>
      <category>gitops</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Ramatech Innovations</dc:creator>
      <pubDate>Tue, 03 Nov 2026 04:23:18 +0000</pubDate>
      <link>https://dev.to/ramatechofficial/httpsyoutube41d3bbmlsi8sild78t9nyhxgzfk2m-e8i</link>
      <guid>https://dev.to/ramatechofficial/httpsyoutube41d3bbmlsi8sild78t9nyhxgzfk2m-e8i</guid>
      <description>&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://youtu.be/41d3bbMlsI8?si=ld78t9NYHxGZFK2m" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;youtu.be&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>Your RAG Answer Can Be Correct—and Still Leak Data</title>
      <dc:creator>Ramatech Innovations</dc:creator>
      <pubDate>Tue, 03 Nov 2026 04:22:35 +0000</pubDate>
      <link>https://dev.to/ramatechofficial/your-rag-answer-can-be-correct-and-still-leak-data-3a94</link>
      <guid>https://dev.to/ramatechofficial/your-rag-answer-can-be-correct-and-still-leak-data-3a94</guid>
      <description>&lt;p&gt;A RAG assistant answers a question accurately and includes the right citation.&lt;/p&gt;

&lt;p&gt;There is still a critical question to ask:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Was this user allowed to read that source?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine an internal assistant searching engineering runbooks, customer contracts, and HR documents. All three may contain relevant information. They do not necessarily share the same audience.&lt;/p&gt;

&lt;p&gt;Retrieval relevance and access permission are separate decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The failure starts before generation
&lt;/h2&gt;

&lt;p&gt;Consider this pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User question
    → Search the entire document collection
    → Send matching chunks to the model
    → Ask the model to hide restricted information
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The restricted content has already reached the model. A prompt instruction cannot replace an authorization check.&lt;/p&gt;

&lt;p&gt;The application should establish which content the user may access before constructing the generation context.&lt;/p&gt;

&lt;p&gt;Microsoft's &lt;a href="https://learn.microsoft.com/en-us/azure/search/search-document-level-access-overview" rel="noopener noreferrer"&gt;document-level access control documentation&lt;/a&gt; describes approaches for restricting search results using document permissions and security filters. The exact implementation depends on the data source and search platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  Carry permissions into the retrieval layer
&lt;/h2&gt;

&lt;p&gt;When a document is split into chunks, its access rules must remain enforceable.&lt;/p&gt;

&lt;p&gt;For example, a chunk might carry metadata such as:&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;"chunk_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"runbook-42-chunk-3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"document_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"runbook-42"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tenant_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tenant-a"&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_groups"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"platform-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;"permission_version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&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 illustrative metadata, not a complete authorization implementation.&lt;/p&gt;

&lt;p&gt;The backend must derive the requesting user's identity and permissions from a trusted authentication system. Accepting an arbitrary tenant ID or group list from the browser would undermine the control.&lt;/p&gt;

&lt;p&gt;A useful flow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Authenticate user
    → Resolve tenant and access permissions
    → Retrieve within the authorized scope
    → Build context from authorized chunks
    → Generate answer
    → Return permitted citations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The authorization rule must apply across every retrieval path, including keyword search, vector search, and fallback queries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Permission changes are data changes
&lt;/h2&gt;

&lt;p&gt;A document can remain unchanged while its permissions change.&lt;/p&gt;

&lt;p&gt;Someone moves teams. A customer contract becomes restricted. A user loses access to a workspace.&lt;/p&gt;

&lt;p&gt;If the retrieval index still contains yesterday's permissions, today's answer may expose information the user can no longer read.&lt;/p&gt;

&lt;p&gt;Define how permission updates reach the index, how quickly revocations take effect, and what happens when permission information is missing or stale.&lt;/p&gt;

&lt;p&gt;The same question applies to cached answers: can a response generated for one user be returned to another? Cache reuse must respect the requesting user's current access rights.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test the denial paths
&lt;/h2&gt;

&lt;p&gt;A useful evaluation set includes more than questions the assistant should answer.&lt;/p&gt;

&lt;p&gt;Check these cases too:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Two users ask the same question but have different document access.&lt;/li&gt;
&lt;li&gt;Two tenants have documents with similar titles.&lt;/li&gt;
&lt;li&gt;A user's access is revoked after an answer is cached.&lt;/li&gt;
&lt;li&gt;A chunk has missing permission metadata.&lt;/li&gt;
&lt;li&gt;No authorized source supports the requested answer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inspect retrieved chunks and citations as well as the final response. A polite refusal does not prove that restricted content stayed out of the pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make access boundaries part of answer quality
&lt;/h2&gt;

&lt;p&gt;A production RAG evaluation should ask:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Did retrieval find useful evidence?&lt;/li&gt;
&lt;li&gt;Did the answer accurately represent that evidence?&lt;/li&gt;
&lt;li&gt;Was every included source authorized for this user?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Getting the first two right is not enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How are you testing permission changes and cross-tenant retrieval in your RAG applications?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>rag</category>
      <category>security</category>
      <category>architecture</category>
      <category>ai</category>
    </item>
    <item>
      <title>Your CI/CD Pipeline Is Green. Did the Deployment Actually Work?</title>
      <dc:creator>Ramatech Innovations</dc:creator>
      <pubDate>Mon, 02 Nov 2026 03:59:40 +0000</pubDate>
      <link>https://dev.to/ramatechofficial/your-cicd-pipeline-is-green-did-the-deployment-actually-work-3ncj</link>
      <guid>https://dev.to/ramatechofficial/your-cicd-pipeline-is-green-did-the-deployment-actually-work-3ncj</guid>
      <description>&lt;p&gt;A successful build, an accepted manifest and a working user journey answer three different questions. A deployment pipeline should make those differences visible.&lt;/p&gt;

&lt;p&gt;Consider an example release: the container image builds, the registry accepts it, and the deployment command exits successfully. The pipeline turns green. Meanwhile, the application cannot complete its main request because a dependency is unreachable.&lt;/p&gt;

&lt;p&gt;The pipeline reported what it checked. The missing piece was the definition of success.&lt;/p&gt;

&lt;h2&gt;
  
  
  Define four release checks
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Question&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Artifact identity&lt;/td&gt;
&lt;td&gt;Are we deploying the intended build?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workload rollout&lt;/td&gt;
&lt;td&gt;Did the workload converge to the intended state?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Application behavior&lt;/td&gt;
&lt;td&gt;Does a representative request produce the expected result?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operational observation&lt;/td&gt;
&lt;td&gt;Are errors and latency acceptable after release?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These checks complement one another. None proves the entire release is correct.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Connect the running release to its build
&lt;/h2&gt;

&lt;p&gt;Record the source revision, image digest, target environment and deployment identifier together. If you use mutable image tags, a tag name alone may not identify the artifact you intended to release.&lt;/p&gt;

&lt;p&gt;Choose a way to identify the running application version. A version endpoint, build metadata or a deployment annotation can help, but decide what it proves. An annotation records an intention; a response from the application can provide different evidence.&lt;/p&gt;

&lt;p&gt;Keep credentials and sensitive configuration out of release reports.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Wait for the rollout, with a deadline
&lt;/h2&gt;

&lt;p&gt;For a Kubernetes Deployment named web in namespace demo, a rollout check can look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl rollout status deployment/web &lt;span class="nt"&gt;-n&lt;/span&gt; demo &lt;span class="nt"&gt;--timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;180s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace the example resource names and choose a timeout appropriate to your workload. The command's success describes the rollout conditions Kubernetes evaluates; it is not an end-to-end business test.&lt;/p&gt;

&lt;p&gt;Ensure a failed check actually fails the pipeline. A command placed in a script that ignores its exit status is not an effective gate.&lt;/p&gt;

&lt;p&gt;If another system reconciles deployment state, such as a GitOps controller, wait for the intended revision through that system as well. Avoid assuming that a successful repository update means the cluster is already running it.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Test through the intended application path
&lt;/h2&gt;

&lt;p&gt;A representative check should exercise the behavior users depend on. For a read-only HTTP check, a starting point is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--fail&lt;/span&gt; &lt;span class="nt"&gt;--silent&lt;/span&gt; &lt;span class="nt"&gt;--show-error&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--connect-timeout&lt;/span&gt; 5 &lt;span class="nt"&gt;--max-time&lt;/span&gt; 15 &lt;span class="se"&gt;\&lt;/span&gt;
  https://app.example.com/health
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The URL and timeouts are placeholders. curl's --fail makes HTTP responses of 400 or higher fail in ordinary cases; a successful exit does not validate response content or prove business correctness.&lt;/p&gt;

&lt;p&gt;A shallow health endpoint may not exercise a database, an authorization rule or a downstream API. Add explicit assertions appropriate to a safe test request. Check the status, expected fields and result, not just whether any response arrived.&lt;/p&gt;

&lt;p&gt;For operations that write data, use an approved synthetic test design with clear ownership and cleanup. Do not retry a business transaction blindly.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Observe after the initial check
&lt;/h2&gt;

&lt;p&gt;A single request is a small sample. Define an observation window and the signals that matter: request failures, latency, dependency errors and relevant application outcomes.&lt;/p&gt;

&lt;p&gt;Decide who receives an alert and who can stop or reverse a release. A rollback command is only part of recovery; configuration changes and database migrations may require a different approach.&lt;/p&gt;

&lt;p&gt;Do not treat an automatic rollback as proof that every effect of the release has been reversed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make the pipeline result explainable
&lt;/h2&gt;

&lt;p&gt;Prefer a release summary that says which checks passed, which revision they evaluated and when they ran.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Artifact identity recorded.&lt;/li&gt;
&lt;li&gt;Intended workload rollout completed.&lt;/li&gt;
&lt;li&gt;Representative request assertions passed.&lt;/li&gt;
&lt;li&gt;Observation window completed within agreed thresholds.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are proposed report fields, not results from a real deployment. They make it easier for an operator to distinguish “deployment accepted” from “release behavior verified.”&lt;/p&gt;

&lt;p&gt;The useful question is not whether the pipeline is green. It is what evidence made it green.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/concepts/workloads/controllers/deployment/" rel="noopener noreferrer"&gt;Kubernetes: Deployments&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://curl.se/docs/manpage.html" rel="noopener noreferrer"&gt;curl manual&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>Your RAG Answer Is Wrong. Check What Reached the Prompt Before Changing the Model.</title>
      <dc:creator>Ramatech Innovations</dc:creator>
      <pubDate>Mon, 26 Oct 2026 16:19:35 +0000</pubDate>
      <link>https://dev.to/ramatechofficial/your-rag-answer-is-wrong-check-what-reached-the-prompt-before-changing-the-model-5hdc</link>
      <guid>https://dev.to/ramatechofficial/your-rag-answer-is-wrong-check-what-reached-the-prompt-before-changing-the-model-5hdc</guid>
      <description>&lt;p&gt;A retrieval-augmented generation system can return a fluent answer to the wrong question, cite an outdated document, or invent a detail that its sources never supplied. Those failures can look similar in the chat window. They need different fixes.&lt;/p&gt;

&lt;p&gt;Before changing the model, follow one request through three checkpoints: indexed evidence, retrieved evidence, and context actually delivered to the generator.&lt;/p&gt;

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

&lt;p&gt;Suppose an internal assistant is asked:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How long are application audit logs retained?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Imagine two documents in its knowledge base. An older handbook says 30 days; a current policy says 90 days for application audit logs, with separate rules for other categories. The assistant answers “30 days.” These numbers are illustrative policy values, not retention recommendations.&lt;/p&gt;

&lt;p&gt;A stronger model might still repeat the old policy if that is the only evidence it receives. First determine where the current information disappeared.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Check the evidence before the search
&lt;/h2&gt;

&lt;p&gt;Locate the current source document. Confirm that ingestion succeeded and inspect the extracted text, not just the original PDF or page.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does the extracted text include the 90-day rule?&lt;/li&gt;
&lt;li&gt;Is “application audit logs” still attached to that rule?&lt;/li&gt;
&lt;li&gt;Are headings, tables or exceptions split in a way that changes the meaning?&lt;/li&gt;
&lt;li&gt;Can each chunk be traced to a document version and section?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A successfully uploaded file is not proof that the right passage is searchable. If extraction lost the table containing the answer, changing a generation prompt will not recover it.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Inspect retrieval separately
&lt;/h2&gt;

&lt;p&gt;For the exact failing question, inspect the returned passages and their identifiers before generating an answer.&lt;/p&gt;

&lt;p&gt;If only the old handbook appears, investigate collection selection, metadata filters, query wording, chunk boundaries and any reranking step.&lt;/p&gt;

&lt;p&gt;Do not assume that increasing the number of results will solve the problem. It may introduce more obsolete or irrelevant passages. Compare the actual passages returned before and after each change.&lt;/p&gt;

&lt;p&gt;Version metadata is useful only when your application applies it correctly. A recent ingestion timestamp is not necessarily a policy's effective date.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Inspect the assembled context
&lt;/h2&gt;

&lt;p&gt;The search results are not always the same as the model input. A later stage may drop, shorten, reorder or summarize passages.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Checkpoint&lt;/th&gt;
&lt;th&gt;What to inspect&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Retrieval output&lt;/td&gt;
&lt;td&gt;Was the current passage returned?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context assembly&lt;/td&gt;
&lt;td&gt;Did it survive filtering and the context budget?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Generator input&lt;/td&gt;
&lt;td&gt;Did the model receive the rule, category and effective version together?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If retrieval returns the current policy but prompt assembly omits it, the immediate problem is between retrieval and generation.&lt;/p&gt;

&lt;p&gt;Use access-controlled traces. Avoid copying confidential passages or personal information into unrestricted logs.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Evaluate the answer against its evidence
&lt;/h2&gt;

&lt;p&gt;Once the correct passage reaches the generator, inspect what the answer does with it.&lt;/p&gt;

&lt;p&gt;“All logs are retained for 90 days” is still incorrect in this example: it expands a category-specific rule into a universal statement.&lt;/p&gt;

&lt;p&gt;Check whether each important claim is supported by the supplied passage. Inspect citations directly; a citation marker alone does not establish that a source supports the sentence.&lt;/p&gt;

&lt;p&gt;For conflicting or insufficient evidence, define how the assistant should respond. It might explain the conflict, ask which log category the user means, or say it cannot determine the answer. A fallback instruction defines intended behavior; it does not guarantee compliance.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Keep a small regression set
&lt;/h2&gt;

&lt;p&gt;Save representative questions with expected evidence and answer requirements. Include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A straightforward answerable question.&lt;/li&gt;
&lt;li&gt;A question affected by an old and a current document.&lt;/li&gt;
&lt;li&gt;A question with an important exception.&lt;/li&gt;
&lt;li&gt;A question the available documents cannot answer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Record retrieval quality and answer support separately. Correct-looking answers can hide poor retrieval, while relevant passages can still produce unsupported answers.&lt;/p&gt;

&lt;p&gt;Change one component at a time and compare the same cases. A useful experiment might adjust a version filter, a chunking rule or context assembly. Keep other settings stable enough to interpret the difference.&lt;/p&gt;

&lt;h2&gt;
  
  
  A practical debugging order
&lt;/h2&gt;

&lt;p&gt;Start with source availability, then extraction and indexing, retrieval, context assembly, and finally generation. This is a diagnostic order, not a rule that every failure belongs to exactly one stage.&lt;/p&gt;

&lt;p&gt;Identify the first point where the evidence stops supporting the requested answer. That gives you a concrete change to test instead of another blind model swap.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.langchain.com/langsmith/evaluate-rag-tutorial" rel="noopener noreferrer"&gt;LangChain: Evaluate a RAG application&lt;/a&gt; — evaluation dimensions and dataset-based comparisons.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://docs.nvidia.com/rag/latest/debugging.html" rel="noopener noreferrer"&gt;NVIDIA RAG Blueprint: Pipeline debugging guide&lt;/a&gt; — component-level troubleshooting for that implementation.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>rag</category>
    </item>
    <item>
      <title>OpenShift Pod Running, but the Application Is Unreachable? Check the Service Port</title>
      <dc:creator>Ramatech Innovations</dc:creator>
      <pubDate>Sat, 24 Oct 2026 12:11:28 +0000</pubDate>
      <link>https://dev.to/ramatechofficial/openshift-pod-running-but-the-application-is-unreachable-check-the-service-port-477k</link>
      <guid>https://dev.to/ramatechofficial/openshift-pod-running-but-the-application-is-unreachable-check-the-service-port-477k</guid>
      <description>&lt;p&gt;A Pod showing &lt;code&gt;Running&lt;/code&gt; does not prove that users can reach its application. One possible cause is a mismatch between the application's listening port and the Service's &lt;code&gt;targetPort&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The example
&lt;/h2&gt;

&lt;p&gt;Assume the application listens on TCP port 8080 and the Service exposes port 80. The Service incorrectly forwards traffic to port 80 on the selected Pods.&lt;/p&gt;

&lt;p&gt;This is one possible diagnosis, not a conclusion to apply to every connectivity failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Inspect before changing anything
&lt;/h2&gt;

&lt;p&gt;Replace the example namespace and resource names with your own:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;oc get pods &lt;span class="nt"&gt;-n&lt;/span&gt; demo &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;web &lt;span class="nt"&gt;-o&lt;/span&gt; wide
oc get service web &lt;span class="nt"&gt;-n&lt;/span&gt; demo &lt;span class="nt"&gt;-o&lt;/span&gt; yaml
oc get deployment web &lt;span class="nt"&gt;-n&lt;/span&gt; demo &lt;span class="nt"&gt;-o&lt;/span&gt; yaml
oc get endpointslices &lt;span class="nt"&gt;-n&lt;/span&gt; demo &lt;span class="nt"&gt;-l&lt;/span&gt; kubernetes.io/service-name&lt;span class="o"&gt;=&lt;/span&gt;web
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Confirm that the Service selector matches the intended Pods and inspect endpoint readiness. Check the application's actual listening port using its configuration and logs. Declaring a containerPort does not, by itself, make an application listen on that port.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Recognize the mismatch
&lt;/h2&gt;

&lt;p&gt;The incorrect part of the Service could look like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http&lt;/span&gt;
    &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
    &lt;span class="na"&gt;targetPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, port is the Service port; targetPort is the destination port on the selected Pods. They do not have to be identical.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Correct the source configuration
&lt;/h2&gt;

&lt;p&gt;If the application actually listens on 8080, the corresponding Service configuration should be:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http&lt;/span&gt;
    &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
    &lt;span class="na"&gt;targetPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These YAML blocks are fragments, not complete Service manifests. Preserve the selector and other fields. Update the manifest in your source repository and deploy through your normal change process. Where a controller manages the Service, change its source configuration rather than relying on a manual edit that may be reverted.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Verify from inside the cluster
&lt;/h2&gt;

&lt;p&gt;From an existing diagnostic Pod with curl installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;oc &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; demo &amp;lt;diagnostic-pod&amp;gt; &lt;span class="nt"&gt;--&lt;/span&gt; curl &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="nt"&gt;--connect-timeout&lt;/span&gt; 5 http://web:80/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The example assumes that the diagnostic Pod is in the same namespace as the Service. Use a path with a known expected application response. An HTTP error response and a connection timeout are different outcomes; interpret the result rather than treating every non-200 response as a networking failure.&lt;/p&gt;

&lt;p&gt;If the request still fails, investigate the application bind address, Pod readiness, Service selectors and NetworkPolicies. For external access, separately inspect the OpenShift Route, its selected Service port and any TLS configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Takeaway
&lt;/h2&gt;

&lt;p&gt;Check each connection separately: application listener, Pod readiness, Service selection, port mapping and external routing. Avoid changing multiple layers at once without evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reference
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/tasks/debug/debug-application/debug-service/" rel="noopener noreferrer"&gt;Kubernetes: Debug Services&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>openshift</category>
    </item>
  </channel>
</rss>
