<?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: Keith Azodeh</title>
    <description>The latest articles on DEV Community by Keith Azodeh (@keith_azodeh).</description>
    <link>https://dev.to/keith_azodeh</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%2F3902575%2Fada94ceb-dc2f-47e8-b77a-1a3f1f9deadf.jpeg</url>
      <title>DEV Community: Keith Azodeh</title>
      <link>https://dev.to/keith_azodeh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/keith_azodeh"/>
    <language>en</language>
    <item>
      <title>Cloudflare D1’s 50 MB Cap Exposes a Trap in Paginated Search</title>
      <dc:creator>Keith Azodeh</dc:creator>
      <pubDate>Thu, 05 Nov 2026 14:08:39 +0000</pubDate>
      <link>https://dev.to/keith_azodeh/cloudflare-d1s-50-mb-cap-exposes-a-trap-in-paginated-search-n24</link>
      <guid>https://dev.to/keith_azodeh/cloudflare-d1s-50-mb-cap-exposes-a-trap-in-paginated-search-n24</guid>
      <description>&lt;p&gt;A support archive can show 25 case cards and still pull thousands of work notes to render them. That difference matters on Cloudflare D1. The company announced on October 30 that it would start rejecting query results larger than 50 MB on November 4, 2026. D1’s limits page lists the cap and exempts REST API import and export operations. The first thing to check is what the query returns before your application groups, trims, or renders it. &lt;a href="https://developers.cloudflare.com/changelog/post/2026-10-30-query-result-size-limit/" rel="noopener noreferrer"&gt;Cloudflare announcement&lt;/a&gt; · &lt;a href="https://developers.cloudflare.com/d1/platform/limits/" rel="noopener noreferrer"&gt;D1 limits&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Disclosure: AI generated and fact-checked this article against the linked public sources. Keith has not reviewed it.&lt;/p&gt;

&lt;p&gt;The failure can hide behind a reassuring page size. Imagine a support dashboard that selects 25 parent cases in a subquery and joins all their notes in the outer query. If those cases each have 200 notes averaging 12 KB of text, the note bodies alone total about 60 MB before accounting for other columns. Those are invented fixture values, and the arithmetic describes the text alone. Cloudflare’s own accounting determines whether a real response crosses its cap.&lt;/p&gt;

&lt;p&gt;Limiting the outer join to 25 rows cuts the result, but it changes what a page means. A single case with 25 matching notes could occupy the whole page. If the interface promises 25 cases, the query needs to preserve the parent case as the unit of pagination.&lt;/p&gt;

&lt;h2&gt;
  
  
  Page the case IDs first
&lt;/h2&gt;

&lt;p&gt;The public Illumia Archive Intelligence case study describes a local PostgreSQL application that groups search results by parent case and highlights matching work records in the case history. The implementation was tested with synthetic records, with workplace acceptance staged separately. The following design uses that interface as a reference for a hypothetical D1 implementation. &lt;a href="https://asaday.co/projects/illumia" rel="noopener noreferrer"&gt;Illumia case study&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Start with a page query that returns one row per matching case. Use an existence check when the filter only needs to know whether a matching note exists. Select the case ID and the small fields the card actually displays. If cards need a note preview, fetch a bounded set of excerpts for the visible cases, keeping the case ID on each excerpt. A count of two excerpts per case still needs a length bound. A short preview can carry a note ID so that the full context remains one deliberate click away.&lt;/p&gt;

&lt;p&gt;Give the page a deterministic order. For an ascending list ordered by a non-null creation timestamp and a unique case ID, the next page starts after the last timestamp and ID pair. Keep that ordering and its cursor consistent with the current filters. If the filter changes, restart the page. SQLite documents this approach and explains why large offsets can require it to work through rows it never returns. An index that matches the access pattern matters, and a cursor does not freeze a changing dataset. &lt;a href="https://www.sqlite.org/rowvalue.html#scrolling_window_queries" rel="noopener noreferrer"&gt;SQLite’s scrolling window example&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There’s a tradeoff. Splitting the card and detail reads may cost an extra round trip, and an existence check on a poorly indexed filter can still be expensive. Look at the query plan and measure the bytes for each read separately. A small response can still take too long to produce. Loading the first page also should not trigger 25 separate requests for complete histories.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make one case ruin the average
&lt;/h2&gt;

&lt;p&gt;Try a synthetic fixture with many ordinary cases and one case with hundreds of long notes. Include two cases that share a sort timestamp, and a search term that appears in several notes under the same case. Check that each case appears once in the list, that page boundaries retain both cases with tied timestamps, and that opening a matching note still lands inside the right history. Measure the list, excerpt, and detail responses separately. The detail view may need its own pagination when the same unusually large case opens.&lt;/p&gt;

&lt;p&gt;Run the fixture through the application’s error path too. If the query fails, preserve the search terms and show that the results could not load. A successful search with zero matches tells the operator something different. Keep administrative exports on an explicitly authorized path designed for bulk data, with their own size and completion checks.&lt;/p&gt;

&lt;p&gt;Support teams often open an archive because they need the context behind one earlier incident. The search page has done its job when they can find that case and follow the right note into its history, even when another case on the same page has years of entries.&lt;/p&gt;

</description>
      <category>cloudflare</category>
      <category>sql</category>
      <category>webdev</category>
    </item>
    <item>
      <title>GitHub’s December 2 PR Block Has a November 9 Rehearsal</title>
      <dc:creator>Keith Azodeh</dc:creator>
      <pubDate>Tue, 03 Nov 2026 14:10:54 +0000</pubDate>
      <link>https://dev.to/keith_azodeh/githubs-december-2-pr-block-has-a-november-9-rehearsal-n3h</link>
      <guid>https://dev.to/keith_azodeh/githubs-december-2-pr-block-has-a-november-9-rehearsal-n3h</guid>
      <description>&lt;p&gt;A preview build disappears, somebody notices that a GitHub policy blocked it, and the fastest-looking fix is to allow the workflow. That is exactly the moment to slow down. GitHub’s &lt;a href="https://github.blog/changelog/2026-11-02-pull_request_target-blocked-by-default-december-2/" rel="noopener noreferrer"&gt;November 2 announcement&lt;/a&gt; sets December 2, 2026 as the date for default enforcement against pull_request_target in affected public repositories. Two earlier brownouts, November 9 and 16 from 16:00–18:00 UTC, will temporarily enforce the block. Blocked runs will fail with an annotation without executing.&lt;/p&gt;

&lt;p&gt;Disclosure: This article was generated and fact-checked with AI using the public sources linked here. It was published through an automated workflow and has not been reviewed by Keith.&lt;/p&gt;

&lt;p&gt;The practical question is whether your preview can build a contributor’s changes without putting deployment authority in the same execution environment. A green check alone cannot answer that. The brownout gives teams a concrete deadline for finding which workflows combine those responsibilities.&lt;/p&gt;

&lt;p&gt;GitHub says private and internal repositories are unaffected. The change covers public repositories on GitHub Free, Team, and Enterprise Cloud, and does not apply to GitHub Enterprise Server. Outside the brownout windows, the default policy returns to evaluation mode until enforcement begins. Check the announcement and your applicable policies before treating a date as a prediction about one specific repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  The workflow file can be trusted while the build is not
&lt;/h2&gt;

&lt;p&gt;GitHub’s &lt;a href="https://docs.github.com/en/actions/reference/security/securely-using-pull_request_target" rel="noopener noreferrer"&gt;security guidance&lt;/a&gt; explains the trap: pull_request_target uses the base repository’s context and can access its secrets and token. A workflow defined on the trusted base branch can still check out and execute code from a fork. Build scripts, tests, dependencies, and configuration can all become that execution path. By comparison, ordinary fork pull_request runs use a read-only token and do not receive other repository secrets.&lt;/p&gt;

&lt;p&gt;Imagine a workflow that labels a contribution, checks out its head revision, installs dependencies, builds a preview, and deploys it. The label step and the build step may live in the same reviewed YAML file. They still consume different kinds of input. A label operation can treat a title as data; a package script asks the runner to execute instructions supplied by the contribution.&lt;/p&gt;

&lt;p&gt;Reviewing only the workflow definition misses that second program. Ask which revision supplies every command that eventually runs. “The workflow comes from main” is useful information, but it does not settle where the build instructions come from.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://asaday.co/projects/okeike-web-editor" rel="noopener noreferrer"&gt;Okeike Web Editor case study&lt;/a&gt; provides a concrete reason this boundary matters. It documents an editor under ongoing development where publishing creates a GitHub commit and follows an existing deployment pipeline to the relevant Firebase Hosting target. That is a useful delivery shape: an editing action has consequences beyond saving a document.&lt;/p&gt;

&lt;p&gt;The case study does not establish that Okeike uses pull_request_target, accepts fork contributions, or has an affected workflow. Consider a proposed extension that adds previews for external contributions to a system with that publishing shape. That extension introduces a new question: who supplied the code being built, and where does it gain access to the ability to publish?&lt;/p&gt;

&lt;p&gt;A preview requirement should not silently inherit the production publishing path just because both produce a website.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rehearse the boundary before the brownout
&lt;/h2&gt;

&lt;p&gt;Start with the workflows reported by the policy’s evaluation results. For each affected file, write down its actual purpose. Metadata maintenance, testing a contribution, and deploying a reviewed change are separate jobs even when one YAML file currently handles all of them. Name the repository revision each job reads and the credentials it can reach.&lt;/p&gt;

&lt;p&gt;For the proposed editor extension, the initial design could put contribution builds in a context without deployment secrets. A separate publishing step would need its own authorization decision about what it is allowed to publish. That separation creates useful review points, but it is not sufficient by itself: outputs from the untrusted build remain untrusted. Passing an artifact between jobs does not cleanse its contents or make instructions embedded in it safe to execute.&lt;/p&gt;

&lt;p&gt;Try the contributor path with a disposable repository and a harmless synthetic fork change. Have a build script print a recognizable marker. Use no real deployment credentials. The observation you want is which job executes that marker and which revision supplied it. Review the configured permissions alongside that result; a successful test is evidence about one exercised path, not proof that every path is safe.&lt;/p&gt;

&lt;p&gt;Then rehearse the operational failure. When a preview does not run, does the contributor see an actionable explanation? Can the maintainer distinguish a policy block from a broken build? Who owns the decision to change the workflow or its applicable event policy? These are small details until somebody is trying to unblock a release.&lt;/p&gt;

&lt;p&gt;An explicit policy exception may be appropriate for a necessary, narrowly scoped workflow. Treat that as permission to run, not a finding that the workflow is secure. Moving the same privileged execution to another trigger also leaves the underlying question unresolved.&lt;/p&gt;

&lt;p&gt;The November 9 window is useful because it turns a future policy into an observable interruption. Use it to learn whether a preview depends on authority it should not need. The valuable outcome is a contribution path whose code origin and publishing permissions are understandable, even when the status check turns red.&lt;/p&gt;

</description>
      <category>github</category>
      <category>security</category>
      <category>devops</category>
    </item>
    <item>
      <title>AWS Lets AI Agents Stop Workflows. Jobs Can Still Keep Running.</title>
      <dc:creator>Keith Azodeh</dc:creator>
      <pubDate>Tue, 03 Nov 2026 00:03:45 +0000</pubDate>
      <link>https://dev.to/keith_azodeh/aws-lets-ai-agents-stop-workflows-jobs-can-still-keep-running-gfi</link>
      <guid>https://dev.to/keith_azodeh/aws-lets-ai-agents-stop-workflows-jobs-can-still-keep-running-gfi</guid>
      <description>&lt;p&gt;An AI agent can stop a workflow while an integrated job continues running. &lt;a href="https://aws.amazon.com/about-aws/whats-new/2026/10/step-functions-workflows-ai-agent-tools/" rel="noopener noreferrer"&gt;AWS’s October 29 launch&lt;/a&gt; lets agents use existing Step Functions workflows through Amazon Bedrock AgentCore Gateway. That makes established processes easier to invoke from a conversation. It also makes the meaning of “stop” part of the interface an agent must understand.&lt;/p&gt;

&lt;p&gt;Disclosure: This article was generated and fact-checked with AI using the public sources linked here. It was published through an automated workflow and has not been reviewed by Keith.&lt;/p&gt;

&lt;p&gt;The launch supports Standard and Express workflows. The agent chooses when to invoke a workflow and supplies its input; the workflow determines the sequence of steps. The &lt;a href="https://docs.aws.amazon.com/bedrock-agentcore/latest/devguide/gateway-target-connector-step-functions.html" rel="noopener noreferrer"&gt;connector documentation&lt;/a&gt; includes StopExecution among the operations an operator can expose. That operation works with Standard executions, not Express executions. A product should establish that distinction before offering a universal-looking cancel button.&lt;/p&gt;

&lt;p&gt;There is a second boundary inside the workflow. For supported services, a Step Functions Run a Job integration waits for the integrated job to finish. If that task is aborted, AWS documents a &lt;a href="https://docs.aws.amazon.com/step-functions/latest/dg/connect-to-resource.html" rel="noopener noreferrer"&gt;best-effort attempt to cancel the job&lt;/a&gt;. Missing permissions or a temporary service outage can prevent cancellation, and charges from the integrated service may continue. A stopped orchestration is therefore insufficient evidence that every piece of work has stopped.&lt;/p&gt;

&lt;h2&gt;
  
  
  Follow the stop signal to the worker
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://asaday.co/projects/cloud-media-distribution" rel="noopener noreferrer"&gt;Cloud Media Distribution case study&lt;/a&gt; provides a concrete historical example. The 2024 system connected a Flask control panel, an S3 media library, Systems Manager commands, and Windows EC2 publishing workers. It included start and stop modes. Its cooperative stop mechanism checked a flag before another random publishing iteration. The case study explicitly distinguishes that boundary from immediate cancellation of an upload already underway.&lt;/p&gt;

&lt;p&gt;That implementation did not use the new AgentCore connector. Its relevance is the operational distinction: a control can prevent the next unit of work without interrupting the current one. Naming both effects “stopped” loses information an operator may need.&lt;/p&gt;

&lt;p&gt;Consider a proposed redesign that prepares media in an AWS Batch job, waits through a supported Run a Job integration, and then dispatches a publishing worker. This is an illustrative architecture, not a claimed upgrade to the historical system. If the Standard execution is stopped during preparation, inspect the Batch job separately. Do not assume that the orchestration’s terminal state establishes that preparation has ended.&lt;/p&gt;

&lt;p&gt;If a worker was already dispatched, it needs its own documented cancellation behavior. Can it interrupt a transfer? Does it finish the current operation and decline the next item? Which acknowledgement establishes that it has reached a safe stopping point? A clean answer may be “stop requested; current transfer still in progress.” That is more useful than a completion message the system cannot substantiate.&lt;/p&gt;

&lt;p&gt;Keep enough association between the execution and its downstream work to investigate that answer. In the proposed design, the operator should be able to locate the relevant job or worker attempt without searching unrelated machines. Retain the last observed state and its observation time. If the worker cannot be reached, display that uncertainty and assign follow-up rather than converting silence into a cancellation receipt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stopping future work does not reverse completed work
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://docs.aws.amazon.com/step-functions/latest/apireference/API_StopExecution.html" rel="noopener noreferrer"&gt;StopExecution API&lt;/a&gt; stops an execution and returns a stop date. It does not document a general operation for undoing the business effects of completed steps. A prepared file, a dispatched external request, and a published post require different follow-through.&lt;/p&gt;

&lt;p&gt;For the proposed media workflow, decide what remains after each boundary. Before dispatch, cancellation might leave only temporary preparation artifacts. During a transfer, it might leave a partial staging file. After publication, preventing another cycle does not remove the post already delivered. These are scenarios to account for, not reports of failures in the historical project.&lt;/p&gt;

&lt;p&gt;Define cleanup separately from cancellation. Identify artifacts belonging to that attempt, determine whether another process still needs them, and record what cleanup actually completed. Avoid turning a broad “stop everything” command into an undocumented deletion routine. Reversing an external publication, where supported, should be a separate, deliberate operation with its own authority and outcome evidence.&lt;/p&gt;

&lt;p&gt;A useful acceptance exercise holds a fictional job at each boundary: before dispatch, during preparation, after worker dispatch, and after a simulated publication receipt. Send a stop request and compare the orchestration state with the downstream state. Use a stub destination, not real social accounts. Include a worker that acknowledges late and a cancellation attempt that cannot complete.&lt;/p&gt;

&lt;p&gt;The result should explain what stopped, what may still be active, and what already happened. A team can then decide whether cooperative cancellation is adequate for its workload or whether individual steps need stronger interruption support.&lt;/p&gt;

&lt;p&gt;This costs more engineering than forwarding a stop call. It requires a worker contract, a way to inspect residual activity, and an operator responsible for exceptions. The benefit is a cancellation promise that matches the system’s actual control.&lt;/p&gt;

&lt;p&gt;AWS’s new connector can bring an existing workflow within reach of an agent. Before relying on its stop tool, rehearse the boundary where orchestration ends and downstream work continues. That is where an apparently simple conversation can leave an operational task behind.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>architecture</category>
    </item>
    <item>
      <title>DeepSeek’s Super-agent Wants Less of Your Attention. Test That Claim.</title>
      <dc:creator>Keith Azodeh</dc:creator>
      <pubDate>Mon, 02 Nov 2026 19:07:59 +0000</pubDate>
      <link>https://dev.to/keith_azodeh/deepseeks-super-agent-wants-less-of-your-attention-test-that-claim-4697</link>
      <guid>https://dev.to/keith_azodeh/deepseeks-super-agent-wants-less-of-your-attention-test-that-claim-4697</guid>
      <description>&lt;p&gt;A bot can finish useful work and still make a team slower by asking everyone to watch it happen. &lt;a href="https://github.com/deepseek-ai/dsh-superagent-prototype/commit/6337fc823ce20251c8de8085948165c81aaa701e" rel="noopener noreferrer"&gt;DeepSeek’s October 31 code drop&lt;/a&gt; makes that problem unusually explicit: its Super-agent prototype is designed around conserving human attention. The practical test is whether people can find the result and act at the right moment with fewer unnecessary interruptions.&lt;/p&gt;

&lt;p&gt;Disclosure: This article was generated and fact-checked with AI using the public sources linked here. It was published through an automated workflow and has not been reviewed by Keith.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/deepseek-ai/dsh-superagent-prototype" rel="noopener noreferrer"&gt;repository&lt;/a&gt; describes a coding agent scoped to one GitHub repository, with optional Feishu input, separate work sessions, and replies in the originating conversation. It also labels the code a research prototype, not an official DeepSeek product or production-ready software. The public implementation differs from its internal version. This is an inspectable design to learn from, not evidence that every team can deploy an autonomous colleague and immediately save time.&lt;/p&gt;

&lt;p&gt;Its &lt;a href="https://github.com/deepseek-ai/dsh-superagent-prototype/blob/main/docs/000-philosophy.md" rel="noopener noreferrer"&gt;philosophy document&lt;/a&gt; treats messages and notifications as costs. Its communication policy distinguishes internal work from a result someone can use or a decision someone must make. That is a useful design constraint for operational software as well as coding agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  A status change does not always deserve an interruption
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://asaday.co/projects/garden-church-platform" rel="noopener noreferrer"&gt;Garden case study&lt;/a&gt; documents connected staff work, follow-up owners, due dates, and workflow states. Garden Work extends a self-hosted Plane Community foundation, with access projected from the wider platform. The replacement of Planning Center remains staged, with migration and staff acceptance still requiring contextual completion. Nothing in that case study claims a deployed DeepSeek integration.&lt;/p&gt;

&lt;p&gt;Consider a proposed assistant for an isolated staff-work demonstration. It prepares a summary for a task owner. While working, it loads the task, revises the draft, retries a temporary lookup, and produces a reviewable summary. Each event is worth retaining in the execution record. Sending four chat updates would ask the owner to inspect activity that may not change what they can do.&lt;/p&gt;

&lt;p&gt;Define the notification around the recipient’s next action. “The summary is ready to review” can point to a stable draft. A question can identify the missing decision. A failure can explain what remains unavailable. “Still processing” needs a reason tied to the task’s expectations, rather than being emitted whenever the agent changes state.&lt;/p&gt;

&lt;p&gt;That distinction belongs in application logic. Keep an internal event history and a separate notification decision. A worker retry should not automatically become a staff message just because both pass through the same event system. The system can remain observable without making a person its live log viewer.&lt;/p&gt;

&lt;p&gt;Before dispatching a delayed notification, check the task’s current owner and state. A summary prepared for an earlier owner may no longer require their attention. If the task was canceled, a queued “ready for review” message could create unnecessary work. Use an explicit delivery record so replaying the same ready event does not produce another interruption. These are proposed implementation choices, not reported Garden features or DeepSeek guarantees.&lt;/p&gt;

&lt;h2&gt;
  
  
  Measure what the quiet version makes people miss
&lt;/h2&gt;

&lt;p&gt;A useful pilot compares notification behavior on the same fictional task history. Run one version that announces routine transitions and another that reserves interruptions for agreed outcomes and exceptions. Keep the underlying task results identical. Otherwise, fewer messages might simply mean the quieter version did less work.&lt;/p&gt;

&lt;p&gt;Ask participants to identify what needs their attention, open the relevant result, and choose the next step. Record unnecessary messages alongside missed decisions and the time required to locate the deliverable. If the quiet version hides a blocked task until its deadline passes, the smaller message count is not an improvement.&lt;/p&gt;

&lt;p&gt;Include a change of owner and a canceled task in the replay. Deliver a repeated event, too. Those cases reveal whether the system notifies the person responsible now, suppresses obsolete work, and avoids turning one result into several alerts. Use synthetic records so the exercise does not expose real member notes or contact details.&lt;/p&gt;

&lt;p&gt;Agree on silence expectations before the pilot. A background task expected to finish later can expose status in a work view. A time-sensitive task may need an exception notification when its expected completion window is no longer credible. A direct request for status also deserves an answer. Suppression should remove interruptions that offer no useful action; it should not conceal a broken promise.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/deepseek-ai/dsh-superagent-prototype/blob/main/prompts/team/communication.md" rel="noopener noreferrer"&gt;DeepSeek’s communication instructions&lt;/a&gt; keep detailed engineering evidence in the work record while making the outbound message brief and useful. Apply the same separation to the proposed staff assistant: keep the summary, relevant evidence, and unresolved limitations available at the linked destination. A short notification should not require the recipient to reconstruct the task from scattered messages.&lt;/p&gt;

&lt;p&gt;There is a cost to maintaining that separation. Delivery records, cancellation checks, and recipient selection need ownership and testing. For a small, infrequent workflow, a simple manual update may be easier to operate. For a busier system, a notification policy becomes part of the product’s usefulness.&lt;/p&gt;

&lt;p&gt;DeepSeek has published a goal about attention, not a measured result for another organization. The worthwhile experiment is to see whether quieter delivery preserves timely decisions. Count the interruptions, then check whether the right person still knows what to do.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>productivity</category>
    </item>
    <item>
      <title>GitHub’s New Dependabot Verdict Can Lag Behind Your Next Commit</title>
      <dc:creator>Keith Azodeh</dc:creator>
      <pubDate>Mon, 02 Nov 2026 14:06:17 +0000</pubDate>
      <link>https://dev.to/keith_azodeh/githubs-new-dependabot-verdict-can-lag-behind-your-next-commit-2m7e</link>
      <guid>https://dev.to/keith_azodeh/githubs-new-dependabot-verdict-can-lag-behind-your-next-commit-2m7e</guid>
      <description>&lt;p&gt;A dependency can be labeled “unreachable” before a feature starts calling its vulnerable function. &lt;a href="https://github.blog/changelog/2026-10-28-prioritize-dependabot-alerts-with-reachability-analysis/" rel="noopener noreferrer"&gt;GitHub’s October 28 announcement&lt;/a&gt; introduced Dependabot reachability analysis in public preview. The release helps teams decide where to spend attention. A detail in the documentation matters for anyone wiring the verdict into a release workflow: pushing new code does not trigger another scan.&lt;/p&gt;

&lt;p&gt;Disclosure: This article was generated and fact-checked with AI using the public sources linked here. It was published through an automated workflow and has not been reviewed by Keith.&lt;/p&gt;

&lt;p&gt;The preview covers JavaScript and TypeScript repositories on GitHub Enterprise Cloud with supported lockfiles. It is off by default. That scope matters before a team plans around the feature; having a TypeScript application alone does not establish eligibility or enablement.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.github.com/en/code-security/concepts/supply-chain-security/about-reachability-analysis-for-dependabot-alerts" rel="noopener noreferrer"&gt;GitHub’s documentation&lt;/a&gt; describes an initial scan, then scans every 24 hours while open alerts remain. Code pushes do not start a scan, and the preview has no on-demand trigger. “Reachable” means a call path was found; “potentially reachable” deserves similar priority. “Unreachable” means analysis finished without finding a path. “Reachability unavailable” means it could not provide a verdict. None of these labels automatically closes an alert. Reachability also does not establish exploitability, and an unreachable result does not guarantee safety.&lt;/p&gt;

&lt;p&gt;The practical consequence is a timing gap. If a release changes how the application uses a dependency, an earlier verdict cannot, by itself, answer whether that new use reaches the vulnerable function.&lt;/p&gt;

&lt;h2&gt;
  
  
  Review the changed use, not just the package version
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://asaday.co/projects/exempliphai" rel="noopener noreferrer"&gt;Exempliph.ai case study&lt;/a&gt; documents an evolving application built with TypeScript, Vue, Next.js, Firebase, and Chrome extensions. It includes reusable profiles, resume editing, and reviewed application workflows. Those documented capabilities provide a useful setting for this question. The example below is hypothetical; it does not report a vulnerability, a Dependabot deployment, or a security incident in the product.&lt;/p&gt;

&lt;p&gt;Suppose a document utility is already installed. An application uses one export to prepare an editable resume preview. A later change calls another export to process a newly supported document format. The dependency version stays the same, so a review limited to package upgrades would miss the change in how the library is used.&lt;/p&gt;

&lt;p&gt;Now suppose an open advisory concerns that second function. An earlier unreachable result could have been a reasonable description of the old call graph. It has not evaluated the hypothetical new import merely because a pull request is ready to merge.&lt;/p&gt;

&lt;p&gt;During implementation review, locate the new call and follow the input to it. Is the value application-generated, read from a user-supplied document, or received from another service? Which part of the application runs the operation? Those questions help the maintainer interpret the advisory’s conditions. They do not prove that an exploit exists, and a passing ordinary document test does not disprove one.&lt;/p&gt;

&lt;p&gt;Keep the scenario concrete. A note such as “this feature introduces a call to the function named in the advisory” gives the next reviewer something to inspect. “Dependencies unchanged” leaves out the relevant change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make the triage record honest about time
&lt;/h2&gt;

&lt;p&gt;A proposed internal triage view should preserve the scanner’s verdict separately from the team’s decision. Store the alert reference, the result you observed, when you observed it, and the supporting analysis time or revision when that information is available. Do not substitute the fetch time for proof that the scanner analyzed the latest code.&lt;/p&gt;

&lt;p&gt;If the analyzed revision cannot be established, say so. A dashboard can show a recently retrieved verdict while still displaying “current release coverage unconfirmed.” That wording is more useful than a green status whose meaning quietly expanded from “no path found in an analysis” to “this release is approved.”&lt;/p&gt;

&lt;p&gt;Before shipping the hypothetical new document path, explicitly revisit the open advisory. The reviewer might choose an available patched dependency, remove the new use, or require further investigation. The decision depends on the actual advisory and application context. The earlier lower-priority label should remain evidence of an earlier assessment, not silently become a permanent exemption.&lt;/p&gt;

&lt;p&gt;A later scan may change the verdict. Keep that transition visible and connect it to the pending work rather than treating it as a newly discovered emergency with no history. If the result becomes unavailable, preserve the uncertainty and continue ordinary triage; replacing missing analysis with the last convenient label would hide the reason attention is still needed.&lt;/p&gt;

&lt;p&gt;There is an operational tradeoff here. Waiting for scheduled analysis can slow a release, while manual review takes time and expertise. A team can make that choice explicit for a particular change instead of pretending that the preview provides an immediate merge-time decision.&lt;/p&gt;

&lt;p&gt;Dependency maintenance increasingly involves machines sorting the queue before a person opens an alert. The useful implementation boundary is small but consequential: let reachability inform priority, and keep approval of changed application behavior tied to evidence that actually covers the change.&lt;/p&gt;

</description>
      <category>github</category>
      <category>security</category>
      <category>typescript</category>
    </item>
    <item>
      <title>GitHub Open-Sourced Replica. Now Break Your Prototype’s Perfect Data.</title>
      <dc:creator>Keith Azodeh</dc:creator>
      <pubDate>Mon, 02 Nov 2026 01:49:52 +0000</pubDate>
      <link>https://dev.to/keith_azodeh/github-open-sourced-replica-now-break-your-prototypes-perfect-data-38a9</link>
      <guid>https://dev.to/keith_azodeh/github-open-sourced-replica-now-break-your-prototypes-perfect-data-38a9</guid>
      <description>&lt;p&gt;&lt;a href="https://github.blog/changelog/2026-10-28-introducing-replica-an-open-source-ai-prototyping-tool/" rel="noopener noreferrer"&gt;GitHub open-sourced Replica on October 28&lt;/a&gt;, giving teams an AI prototyping tool guided by their existing components, patterns, and documentation. A familiar design system can make a proposed feature feel credible quickly. The next useful move is to challenge the data behind the screen. A directory that looks effortless with six complete records may tell you very little about choosing from incomplete results on a phone.&lt;/p&gt;

&lt;p&gt;Disclosure: This article was generated and fact-checked with AI using the public sources linked here. It was published through an automated workflow and has not been reviewed by Keith.&lt;/p&gt;

&lt;p&gt;Replica supports interactive prototypes alongside a Copilot conversation and an optional self-hosted Hub for sharing and feedback. The release is an opportunity to make experiments easier to inspect, not evidence that a generated prototype has validated a product’s real inputs. The fixture set still shapes what a reviewer can discover.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://asaday.co/projects/afrotech-directory" rel="noopener noreferrer"&gt;AfroTech Guide case study&lt;/a&gt; provides a concrete setting. The community-built guide combines approved people and event records with curated Houston dining recommendations. Public website features and connected AI capabilities have different release scopes; real-device and AI-host acceptance remain separate checks. It is an independent community resource, without a claim of official event affiliation.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://afrotechconference.com/speakers/keith-azodeh" rel="noopener noreferrer"&gt;official AFROTECH speaker profile&lt;/a&gt; describes Building AfroTech.guide as an idea-to-launch walkthrough. For that kind of build discussion, showing which inputs shaped an interface can be as instructive as showing the finished screen. The exercise below is a proposed prototype review, not a claim that the guide uses Replica or has the problems described.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give the reviewer a task the fixtures can challenge
&lt;/h2&gt;

&lt;p&gt;Suppose the prototype asks someone to compare dining options near a planned stop. Begin with an ordinary task: inspect the available context, compare two candidates, and decide whether there is enough information to choose. Avoid defining success as “click the highlighted card.” That mostly tests whether the reviewer follows the route already chosen for them.&lt;/p&gt;

&lt;p&gt;Build a small synthetic fixture set around the information the decision requires. Include a venue name long enough to wrap, a record without an image, and a description that does not fit neatly into one sentence. Keep those records fictional and visibly marked as prototype data. Inventing a restaurant’s hours or accessibility details would add misinformation rather than useful variation.&lt;/p&gt;

&lt;p&gt;Then leave a decision-relevant field unknown. Ask the reviewer what they think the screen knows. If the layout makes an absent value look like a confirmed “no,” the feedback has exposed a meaning problem that the polished version concealed. A blank cell, a placeholder, and an explicit “not provided” can lead to different interpretations.&lt;/p&gt;

&lt;p&gt;Keep the task and fixture version stable while comparing interface revisions. If every AI edit also changes the sample names, completeness, and result order, a calmer second attempt may owe more to easier data than better design. Record what changed so the reviewer can connect an observation to the experiment that produced it.&lt;/p&gt;

&lt;p&gt;This does not require simulating the entire production directory. Select a few cases that could change the person’s decision, and preserve enough surrounding information to make the choice plausible. The goal is useful friction, not a page filled with arbitrary edge cases.&lt;/p&gt;

&lt;h2&gt;
  
  
  An empty list and a failed lookup need different reviews
&lt;/h2&gt;

&lt;p&gt;A prototype often returns results immediately because the records are bundled with the screen. That is fine for exploring layout. It can hide a second question: what does the person believe when records have not arrived?&lt;/p&gt;

&lt;p&gt;Provide a controlled way to hold a lookup in progress, return a genuine empty result, and produce an unavailable response. These are proposed prototype states, not reported failures in AfroTech Guide or Replica. The important comparison is whether the reviewer can tell what happened and choose a reasonable next step.&lt;/p&gt;

&lt;p&gt;For an empty result, the screen can accurately say that the completed query found no matches within its stated scope. An unavailable lookup has not established that conclusion. If both states show the same cheerful empty card, the person may abandon a useful search because the interface implied there were no options.&lt;/p&gt;

&lt;p&gt;Observe the next action before explaining the state. Do they revise a filter, wait, retry, or assume the directory has nothing relevant? Record the visible behavior and the reviewer’s interpretation separately. Their explanation can reveal an unclear message even when they eventually reach the expected button.&lt;/p&gt;

&lt;p&gt;When comparing revisions, replay the same state transition and keep the task wording consistent. Note which behaviors are mocked. A clickable retry button in a prototype does not establish that the production service can recover, and a convincing loading sequence is not a measured latency result.&lt;/p&gt;

&lt;p&gt;There is a tradeoff in prototype fidelity. Adding real service dependencies can make feedback more representative but slow the experiment and introduce unrelated failures. Controlled fixtures make a narrower question repeatable. State what the prototype is intended to teach, then reserve operational acceptance for the working integration.&lt;/p&gt;

&lt;p&gt;For a community guide, useful feedback concerns whether someone can make a sound choice with the information actually available. Replica makes it easier to put an idea in front of a team. Giving that idea imperfect, clearly labeled data helps the team learn something beyond how convincing the demo looks.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>ux</category>
      <category>webdev</category>
    </item>
    <item>
      <title>GitHub’s New Lockfiles Don’t Lock Every Workflow Reference</title>
      <dc:creator>Keith Azodeh</dc:creator>
      <pubDate>Sun, 01 Nov 2026 19:06:53 +0000</pubDate>
      <link>https://dev.to/keith_azodeh/githubs-new-lockfiles-dont-lock-every-workflow-reference-31mi</link>
      <guid>https://dev.to/keith_azodeh/githubs-new-lockfiles-dont-lock-every-workflow-reference-31mi</guid>
      <description>&lt;p&gt;&lt;a href="https://github.blog/changelog/2026-10-28-github-actions-workflow-lockfiles-are-generally-available/" rel="noopener noreferrer"&gt;GitHub made Actions workflow lockfiles generally available on October 28&lt;/a&gt;. They let workflows keep readable action tags while executing recorded commits, including transitive action dependencies. That is useful protection against a moving reference. There is a boundary to check before calling a deployment locked: a call to a reusable workflow is not itself pinned by the caller’s action lockfile.&lt;/p&gt;

&lt;p&gt;Disclosure: This article was generated and fact-checked with AI using the public sources linked here. It was published through an automated workflow and has not been reviewed by Keith.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.github.com/en/actions/concepts/security/workflow-dependency-lockfiles" rel="noopener noreferrer"&gt;GitHub’s dependency-lockfile documentation&lt;/a&gt; makes the distinction explicit. Calls to reusable workflows need full commit SHA references. A reusable workflow can have its own lockfile, and its action dependencies are covered by the repository where that workflow is defined, rather than by the calling repository’s lockfile. The review therefore crosses a repository boundary when the deployment does.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://asaday.co/projects/okeike-web-editor" rel="noopener noreferrer"&gt;Okeike Web Editor case study&lt;/a&gt; supplies a practical setting. The working editor, still under development, turns reviewed content changes into GitHub commits and follows the existing deployment pipeline to the relevant Firebase Hosting target. It also uses source-version fingerprints to recognize changes behind a draft. The case study does not claim adoption of the new lockfiles or describe a reusable-workflow arrangement. Consider the following as a proposed extension to its release review, not a report of a defect.&lt;/p&gt;

&lt;p&gt;A content commit answers which source changed. It does not, by itself, identify every component that builds and publishes that source. If a shared deployment workflow can change independently, the site can keep the same source revision while the delivery procedure changes underneath it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Follow the call into the other repository
&lt;/h2&gt;

&lt;p&gt;Imagine a fictional multi-site publishing setup. Each site repository calls a shared deployment workflow maintained in a separate repository. The shared workflow builds the site and selects a hosting destination from the supplied configuration. Centralizing that procedure saves maintenance work across sites. It also introduces a revision that each caller must account for.&lt;/p&gt;

&lt;p&gt;Start the review at the site’s workflow. Identify the reference used for the reusable workflow call. A branch name is convenient for distributing updates, but it is also a choice to follow future changes. If the intended release requires an explicit reviewed revision, use the full commit SHA as GitHub documents, then review how that reference will be updated.&lt;/p&gt;

&lt;p&gt;Next, inspect the called workflow at that revision. Determine whether its own action dependencies are locked or otherwise pinned according to the team’s policy. A caller’s lockfile is not a substitute for that inspection. Record the called repository and revision with the release evidence so another operator can find the same procedure later.&lt;/p&gt;

&lt;p&gt;Keep the claim narrow. GitHub also says an action lockfile does not control inputs, secrets, or the runner image, and that locking a dependency does not establish its safety. An accurately documented action dependency set is valuable without being a certificate for the entire build. Review other inputs according to what the deployment actually uses.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make an update visible to the site owner
&lt;/h2&gt;

&lt;p&gt;For the proposed multi-site setup, treat a shared-workflow revision change as a release change the site team can inspect. Explain what behavior changed, which callers it affects, and what evidence supports adopting it. Avoid hiding it among unrelated content edits simply because both changes live in YAML and Git commits.&lt;/p&gt;

&lt;p&gt;A small rehearsal can use an isolated preview target and synthetic site content. First publish a harmless text change through the currently reviewed workflow revision. Record the site source commit, called workflow revision, intended target, and observed preview result. This is a proposed acceptance exercise, not a claim of testing Okeike’s current pipeline.&lt;/p&gt;

&lt;p&gt;Then propose a deliberate update to the shared workflow in a separate review. Repeat the same publishing task against the preview target. Check the rendered content and destination, not just whether the job returned success. If the shared workflow handles more than one site layout, choose representative callers so the update exercises those differences.&lt;/p&gt;

&lt;p&gt;Include an unchanged-source run where that helps isolate the workflow update. If the output changes, investigate the reason before calling the difference expected. The exercise does not prove byte-for-byte reproducibility: other build inputs may still vary. It gives the reviewer a focused comparison between delivery procedures with the source held steady.&lt;/p&gt;

&lt;p&gt;There is an operating tradeoff. Pinning each caller to a reviewed revision prevents it from silently inheriting the next shared-workflow change, but updates now need distribution and ownership. Following a branch distributes fixes quickly while allowing independent movement. Choose that behavior deliberately, and make the update responsibility clear enough that pinned callers do not become forgotten callers.&lt;/p&gt;

&lt;p&gt;For a content editor, the useful outcome is a release someone can explain: this source revision went through this reviewed deployment procedure to this target. GitHub’s new lockfiles improve one part of that account. Following the reusable-workflow boundary keeps the explanation honest when the pipeline leaves the site repository.&lt;/p&gt;

</description>
      <category>github</category>
      <category>devops</category>
      <category>security</category>
    </item>
    <item>
      <title>Amazon Pinpoint’s Deadline Passed. Why Can Some Messages Still Send?</title>
      <dc:creator>Keith Azodeh</dc:creator>
      <pubDate>Sun, 01 Nov 2026 14:07:34 +0000</pubDate>
      <link>https://dev.to/keith_azodeh/amazon-pinpoints-deadline-passed-why-can-some-messages-still-send-974</link>
      <guid>https://dev.to/keith_azodeh/amazon-pinpoints-deadline-passed-why-can-some-messages-still-send-974</guid>
      <description>&lt;p&gt;Amazon Pinpoint’s October 30, 2026 end-of-support date has passed. Yet &lt;a href="https://docs.aws.amazon.com/pinpoint/latest/userguide/migrate.html" rel="noopener noreferrer"&gt;AWS’s detailed transition guidance&lt;/a&gt; says some direct message-sending capabilities continue. The distinction is the important part: a transport can remain available while the registry and engagement features your application relied on are retired. A successful message to a manually supplied address does not test the workflow that finds the right recipient.&lt;/p&gt;

&lt;p&gt;Disclosure: This article was generated and fact-checked with AI using the public sources linked here. It was published through an automated workflow and has not been reviewed by Keith.&lt;/p&gt;

&lt;p&gt;AWS says SendMessages remains supported for channels available to the account. SMS, voice, and email sending continue for existing customers, while push, OTP, and phone-number validation have their own availability rules. By contrast, SendUsersMessages and sending to a stored endpoint ID are unsupported after the deadline. AWS explains that SendUsersMessages depends on the retired endpoint registry. Check the documented capability and account conditions rather than treating “Pinpoint” as one on-or-off switch.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://asaday.co/projects/smartvoicex" rel="noopener noreferrer"&gt;SmartVoiceX case study&lt;/a&gt; provides a useful application perspective. The built product connects calling workflows to booking, confirmation, follow-up, human transfer, and usable conversation records, with ongoing development. Its public description does not identify a Pinpoint dependency. The example below is a proposed migration exercise for that kind of connected workflow, not a report of a SmartVoiceX outage or AWS migration.&lt;/p&gt;

&lt;p&gt;A follow-up task might start with a contact reference from a conversation. Someone still has to resolve that reference to the intended destination, apply the workflow’s current preferences, prepare the message, and record its result. Replacing the sending adapter addresses only part of that sequence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test the contact reference before the transport
&lt;/h2&gt;

&lt;p&gt;Consider a fictional appointment confirmation in an isolated test system. The task stores a synthetic contact ID and appointment ID. A developer verifies the new adapter by sending a harmless message to a test address typed directly into the request. That establishes something useful about the adapter. It says nothing about whether the original task can still resolve its stored contact reference.&lt;/p&gt;

&lt;p&gt;Build a second test that begins at the real application boundary: the pending follow-up task. Let the application select the destination through the replacement data source. Inspect the selected contact, channel, and destination before allowing the test send. Use controlled test destinations throughout; a copied production contact list is unnecessary for this exercise.&lt;/p&gt;

&lt;p&gt;This separates two kinds of failure. The transport can reject a correctly prepared request, or the application can prepare the wrong request because identity mapping or selection changed. Record those outcomes separately so the operator knows whether to investigate the delivery integration or the workflow that fed it.&lt;/p&gt;

&lt;p&gt;Avoid filling a missing destination from whichever address happens to be nearby. Put the task into an explicit unresolved state with a reason the responsible person can inspect. A migration that turns an unknown mapping into a confident guess may appear to restore throughput while changing who receives the work.&lt;/p&gt;

&lt;p&gt;Contact data also includes preferences. &lt;a href="https://docs.aws.amazon.com/pinpoint/latest/archguide/customerdata.html" rel="noopener noreferrer"&gt;AWS’s resilient-architecture guidance&lt;/a&gt; describes customer information as contact details, opt-in and opt-out preferences, and whether a customer can receive messages. Although that page discusses synchronization across Regions, the useful migration question is similar: which of those facts did the new record actually preserve?&lt;/p&gt;

&lt;h2&gt;
  
  
  Rehearse the ordinary task and its exceptions
&lt;/h2&gt;

&lt;p&gt;Create synthetic fixtures for an unchanged address, a recently updated address, an unresolved contact, and a contact whose current preference prevents the proposed follow-up. Write the expected destination or no-send result beside each fixture. These are proposed engineering checks, not claims about a specific platform’s consent controls or legal compliance.&lt;/p&gt;

&lt;p&gt;Run the same application task against each fixture. The recently updated record should exercise the destination-selection rule the team intends to operate. The unresolved record should produce a visible exception. The no-send fixture should finish with the expected skipped outcome, without being counted as a delivery failure that an automated retry must repair.&lt;/p&gt;

&lt;p&gt;Then inspect the operator’s record. A task should distinguish destination resolution, a decision not to send, submission to the provider, and whatever later delivery evidence the integration supplies. Keep the explanation useful without copying full messages or contact details into every diagnostic entry.&lt;/p&gt;

&lt;p&gt;There is a tradeoff in where recipient selection lives. Moving it into the application gives the team direct ownership of mappings and exception behavior, but also creates work to maintain those rules. Using a replacement engagement platform can centralize more of that behavior, while introducing its own data model and operating requirements. Choose after tracing the actual task, not after comparing the names of send endpoints.&lt;/p&gt;

&lt;p&gt;AWS’s retirement is a timely example of why a messaging migration needs more than a successful test delivery. Keep that transport test. Add the task that starts with the application’s contact reference and ends with the intended outcome, including an intentional decision not to send. That is the difference between proving an adapter works and knowing the workflow still means the same thing.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>architecture</category>
      <category>testing</category>
    </item>
    <item>
      <title>Google Says Check Your Gmail Apps. Disconnecting Isn’t Deletion.</title>
      <dc:creator>Keith Azodeh</dc:creator>
      <pubDate>Sat, 31 Oct 2026 22:59:20 +0000</pubDate>
      <link>https://dev.to/keith_azodeh/google-says-check-your-gmail-apps-disconnecting-isnt-deletion-o5e</link>
      <guid>https://dev.to/keith_azodeh/google-says-check-your-gmail-apps-disconnecting-isnt-deletion-o5e</guid>
      <description>&lt;p&gt;&lt;a href="https://blog.google/innovation-and-ai/technology/safety-security/google-security-checkup/" rel="noopener noreferrer"&gt;Google’s October 30 Gmail security reminder&lt;/a&gt; asks users to review devices, remove old third-party app access, and confirm recovery information. For teams connecting inboxes to AI workflows, there is another question after the access review: what happened to the data already copied? Disconnecting a reader and deleting its stored information are separate operations.&lt;/p&gt;

&lt;p&gt;Disclosure: This article was generated and fact-checked with AI using the public sources linked here. It was published through an automated workflow and has not been reviewed by Keith.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://support.google.com/accounts/answer/14013600" rel="noopener noreferrer"&gt;Google’s linked-app guidance&lt;/a&gt; explains that an app can copy shared data to its own servers, and that retention depends on the app’s policy. Deletion may not be quick or automatic. Removing access is still useful. It just is not evidence that every previously imported message, attachment, or extracted record has disappeared.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://asaday.co/projects/tmc-price-intelligence" rel="noopener noreferrer"&gt;TMC Price Intelligence case study&lt;/a&gt; shows why this matters beyond the inbox. The delivered 2023–2025 engagement turned supplier communications and files into structured pricing information, a central repository, and operational reports, quotes, and invoice workflows. The public case study does not identify a Gmail connection or document its retention settings. It provides the workflow pattern for the discussion here, rather than evidence of a problem at TMC.&lt;/p&gt;

&lt;p&gt;Once an email becomes useful business data, “remove the integration” needs a more precise meaning. A copied price list, an extracted offer, and a quote that used the offer serve different purposes. Treating them as one undifferentiated cache makes both cleanup and continued operation harder to explain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Follow the copies, including the useful ones
&lt;/h2&gt;

&lt;p&gt;For a proposed supplier-email automation, begin with the source message and trace each stored representation. A worker might download an attachment, extract rows, place comparable offers in a database, and export a review report. Those are illustrative stages, not additional implementation claims about TMC.&lt;/p&gt;

&lt;p&gt;For each stage, record the storage location, responsible owner, purpose, and intended lifetime. Include temporary processing files and diagnostic output if the system creates them. A temporary directory that no job ever cleans is a storage decision, whether anyone meant it to be or not.&lt;/p&gt;

&lt;p&gt;Keep enough source linkage to identify which derived records belong to an import. An internal import identifier can connect a synthetic message, its attachment, and the resulting offer rows without reproducing the full message in every log. That linkage helps an operator inspect a cleanup request before acting on it.&lt;/p&gt;

&lt;p&gt;The difficult question is what to retain intentionally. A downloaded attachment may only be needed until extraction and review finish. A reviewed pricing record may support later comparisons. A completed business document may have a separate retention decision. Set those rules with the people responsible for the records and the applicable organizational requirements; do not infer them from an OAuth disconnect button.&lt;/p&gt;

&lt;p&gt;There is a tradeoff between retaining source evidence for correction and retaining unnecessary copies. Removing every source immediately can make an extraction dispute difficult to investigate. Keeping everything forever makes the archive grow beyond its stated purpose. Define the evidence needed for review, its access boundary, and its lifetime together.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test removal as a workflow
&lt;/h2&gt;

&lt;p&gt;Use an isolated test account and fictional supplier material. Import one harmless price list with a distinctive marker, let it produce a few synthetic records, and generate a test report. Record the expected locations before testing any cleanup feature. Do not use live supplier messages to discover where an experimental pipeline stores data.&lt;/p&gt;

&lt;p&gt;Then separate the checks. First, remove the test app’s account access using the appropriate control and confirm that the intended connection no longer retrieves new material. Google’s &lt;a href="https://support.google.com/accounts/answer/13533235" rel="noopener noreferrer"&gt;connection-management instructions&lt;/a&gt; distinguish app access to account data from Sign in with Google and other link types. Check the relevant connection instead of assuming every disconnect control does the same thing.&lt;/p&gt;

&lt;p&gt;Next, inspect the application’s existing copies. Run its documented cleanup process for the selected test import, if one exists. Check the attachment store, derived rows, and exported report separately. If the product has no cleanup feature, record that limitation and identify the responsible owner rather than marking the data deleted.&lt;/p&gt;

&lt;p&gt;Preserve the distinction between a deletion request, a completed application operation, and verification of the intended scope. A database row disappearing does not establish the state of a separately exported file. Backups and downstream systems also need an explicit answer in the operating procedure; an immediate search returning no result cannot establish every copy’s fate.&lt;/p&gt;

&lt;p&gt;None of this requires putting sensitive content into the cleanup log. Record identifiers, locations checked, outcomes, and unresolved exceptions. If a retained business record remains by design, name that category and its owner so the result is understandable.&lt;/p&gt;

&lt;p&gt;The industry consequence is mundane and important: inbox automation creates a data lifecycle that outlasts an access grant. Google’s reminder is a good reason to review old connections. For an AI workflow, finish the review with a map of what was copied, what was derived, and what the system can actually remove.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>privacy</category>
      <category>architecture</category>
    </item>
    <item>
      <title>GitHub Put Local Models in Copilot. Your Session Still Isn’t Offline.</title>
      <dc:creator>Keith Azodeh</dc:creator>
      <pubDate>Sat, 31 Oct 2026 18:03:07 +0000</pubDate>
      <link>https://dev.to/keith_azodeh/github-put-local-models-in-copilot-your-session-still-isnt-offline-44b0</link>
      <guid>https://dev.to/keith_azodeh/github-put-local-models-in-copilot-your-session-still-isnt-offline-44b0</guid>
      <description>&lt;p&gt;&lt;a href="https://github.blog/changelog/2026-10-28-github-copilot-fusion-now-supports-selection-of-local-models/" rel="noopener noreferrer"&gt;GitHub’s October 28 local-model announcement&lt;/a&gt; puts on-device models into Copilot Fusion’s opt-in experimental routing preview. The tempting shortcut is to read “local” as “offline.” GitHub explicitly says the session still uses cloud routing. Before approving a workflow on the strength of its model location, ask which parts of the request still leave the machine.&lt;/p&gt;

&lt;p&gt;Disclosure: This article was generated and fact-checked with AI using the public sources linked here. It was published through an automated workflow and has not been reviewed by Keith.&lt;/p&gt;

&lt;p&gt;The announcement covers supported local models in Copilot CLI, the Copilot app, and VS Code, with differences between managed Windows setup and manually configured providers. It also distinguishes directly selecting a local model from letting Fusion choose between local and cloud models. Those are useful capabilities, but they describe different operating arrangements. Neither label alone is a complete data-flow diagram.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://asaday.co/projects/illumia" rel="noopener noreferrer"&gt;Illumia archive case study&lt;/a&gt; makes that distinction concrete. The implemented application stores and searches service records locally in PostgreSQL. Its Claude Desktop connection exposes six bounded, read-only retrieval tools; selected evidence can go to online Claude when approved for the organization. The public description explicitly avoids calling the full AI workflow offline. Packaging and startup were tested with synthetic records, while actual-archive relevance and managed-device acceptance remain separate steps.&lt;/p&gt;

&lt;p&gt;That is a useful way to describe a hybrid system: say where the archive lives, what retrieval permits, and where selected evidence may go. Do not compress those decisions into a reassuring adjective.&lt;/p&gt;

&lt;h2&gt;
  
  
  Put routing on the diagram
&lt;/h2&gt;

&lt;p&gt;A local inference process answers one question: where does this model execute? An application can still contact another service to choose that model, retrieve context, run a tool, or complete a later turn. If the requirement concerns network access, draw those operations separately before comparing model quality.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.github.com/en/copilot/concepts/models/copilot-fusion" rel="noopener noreferrer"&gt;GitHub’s Fusion documentation&lt;/a&gt; describes runtime selection of models and execution patterns. It also says local-model selection is a preview capability associated with Fusion Standard. Choosing Fusion is choosing a routing system, rather than fixing one model for every request. Inspect the actual surface and configured mode; a model discovered in a picker is not automatically eligible for intelligent local routing.&lt;/p&gt;

&lt;p&gt;For a proposed archive assistant, write the intended boundary in terms someone can verify. “Search and display records locally” is one requirement. “Send only an approved selection to an online assistant” is another. “Finish the entire task without an external service” is a stronger requirement with a different acceptance test. These are proposed design criteria, not claims that Illumia has implemented additional modes.&lt;/p&gt;

&lt;p&gt;A request can violate the intended boundary before answer generation begins. That is why checking only the final model’s name is insufficient. At the same time, the existence of cloud routing does not establish exactly which record fields a product transmits. Determine that from the applicable product documentation, configuration, and observation. Do not fill the gap with an accusation or an assurance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rehearse the boundary with synthetic records
&lt;/h2&gt;

&lt;p&gt;Create a small disposable archive containing a fictional case and a distinctive, harmless work-note marker. Keep a second unrelated synthetic case outside the requested selection. Ask a narrow question whose answer requires the first note. This gives the team a repeatable input without using customer records as experimental traffic.&lt;/p&gt;

&lt;p&gt;With the intended configuration recorded, inspect the retrieval result before any online handoff. Check that the selected evidence is sufficient for the question and that unrelated records are absent. Then observe the request path using the test environment’s normal application and network diagnostics. Keep diagnostic records limited too; copying whole prompts into a separate log can create another unwanted destination.&lt;/p&gt;

&lt;p&gt;Next, make the external service unavailable in that disposable environment. Record what actually remains usable. Does local search still show the source? Does the assistant stop with an understandable message, or wait while the operator assumes work is continuing? If the task was specified as fully offline, an external routing dependency fails that requirement even when the eventual inference would have run on the device.&lt;/p&gt;

&lt;p&gt;This exercise does not prove every future request will take the same route. Repeat it after meaningful configuration or model changes, and cover the task variations the team expects to support. A connection log can reveal a dependency; it cannot, by itself, establish all the contents or contractual handling of a request. Pair observation with documentation instead of treating either as complete evidence.&lt;/p&gt;

&lt;p&gt;There is a practical tradeoff. Hybrid routing may make several model capabilities easier to use, while a deliberately isolated workflow requires the team to operate and validate more of the stack itself. Choose according to the task’s actual constraints. If approved online analysis is acceptable, describe the handoff clearly. If external contact is disallowed, make that a tested architectural condition.&lt;/p&gt;

&lt;p&gt;For an internal knowledge tool, the purchasing question is therefore more specific than “Does it support local AI?” Ask whether the exact search, routing, inference, and tool path meets the intended operating boundary. GitHub’s preview makes local compute more accessible. It also gives teams a timely reason to stop using “local” as the entire explanation.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>github</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Google’s A2UI Can Build a Form. Can You Finish It Without a Mouse?</title>
      <dc:creator>Keith Azodeh</dc:creator>
      <pubDate>Sat, 31 Oct 2026 13:10:18 +0000</pubDate>
      <link>https://dev.to/keith_azodeh/googles-a2ui-can-build-a-form-can-you-finish-it-without-a-mouse-35fo</link>
      <guid>https://dev.to/keith_azodeh/googles-a2ui-can-build-a-form-can-you-finish-it-without-a-mouse-35fo</guid>
      <description>&lt;p&gt;&lt;a href="https://developers.googleblog.com/build-generative-ui-apps-with-a2ui-copilotkit-agents/" rel="noopener noreferrer"&gt;Google’s October 29 A2UI and CopilotKit guide&lt;/a&gt; shows agents composing interfaces from an application’s component catalog and updating them as users act. That opens a useful product question: when a generated form changes, can a keyboard user keep their place? A screen can render valid data and still send someone back to the beginning halfway through a task.&lt;/p&gt;

&lt;p&gt;Disclosure: This article was generated and fact-checked with AI using the public sources linked here. It was published through an automated workflow and has not been reviewed by Keith.&lt;/p&gt;

&lt;p&gt;A2UI describes interface intent as data. In the guide’s declarative approach, the application renders components it already knows, while streamed messages and user actions support multi-step interaction. That gives frontend developers a valuable place to enforce consistent behavior: the components and renderer they control. It does not, by itself, demonstrate that a particular application is usable with a keyboard.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://asaday.co/projects/garden-church-platform" rel="noopener noreferrer"&gt;Garden platform case study&lt;/a&gt; provides a practical setting. Its staff workflows include follow-up ownership, due dates, and states, alongside people search and work management. The Planning Center replacement remains staged, with migration and staff acceptance still part of the work.&lt;/p&gt;

&lt;p&gt;Consider a proposed generative form for assigning a follow-up task using synthetic data. The operator chooses an owner, enters a due date, and saves. This is an illustrative extension, not a description of Garden using A2UI or a report of an accessibility defect in the existing platform. The test is whether an ordinary staff task remains operable while the interface updates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Treat the component catalog as an interaction contract
&lt;/h2&gt;

&lt;p&gt;A catalog entry should define more than the fields a model may supply. For each interactive component, document how a person reaches it, how its state is conveyed, and what happens to focus when it changes or disappears.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://www.w3.org/WAI/ARIA/apg/practices/keyboard-interface/" rel="noopener noreferrer"&gt;W3C ARIA Authoring Practices keyboard guide&lt;/a&gt; emphasizes visible, persistent, predictable focus. It also explains that ARIA does not supply keyboard behavior for custom widgets. Removing the focused element without a deliberate focus destination can leave focus on the document body, making the user lose their place.&lt;/p&gt;

&lt;p&gt;For the proposed task form, prefer familiar native controls where they meet the need. A custom owner picker still needs appropriate keyboard behavior; adding a role or drawing a selection highlight is not enough. The highlighted owner and the control holding keyboard focus are different pieces of state.&lt;/p&gt;

&lt;p&gt;Now imagine the agent adds an explanatory paragraph after the owner field. If the field still exists and serves the same purpose, that background update should not steal focus from someone entering the due date. The renderer should preserve the active control through the update where possible.&lt;/p&gt;

&lt;p&gt;If a step genuinely replaces the form, define the next focus destination deliberately. A new step heading or its first relevant control may be appropriate, depending on the interaction. The important point is that the application owns that decision. It should not depend on whichever node happens to survive a generated layout.&lt;/p&gt;

&lt;p&gt;Stable component identity can help a renderer preserve elements, but an identifier is not proof of correct behavior. Google’s guide describes re-emitting a flow against the same surfaceId. A stable surface reference and a stable keyboard experience are separate things to verify.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rehearse an update while someone is in the form
&lt;/h2&gt;

&lt;p&gt;Start the synthetic task with the mouse out of use. Navigate to the owner control, make a selection using its documented keys, and move into the due-date field. Confirm that the focus indicator is visible and that the control’s name and current value are understandable.&lt;/p&gt;

&lt;p&gt;While focus remains there, deliver a controlled interface update: add help text, refresh available choices, or replace the current step. Use a recorded update sequence so failures can be reproduced. A live model’s changing output would otherwise make it harder to isolate a renderer problem.&lt;/p&gt;

&lt;p&gt;After each update, check where focus actually landed and what the next Tab or Shift+Tab does. Continue to Save, trigger a validation error with an incomplete synthetic date, and verify that the user can find the problem and correct it. Then complete the task and inspect its saved result. These are proposed acceptance checks, not reported Garden test results.&lt;/p&gt;

&lt;p&gt;There is a tradeoff in when to apply generated changes. Rendering every small update immediately can make the interface responsive, but unnecessary rearrangement can interrupt navigation. Holding a nonessential update until the person finishes the current field may be calmer. Keep that policy explicit and avoid hiding important errors or blocking a necessary next step.&lt;/p&gt;

&lt;p&gt;Repeat the interaction with a screen reader on the browser and operating system the team supports. Keyboard testing and screen-reader testing answer related questions, but neither should be treated as a complete accessibility assessment on its own. Record the tested configuration and any remaining limitations.&lt;/p&gt;

&lt;p&gt;For staff software, the consequence is concrete: an operator should not need a mouse rescue every time an assistant improves the screen. Generative UI makes it easier to compose an interface for a request. A dependable renderer lets the person finish the request after that interface starts changing.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>a11y</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Google’s Shared AI Opt-Out Has a Catch: Your Old Rules Still Count.</title>
      <dc:creator>Keith Azodeh</dc:creator>
      <pubDate>Sat, 31 Oct 2026 06:14:46 +0000</pubDate>
      <link>https://dev.to/keith_azodeh/googles-shared-ai-opt-out-has-a-catch-your-old-rules-still-count-15lj</link>
      <guid>https://dev.to/keith_azodeh/googles-shared-ai-opt-out-has-a-catch-your-old-rules-still-count-15lj</guid>
      <description>&lt;p&gt;&lt;a href="https://developers.google.com/search/blog/2026/10/ai-training-control" rel="noopener noreferrer"&gt;Google announced plans on October 30&lt;/a&gt; to support a shared AI-training preference in robots.txt, targeting support in 2027. There is a consequential detail: Google plans to treat a shared training opt-out as a Google-Extended disallow only when Google-Extended is not explicitly specified. Existing company-specific controls will continue alongside it. Adding the new signal is not the same as replacing the policy already written in the file.&lt;/p&gt;

&lt;p&gt;Disclosure: This article was generated and fact-checked with AI using the public sources linked here. It was published through an automated workflow and has not been reviewed by Keith.&lt;/p&gt;

&lt;p&gt;For a business website, that distinction belongs in the implementation brief. “Keep our content out of training” and “help buyers find our capabilities” express different goals. A developer should turn those goals into documented choices before reducing them to a robots.txt edit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with what the public website is for
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://asaday.co/projects/tmc-produce" rel="noopener noreferrer"&gt;TMC Produce website project&lt;/a&gt; describes a B2B site organized around buyer questions: sourcing, quality control, freight support, documentation, and contact when timing matters. It presents business capabilities before a sales conversation starts.&lt;/p&gt;

&lt;p&gt;That provides a concrete setting for this discussion. It does not establish TMC’s current crawler rules or its preferred AI-training policy. Consider a hypothetical site with that same public-information purpose. Its owner might want buyers to find a logistics page while declining some uses of the page’s content for model training.&lt;/p&gt;

&lt;p&gt;The development question is then specific: which use is being declined, for which paths, and under which provider’s documented controls? “Block AI” leaves too much undecided. It could refer to training, using a page to inform a generated answer, or crawling traffic. Those choices should not be collapsed into one undocumented switch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check the rule that wins, not just the new line
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://datatracker.ietf.org/doc/draft-kelley-aipref-training-preference-signal/" rel="noopener noreferrer"&gt;October 30 Internet-Draft&lt;/a&gt; defines the policy token __usage_ai-training using ordinary robots.txt groups. It is an individual draft, not an endorsed IETF standard. Under the draft, a wildcard User-Agent group does not match that policy token, and the usage preference is distinct from crawler rules.&lt;/p&gt;

&lt;p&gt;That means a review needs to consider both explicit policy groups and existing crawler groups. Seeing a broad wildcard rule is not enough to conclude that the draft’s shared training preference has been expressed.&lt;/p&gt;

&lt;p&gt;Now consider a fictional configuration that adds a shared training disallow while retaining an explicit Google-Extended allowance. Under Google’s announced approach, do not assume the new shared entry reverses that company-specific choice. Decide whether the explicit allowance is intentional, then document the expected result. This is a proposed review example, not a description of TMC’s deployed configuration.&lt;/p&gt;

&lt;p&gt;An effective review note can be short: the owner’s desired use policy, the applicable path, the provider-specific exception, and the documentation date. A reviewer should be able to explain the resulting preference without guessing why a rule survived from an earlier release.&lt;/p&gt;

&lt;h2&gt;
  
  
  Training and answer visibility need separate decisions
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://blogs.bing.com/search/2026/10/your-content-your-choice-clearer-preferences-for-training-and-grounding/" rel="noopener noreferrer"&gt;Microsoft’s October 30 announcement&lt;/a&gt; makes the separation explicit in its own implementation. It describes independent training and grounding preferences, with grounding meaning use of content to inform generated responses. Microsoft says the new preferences will be honored as it crawls starting February 1, 2027. They do not change eligibility for traditional Bing search results, subject to normal crawl and indexing requirements.&lt;/p&gt;

&lt;p&gt;For the hypothetical logistics page, an owner could therefore have a reason to evaluate training and grounding separately. A public explanation may be useful as a cited source in an answer even when the owner does not want it used to train generative models. Another owner may choose differently.&lt;/p&gt;

&lt;p&gt;Do not carry one provider’s interpretation into another provider’s configuration by analogy. The shared training signal reduces repeated expression of a preference; provider-specific behavior and rollout dates still require attention. Eligibility also should not be reported as a promise of traffic or inclusion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make the handoff include a rollout date
&lt;/h2&gt;

&lt;p&gt;The useful deliverable is more than a text file. Keep an inventory of existing rules, the owner’s intended choices, the providers covered, and when each announced interpretation is expected to apply. Link the primary documentation beside each date so the next maintainer can recheck it.&lt;/p&gt;

&lt;p&gt;Distinguish a rule successfully served by the website from a provider’s adoption of that rule. An HTTP response can prove what the site published. It cannot prove that a planned 2027 implementation is already operating, or that every consumer will honor the preference.&lt;/p&gt;

&lt;p&gt;For a release, compare the previous and proposed configurations against representative public paths. Preserve search crawling where that is the agreed intent, check company-specific exceptions, and record any provider whose support is still pending. Retain the prior file so a mistaken edit can be corrected cleanly.&lt;/p&gt;

&lt;p&gt;A shared signal can make policy maintenance simpler. The business still needs to choose what it means to allow or decline, and the developer still needs to know which rule applies. That is how a small robots.txt change becomes an understandable handoff instead of a confident promise the implementation cannot yet support.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>seo</category>
    </item>
  </channel>
</rss>
