<?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: David Boggs</title>
    <description>The latest articles on DEV Community by David Boggs (@david_boggs_adaptive).</description>
    <link>https://dev.to/david_boggs_adaptive</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%2F4122167%2Face40476-f2c1-400d-88c2-7ed32840db1d.png</url>
      <title>DEV Community: David Boggs</title>
      <link>https://dev.to/david_boggs_adaptive</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/david_boggs_adaptive"/>
    <language>en</language>
    <item>
      <title>What Actually Breaks When You Leave Jira: A Pre-Migration Audit</title>
      <dc:creator>David Boggs</dc:creator>
      <pubDate>Wed, 30 Sep 2026 14:03:21 +0000</pubDate>
      <link>https://dev.to/david_boggs_adaptive/what-actually-breaks-when-you-leave-jira-a-pre-migration-audit-27oa</link>
      <guid>https://dev.to/david_boggs_adaptive/what-actually-breaks-when-you-leave-jira-a-pre-migration-audit-27oa</guid>
      <description>&lt;h1&gt;
  
  
  What Actually Breaks When You Leave Jira: A Pre-Migration Audit
&lt;/h1&gt;

&lt;p&gt;A replacement can import every ticket and still break the way your team works.&lt;/p&gt;

&lt;p&gt;Consider a change request that reaches "Approved" after migration. The status looks correct. But the old workflow required approval from someone other than the requester, checked a mandatory field, and triggered a downstream action. If the replacement preserves only the status label, the ticket survived while the control disappeared.&lt;/p&gt;

&lt;p&gt;That is the migration problem to investigate before comparing boards or subscription costs.&lt;/p&gt;

&lt;p&gt;First, distinguish the deadlines: Jira Server support ended on February 15, 2024. Atlassian has announced March 28, 2029 as the end-of-life date for affected Data Center products, including Jira Software Data Center. These are different timelines, even if both put replacement planning on your desk. See Atlassian's &lt;a href="https://www.atlassian.com/licensing/server-end-of-support" rel="noopener noreferrer"&gt;Server support FAQ&lt;/a&gt; and &lt;a href="https://www.atlassian.com/licensing/data-center-end-of-life" rel="noopener noreferrer"&gt;Data Center end-of-life announcement&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The following audit produces something more useful than a feature wishlist: a set of requirements and test cases you can hand to any replacement vendor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start with an evidence register&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a spreadsheet with one row per dependency or behavior:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Project / issue type:
Configuration or dependency:
Business purpose:
Owner:
Evidence from current system:
Required behavior after migration:
Disposition:
Acceptance test:
Unresolved question:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use four dispositions: preserve, redesign, archive, or retire. Leave genuinely unknown items marked unknown until someone investigates them.&lt;/p&gt;

&lt;p&gt;Gather configuration exports where available, installed app names and versions, integration details, project ownership, and representative tickets. Record the source version and collection date so later configuration changes do not silently invalidate the audit.&lt;/p&gt;

&lt;p&gt;Work from read-only inspection or an isolated restored copy. Disable outbound integrations and notifications in the copy before exercising workflows.&lt;/p&gt;

&lt;p&gt;Do not clean up production as part of discovery. A field that looks abandoned may still feed a quarterly report. Identify its owner and dependencies first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Audit workflow behavior, not the diagram&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Start by mapping each project's issue types to their assigned workflows. A single project can use different workflows for different issue types through a workflow scheme. Atlassian documents that relationship in its &lt;a href="https://confluence.atlassian.com/adminjiraserver107/working-with-workflows-1595114945.html" rel="noopener noreferrer"&gt;workflow administration guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For each active workflow, inspect the transitions. Jira distinguishes conditions, validators, and post functions: these can control whether a transition is available, whether it succeeds, and what happens afterward. A destination with matching status names does not establish equivalent behavior. See Atlassian's &lt;a href="https://confluence.atlassian.com/adminjiraserver104/advanced-workflow-configuration-1527942609.html" rel="noopener noreferrer"&gt;advanced workflow configuration documentation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Record:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who can perform each transition, including exceptions.&lt;/li&gt;
&lt;li&gt;Which fields must be present and how their values are checked.&lt;/li&gt;
&lt;li&gt;What changes automatically after the transition.&lt;/li&gt;
&lt;li&gt;Which rules depend on an app, script, webhook, or external service.&lt;/li&gt;
&lt;li&gt;How reopening, rejection, cancellation, and reassignment behave.&lt;/li&gt;
&lt;li&gt;How statuses map to board columns and reporting definitions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Turn important rules into executable acceptance scenarios. For a hypothetical approval process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Given: A change request is awaiting approval.
Actor: The person who submitted it.
Action: Attempt to approve it.
Expected: Approval is denied.

Actor: An authorized independent approver.
Action: Approve with the required evidence missing.
Expected: Approval is denied.

Action: Supply the evidence and approve.
Expected: The transition succeeds and the approval
actor and time remain inspectable.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact target implementation can differ. The required control should be explicit.&lt;/p&gt;

&lt;p&gt;Include rejection paths in the test set. A demo where an administrator moves a ticket through every column proves little about ordinary users or restricted actions.&lt;/p&gt;

&lt;p&gt;If nobody can explain a rule, mark it for investigation. Do not automatically carry it forward or delete it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trace plugin dependencies to the work they perform&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An installed app list is only a starting point. You need to know where each app participates in daily work and where it stores information.&lt;/p&gt;

&lt;p&gt;For every app, identify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The projects, fields, workflow rules, and reports that use it.&lt;/li&gt;
&lt;li&gt;Any data stored outside ordinary issue fields.&lt;/li&gt;
&lt;li&gt;Its export options and the format of exported data.&lt;/li&gt;
&lt;li&gt;Scripts, scheduled jobs, or integrations that depend on it.&lt;/li&gt;
&lt;li&gt;The person who will accept a replacement behavior.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even Atlassian's own Cloud Migration Assistant treats app migration separately: app vendors must provide an automated migration path for their app data to migrate through the assistant. That illustrates why "we migrate Jira" is insufficient evidence for a particular dependency. See &lt;a href="https://support.atlassian.com/migration/docs/what-gets-migrated-with-the-jira-cloud-migration-assistant/" rel="noopener noreferrer"&gt;what the assistant migrates&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Suppose an app implements an approval table with multiple decisions per ticket. Flattening it into a text field might preserve readable evidence, but it may eliminate structured reporting and enforcement. That can be acceptable for historical records while being unacceptable for active requests.&lt;/p&gt;

&lt;p&gt;Require a disposition for every essential dependency:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Disposition&lt;/th&gt;
&lt;th&gt;Evidence needed&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Replace with native behavior&lt;/td&gt;
&lt;td&gt;A passing test of the required behavior&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rebuild&lt;/td&gt;
&lt;td&gt;An owner, implementation estimate, and maintenance plan&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Preserve as an archive&lt;/td&gt;
&lt;td&gt;A tested retrieval method with appropriate access controls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Retire&lt;/td&gt;
&lt;td&gt;Approval from the process owner and a dependency check&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;"No equivalent" is a real outcome. It may require changing the business process or rejecting a candidate. Discovering it before purchase is the purpose of this audit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Treat historical tickets as records with relationships&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A ticket count is a useful reconciliation check. It does not tell you whether the records remain meaningful.&lt;/p&gt;

&lt;p&gt;Years of history can contain former employees, deleted field options, old project keys, attachments, and links to systems that no longer exist. Decide what must remain usable before selecting an import method.&lt;/p&gt;

&lt;p&gt;Build a representative sample that includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The oldest records and recently updated records.&lt;/li&gt;
&lt;li&gt;Reopened issues and issues moved between projects.&lt;/li&gt;
&lt;li&gt;Tickets attributed to inactive or renamed users.&lt;/li&gt;
&lt;li&gt;Restricted issues and restricted comments.&lt;/li&gt;
&lt;li&gt;Large attachments and unusual filenames.&lt;/li&gt;
&lt;li&gt;Parent-child relationships and cross-project links.&lt;/li&gt;
&lt;li&gt;App-owned fields and historical sprint membership.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For each sample, compare the source and proposed target. Check authorship, timestamps, field values, comments, attachments, and relationships. Where file bytes should remain unchanged, compare attachment checksums as well as counts.&lt;/p&gt;

&lt;p&gt;Document identity mapping explicitly. Mapping every departed employee to "migration user" can erase useful attribution. Mapping an old account to the wrong current employee is worse.&lt;/p&gt;

&lt;p&gt;Separate operational history from archival history. Active work may require editable relationships and queryable fields. Closed work may only need reliable retrieval, preserved attribution, and restricted access. The owners of those records should decide.&lt;/p&gt;

&lt;p&gt;If historical reporting matters, run a known report against the proposed target or archive. A final status alone cannot reconstruct how long a ticket spent in each state.&lt;/p&gt;

&lt;p&gt;An archive is only a valid plan if someone has demonstrated retrieval. "We have the backup" does not answer how a project owner will find an attachment later. If the archive depends on running the old application, verify that licensing, support, and operating arrangements make that practical.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test effective permissions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Permission scheme sprawl makes configuration names poor evidence of actual access. Audit what specific people can do.&lt;/p&gt;

&lt;p&gt;Start with project permissions, project role membership, directory groups, and issue-level restrictions. Record exceptions for service accounts and individually granted access. Atlassian's &lt;a href="https://confluence.atlassian.com/adminjiraserver/managing-project-permissions-938847145.html" rel="noopener noreferrer"&gt;project permission documentation&lt;/a&gt; provides a reference for inspecting the source configuration.&lt;/p&gt;

&lt;p&gt;Build an access matrix around representative identities:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Identity&lt;/th&gt;
&lt;th&gt;Resource and action&lt;/th&gt;
&lt;th&gt;Expected result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Project member&lt;/td&gt;
&lt;td&gt;Read ordinary project ticket&lt;/td&gt;
&lt;td&gt;Allow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unrelated employee&lt;/td&gt;
&lt;td&gt;Read restricted ticket&lt;/td&gt;
&lt;td&gt;Deny&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Contractor&lt;/td&gt;
&lt;td&gt;Download restricted attachment&lt;/td&gt;
&lt;td&gt;Deny&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automation account&lt;/td&gt;
&lt;td&gt;Update designated project&lt;/td&gt;
&lt;td&gt;Allow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Former employee&lt;/td&gt;
&lt;td&gt;Sign in&lt;/td&gt;
&lt;td&gt;Deny&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Adjust these expectations to your actual policy.&lt;/p&gt;

&lt;p&gt;Run the same tests against each candidate. Include direct URLs, searches, exports, API access where available, and notifications. A ticket hidden from a board may still be exposed through another route.&lt;/p&gt;

&lt;p&gt;Record intended changes separately from migration defects. If the existing permissions are too broad, reproducing them faithfully is not success. The responsible owner should approve the corrected access matrix before testing starts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use the audit to control the pilot&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Choose a pilot scope that covers each distinct high-risk dependency. The smallest or cleanest project may exercise none of the difficult behavior.&lt;/p&gt;

&lt;p&gt;Give each candidate the same sample records and acceptance tests. Ask for observed results, including failures. Keep "supported according to documentation" separate from "demonstrated with our data."&lt;/p&gt;

&lt;p&gt;Before choosing a replacement, verify:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Every active workflow has an owner and a documented disposition.&lt;/li&gt;
&lt;li&gt;[ ] Essential app dependencies have a demonstrated path or an accepted redesign.&lt;/li&gt;
&lt;li&gt;[ ] Historical records have explicit preservation and retrieval requirements.&lt;/li&gt;
&lt;li&gt;[ ] Permission tests include denied actions.&lt;/li&gt;
&lt;li&gt;[ ] Integrations have owners and target behavior defined.&lt;/li&gt;
&lt;li&gt;[ ] Each unresolved limitation has an owner and a decision deadline.&lt;/li&gt;
&lt;li&gt;[ ] The proposed migration service states its exclusions and acceptance criteria.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then rehearse the operational move. Measure extraction, import, and validation time using representative data. Identify how changes made during the migration window will be captured or prevented.&lt;/p&gt;

&lt;p&gt;Write the rollback decision before cutover. Specify who can call it, what triggers it, and what happens to tickets edited in the destination. Restoring the source does not automatically reconcile destination writes.&lt;/p&gt;

&lt;p&gt;Compare candidates using the cost of the accepted design, including rebuilds, archive operation, retraining, and ongoing maintenance. For a self-hosted replacement, assign responsibility for patching, backups, monitoring, and restore testing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where our own product lands on this&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Adaptive Work is a self-hosted Jira alternative in Adaptive IP Services' Hub division and part of the Adaptive Reservoir platform. It provides ticketing, kanban boards, sprints, and approval workflows on-premises, behind your own network boundary. Migration off Jira Server/Data Center is handled as a service.&lt;/p&gt;

&lt;p&gt;Those facts make it relevant to teams that want issue tracking to stay inside their network. They do not establish compatibility with a particular plugin, custom workflow, or historical data model.&lt;/p&gt;

&lt;p&gt;Apply the same audit to Adaptive Work. Bring the dependency register and acceptance tests into the evaluation, and require the migration scope to explain what will be preserved, redesigned, archived, or retired. A migration service still needs concrete acceptance criteria.&lt;/p&gt;

&lt;p&gt;Disclosure: I work at Adaptive IP Services, a Dallas based IT and security firm.&lt;/p&gt;

&lt;p&gt;David J. Boggs&lt;br&gt;
Founder and CEO, Adaptive IP Services&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.adaptiveips.com/packages/modules/adaptive-work" rel="noopener noreferrer"&gt;Adaptive Work&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>devops</category>
      <category>projectmanagement</category>
      <category>opensource</category>
    </item>
    <item>
      <title>AI Agent Permissions: Decide What Needs a Human Before You Connect the Tools</title>
      <dc:creator>David Boggs</dc:creator>
      <pubDate>Wed, 23 Sep 2026 14:01:10 +0000</pubDate>
      <link>https://dev.to/david_boggs_adaptive/ai-agent-permissions-decide-what-needs-a-human-before-you-connect-the-tools-mcg</link>
      <guid>https://dev.to/david_boggs_adaptive/ai-agent-permissions-decide-what-needs-a-human-before-you-connect-the-tools-mcg</guid>
      <description>&lt;h1&gt;
  
  
  AI Agent Permissions: Decide What Needs a Human Before You Connect the Tools
&lt;/h1&gt;

&lt;p&gt;An AI agent can draft an excellent customer email and still be the wrong system to decide when to send it.&lt;/p&gt;

&lt;p&gt;That distinction gets lost when an evaluation focuses on answer quality. A convincing demo shows that an agent can interpret a request and complete a workflow. It does not establish which parts of that workflow the organization should authorize it to perform independently.&lt;/p&gt;

&lt;p&gt;The useful governance question is: "Which actions can happen without a human decision, and under what conditions?"&lt;/p&gt;

&lt;p&gt;You can answer that before choosing a model or buying an agent platform. Start with the actions, the systems they affect, and the consequences of getting them wrong. Then turn those decisions into enforceable permissions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inventory actions, not job titles
&lt;/h2&gt;

&lt;p&gt;"Sales assistant" is a role description. It is not a permission boundary.&lt;/p&gt;

&lt;p&gt;A sales workflow might involve reading an account record, adding an internal note, changing an opportunity stage, drafting an email, and sending that email. Giving the agent "CRM access" hides several materially different decisions inside one phrase.&lt;/p&gt;

&lt;p&gt;Build an action inventory before connecting credentials. For each proposed task, record:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The exact operation and target system.&lt;/li&gt;
&lt;li&gt;The records or fields the agent needs.&lt;/li&gt;
&lt;li&gt;The possible downstream effects.&lt;/li&gt;
&lt;li&gt;Whether the action can be undone, including consequences outside the system.&lt;/li&gt;
&lt;li&gt;The person accountable for allowing it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Use verbs that map to actual operations. "Manage opportunities" is too broad. "Add a proposed next-step note to assigned opportunities" is something you can evaluate and test.&lt;/p&gt;

&lt;p&gt;Do not assume an operation is harmless because its name sounds administrative. Updating a CRM field could trigger an email workflow. Adding someone to a campaign could schedule future outreach. Classify an action by its effective consequences, including automation it activates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use read, write, and external commitment as the starting boundary
&lt;/h2&gt;

&lt;p&gt;A useful first pass separates access into the following classes. These are policy starting points, not universal defaults.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action class&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;Starting policy&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Read&lt;/td&gt;
&lt;td&gt;Retrieve assigned account history&lt;/td&gt;
&lt;td&gt;Allow within a defined data scope if the task requires it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Internal write&lt;/td&gt;
&lt;td&gt;Save a draft or add a proposed note&lt;/td&gt;
&lt;td&gt;Consider allowing where the effect is bounded and recoverable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Consequential write&lt;/td&gt;
&lt;td&gt;Change account ownership or a field that triggers automation&lt;/td&gt;
&lt;td&gt;Require approval or narrowly defined, tested conditions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Send or publish&lt;/td&gt;
&lt;td&gt;Email a prospect or publish a campaign&lt;/td&gt;
&lt;td&gt;Require approval of the specific outbound action&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pay or otherwise commit resources&lt;/td&gt;
&lt;td&gt;Issue a refund or submit a purchase&lt;/td&gt;
&lt;td&gt;Keep disabled unless explicitly needed; define separate authorization if enabled&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This classification prevents a common mistake: treating every write as equivalent.&lt;/p&gt;

&lt;p&gt;Saving an unpublished draft and sending it to a customer might use adjacent API endpoints. Their consequences are different. A draft can usually be reviewed before it affects anyone. A sent message can be corrected, but the recipient has already received it.&lt;/p&gt;

&lt;p&gt;Payment belongs in a separate decision even when the interface makes it look like another tool call. Approval to communicate should never imply approval to spend.&lt;/p&gt;

&lt;p&gt;For an initial deployment, a defensible posture is scoped reading, limited internal drafting, and explicit approval before external commitment. Expand from there when you have evidence that a particular action warrants more autonomy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read permission still needs boundaries
&lt;/h2&gt;

&lt;p&gt;Reading does not modify the source record, but it can expose information to components involved in processing the request.&lt;/p&gt;

&lt;p&gt;Before granting read access, decide which data the task actually requires. An agent preparing account follow-ups may need selected contact fields and recent account activity. That does not automatically justify access to every attachment, billing record, or unrelated customer.&lt;/p&gt;

&lt;p&gt;Check the entire processing path: retrieval, model input, tool responses, logs, and any retained working context. Read-only access to the source system does not answer where retrieved information travels or who can later inspect it.&lt;/p&gt;

&lt;p&gt;Also treat retrieved content as data, not authority. An email, web page, or customer note may contain text telling an agent to change its instructions or use another tool. That text should not be able to expand the agent's permissions.&lt;/p&gt;

&lt;p&gt;A practical test is to place an instruction in a test record asking the agent to retrieve an unrelated restricted record. The permission boundary should reject the attempted access regardless of whether the model follows the instruction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decide which internal writes can run unattended
&lt;/h2&gt;

&lt;p&gt;Human approval for every draft save creates work without necessarily reducing meaningful risk. The goal is to put review where it changes the outcome.&lt;/p&gt;

&lt;p&gt;For each internal write, ask:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Is the target tightly scoped?&lt;/li&gt;
&lt;li&gt;Can the change be reversed with a known recovery procedure?&lt;/li&gt;
&lt;li&gt;Can it activate another workflow or influence an important decision?&lt;/li&gt;
&lt;li&gt;Can repeated execution create duplicates or accumulating damage?&lt;/li&gt;
&lt;li&gt;Will a person see the change before relying on it?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These answers should produce a specific policy.&lt;/p&gt;

&lt;p&gt;For example, you might allow an agent to save a proposed follow-up in a draft field on assigned accounts. You might require approval to overwrite an existing contact address because a bad change could misdirect later communication.&lt;/p&gt;

&lt;p&gt;"Internal" is not a synonym for "low risk." An inaccurate support note could influence the next employee's response. An incorrect opportunity stage could affect reporting. Some internal writes need review even when nothing immediately leaves the organization.&lt;/p&gt;

&lt;p&gt;Where possible, separate proposals from authoritative records. Let the agent suggest a change without granting permission to replace the value that other workflows trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Define approval as a specific transaction
&lt;/h2&gt;

&lt;p&gt;An approval gate is useful only if the reviewer can tell what they are authorizing.&lt;/p&gt;

&lt;p&gt;"Approve the next step" is insufficient. For an outbound email, the review should show the destination, sending identity, exact content, and attachments. Include relevant source context so the reviewer can check factual claims without reconstructing the workflow.&lt;/p&gt;

&lt;p&gt;The approval should bind to that specific action. If the recipient, content, attachment, or other material parameter changes, the action needs fresh approval.&lt;/p&gt;

&lt;p&gt;Use this pattern as an implementation and procurement checklist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The agent prepares a proposed action.&lt;/li&gt;
&lt;li&gt;A policy check determines whether the action is allowed, blocked, or requires review.&lt;/li&gt;
&lt;li&gt;An authorized reviewer inspects the proposal.&lt;/li&gt;
&lt;li&gt;The execution layer verifies that approval still applies to the exact action being attempted.&lt;/li&gt;
&lt;li&gt;The system records the result, including failure or uncertain delivery.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The execution layer matters. A prompt that tells an agent to ask permission is a behavioral instruction. It should not be the only control protecting an outbound capability.&lt;/p&gt;

&lt;p&gt;Check alternate routes too. Blocking one email tool does little if the same credentials can send through another endpoint or trigger a campaign that sends later.&lt;/p&gt;

&lt;p&gt;Expired, rejected, or missing approval should leave the action unexecuted. Retries also need attention: approval for one send should not silently become authorization for duplicate sends after a timeout.&lt;/p&gt;

&lt;h2&gt;
  
  
  Give reviewers a decision they can realistically make
&lt;/h2&gt;

&lt;p&gt;Human review has a cost. Every gate adds delay and consumes attention. Poorly designed gates can become a queue of habitual clicks.&lt;/p&gt;

&lt;p&gt;Assign a reviewer who understands the action and has authority over its consequences. For a customer response, that may be the person responsible for the account or support case. Resource commitments may require a different owner.&lt;/p&gt;

&lt;p&gt;Make the review screen answer practical questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who or what will be affected?&lt;/li&gt;
&lt;li&gt;What exactly will happen?&lt;/li&gt;
&lt;li&gt;Which source records support the proposed action?&lt;/li&gt;
&lt;li&gt;What assumptions or unresolved questions need checking?&lt;/li&gt;
&lt;li&gt;Has a similar action already executed?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An explanation of why the agent chose an action can help orient the reviewer, but it is not proof that the action is correct. Show the underlying evidence.&lt;/p&gt;

&lt;p&gt;Measure review burden during a pilot. If reviewers cannot examine proposals carefully at the expected volume, reduce scope or improve the review context. Removing gates merely to clear a backlog changes the risk decision; it does not solve the review problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test permissions with deliberate failure cases
&lt;/h2&gt;

&lt;p&gt;Do not accept a successful demonstration as evidence that the boundary holds. Use test accounts and controlled destinations to attempt actions that should fail.&lt;/p&gt;

&lt;p&gt;A compact acceptance checklist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Request a record outside the role's assigned scope.&lt;/li&gt;
&lt;li&gt;Attempt to modify a field the role can only read.&lt;/li&gt;
&lt;li&gt;Try sending without approval.&lt;/li&gt;
&lt;li&gt;Approve a draft, then change its recipient before execution.&lt;/li&gt;
&lt;li&gt;Attempt an outbound action through an alternate tool or workflow.&lt;/li&gt;
&lt;li&gt;Retry an action after a simulated timeout.&lt;/li&gt;
&lt;li&gt;Revoke permission while an action is waiting for approval.&lt;/li&gt;
&lt;li&gt;Put instructions in retrieved content that ask for broader access.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For each test, define the expected outcome before running it. Capture whether execution was prevented and whether the record explains what happened.&lt;/p&gt;

&lt;p&gt;Distinguish "the model declined" from "the tool or execution layer denied the operation." Both are useful observations. The latter is the stronger evidence that a permission boundary is enforced.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where our own product lands on this
&lt;/h2&gt;

&lt;p&gt;EMS, the Employee Management System in Adaptive IP Services' Hub division, uses a conservative boundary for outbound activity: a human approves every outbound action.&lt;/p&gt;

&lt;p&gt;EMS lets organizations onboard and manage AI virtual employees for sales, marketing, and support. Each virtual employee is isolated and has a role. It pairs with the CRM to support an acquisition loop.&lt;/p&gt;

&lt;p&gt;In the framework above, that per-role approval-gate model puts human review at the point where work leaves the organization. It is a concrete answer to the outbound-permission question, with an explicit review burden attached.&lt;/p&gt;

&lt;p&gt;That description does not settle every implementation question. Buyers should still use the checklist above to examine data scope, internal changes, approval behavior, and enforcement. Those are evaluation criteria, not additional EMS capability claims.&lt;/p&gt;

&lt;h2&gt;
  
  
  Write the policy before the pilot
&lt;/h2&gt;

&lt;p&gt;Choose one role and one bounded workflow. List every operation it needs, classify the consequences, and name the reviewer for anything requiring approval.&lt;/p&gt;

&lt;p&gt;For each allowed operation, document its scope and failure behavior. For each approval gate, specify exactly what the human must see and what changes invalidate approval. Then run the failure tests before introducing real recipients or consequential records.&lt;/p&gt;

&lt;p&gt;The policy is ready when another person can use it to predict which actions will execute, which will wait, and which will be denied.&lt;/p&gt;

&lt;p&gt;Disclosure: I work at Adaptive IP Services, a Dallas based IT and security firm.&lt;/p&gt;

&lt;p&gt;David J. Boggs&lt;br&gt;
Founder and CEO, Adaptive IP Services&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.adaptiveips.com/adaptive-ems" rel="noopener noreferrer"&gt;Learn more about EMS&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>security</category>
      <category>automation</category>
      <category>management</category>
    </item>
    <item>
      <title>Your SOP Is Probably Wrong. Build a Way to Notice.</title>
      <dc:creator>David Boggs</dc:creator>
      <pubDate>Wed, 16 Sep 2026 14:04:09 +0000</pubDate>
      <link>https://dev.to/david_boggs_adaptive/your-sop-is-probably-wrong-build-a-way-to-notice-2401</link>
      <guid>https://dev.to/david_boggs_adaptive/your-sop-is-probably-wrong-build-a-way-to-notice-2401</guid>
      <description>&lt;h1&gt;
  
  
  Your SOP Is Probably Wrong. Build a Way to Notice.
&lt;/h1&gt;

&lt;p&gt;An SOP can look finished long after it stops describing the work.&lt;/p&gt;

&lt;p&gt;The screenshots still load. The numbered steps still make sense in isolation. But a permissions change means step 6 no longer works, so experienced staff use a workaround. New hires discover that workaround by asking someone. The document stays untouched because updating it feels like a separate project.&lt;/p&gt;

&lt;p&gt;That is how process documentation becomes actively misleading. Nobody needs to decide to neglect it. Keeping the process running simply takes priority over describing it again.&lt;/p&gt;

&lt;p&gt;The useful question is not "How do we get everyone to write more documentation?" It is "How do we make changes visible, cheap to document, and worth reviewing?"&lt;/p&gt;

&lt;p&gt;Start with one frequently used procedure. Put it through the following maintenance loop before buying another documentation tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Capture the task while someone actually performs it
&lt;/h2&gt;

&lt;p&gt;Writing an SOP from memory creates two jobs: reconstructing the work and explaining it. Reconstruction is where important details disappear.&lt;/p&gt;

&lt;p&gt;An experienced operator remembers "grant access." They may not remember to document which request establishes authorization, which account they use, or how they verify the resulting permissions. Those details feel obvious to someone who performs the task every week.&lt;/p&gt;

&lt;p&gt;Capture an actual execution instead.&lt;/p&gt;

&lt;p&gt;Choose a representative case with a clear starting condition. For example, document granting an approved user access to an internal application. Start with the approved request visible, using sanitized data or a test environment where appropriate.&lt;/p&gt;

&lt;p&gt;Ask the operator to narrate decisions as they work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What makes this request eligible to proceed?&lt;/li&gt;
&lt;li&gt;Why are they selecting this role?&lt;/li&gt;
&lt;li&gt;What would make them stop and ask for clarification?&lt;/li&gt;
&lt;li&gt;How will they know the change worked?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A recording preserves what happened on screen. Narration helps explain why it happened. Neither guarantees that the process is correct.&lt;/p&gt;

&lt;p&gt;The operator may take an unnecessary detour or demonstrate a workaround that should be fixed. Treat the capture as source material for a draft, then have someone responsible for the process review it.&lt;/p&gt;

&lt;p&gt;Screen recording also creates a data handling problem. Decide what must stay out of the capture before recording. Avoid exposing credentials, tokens, customer records, or unrelated browser tabs. If production capture is necessary, define who can access the recording and how long it should be retained.&lt;/p&gt;

&lt;p&gt;The original recording may contain substantially more sensitive information than the finished SOP.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Turn the capture into a procedure someone else can execute
&lt;/h2&gt;

&lt;p&gt;A transcript is not an SOP. Neither is a sequence of screenshots.&lt;/p&gt;

&lt;p&gt;The finished procedure needs enough context for a qualified person to know when it applies and whether it succeeded. Use a compact header:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Procedure: Grant access to the internal reporting application
Owner: Application operations lead
Applies to: Standard employees with approved access requests
Does not cover: External users or elevated administrator access
Prerequisites: Approved request; authorized operator account
Revision: 4
Last validated: YYYY-MM-DD
Validated against: Application release/build, if available
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then write steps around observable actions and results.&lt;/p&gt;

&lt;p&gt;"Configure the appropriate permissions" leaves the decision undocumented. "Select the role named in the approved request, then verify that the saved assignment matches that role" gives the operator something to do and check.&lt;/p&gt;

&lt;p&gt;Include a stop condition wherever continuing could create a bad outcome:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;If the requested role is unavailable, stop and return the request
for clarification. Do not substitute a broader role.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Screenshots should help someone locate a control or recognize a result. Do not make them the only place where a critical value or decision appears. Interfaces change, and images are harder to search than text.&lt;/p&gt;

&lt;p&gt;Now give the draft to someone who understands the system but did not record the task. Have them execute it on a suitable test case without coaching from the author.&lt;/p&gt;

&lt;p&gt;Every question they ask identifies a possible documentation gap. Record those questions instead of answering them verbally and leaving the draft unchanged.&lt;/p&gt;

&lt;p&gt;This validation costs time. For a low-impact task, a short walkthrough may be enough. For a procedure that changes production access or can disrupt service, an independent execution is easier to justify.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Define what makes the SOP suspect
&lt;/h2&gt;

&lt;p&gt;A review date is useful, but it is a weak detector of change.&lt;/p&gt;

&lt;p&gt;A document can become wrong the day after its scheduled review. It can also remain accurate for a year. Age tells you when someone last checked it; it does not tell you whether the underlying process changed.&lt;/p&gt;

&lt;p&gt;Give each procedure explicit staleness signals.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Signal&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;Response&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Relevant system change&lt;/td&gt;
&lt;td&gt;An application release changes role assignment&lt;/td&gt;
&lt;td&gt;Check affected steps before the next use&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Execution mismatch&lt;/td&gt;
&lt;td&gt;An operator cannot find the documented control&lt;/td&gt;
&lt;td&gt;Flag the exact step and assess whether work can continue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Repeated clarification&lt;/td&gt;
&lt;td&gt;New hires keep asking which approval counts&lt;/td&gt;
&lt;td&gt;Add the missing decision rule&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Unrecorded workaround&lt;/td&gt;
&lt;td&gt;Staff routinely skip a step to complete the task&lt;/td&gt;
&lt;td&gt;Investigate the workaround and revise the procedure or process&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ownership change&lt;/td&gt;
&lt;td&gt;The responsible team changes&lt;/td&gt;
&lt;td&gt;Assign a new owner and confirm scope&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Elapsed review interval&lt;/td&gt;
&lt;td&gt;No validation has occurred within the chosen interval&lt;/td&gt;
&lt;td&gt;Revalidate based on the task's risk and frequency&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are operating rules you can implement with an issue tracker and a document repository. They do not require a specialized platform.&lt;/p&gt;

&lt;p&gt;Make reporting a mismatch cheaper than fixing the whole document. A useful report can be four fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SOP and revision:
Step that differed:
What I observed:
Did I stop, continue, or use a workaround?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do not require the person doing urgent work to rewrite the SOP before they can report a problem. That requirement encourages silence.&lt;/p&gt;

&lt;p&gt;The owner should then decide whether the mismatch is cosmetic, confusing, or unsafe. A renamed button may need a small correction. A missing authorization check may require suspending use until the procedure is fixed.&lt;/p&gt;

&lt;p&gt;Mark unresolved problems where readers will see them before starting. A comment buried below the procedure is a poor warning system.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Separate learning evidence from execution evidence
&lt;/h2&gt;

&lt;p&gt;"Can we prove someone followed the SOP?" sounds straightforward. It contains several different questions.&lt;/p&gt;

&lt;p&gt;Opening a document shows access to it. Passing a quiz can provide evidence of understanding. Neither establishes that someone followed the procedure during a particular task.&lt;/p&gt;

&lt;p&gt;Even a checked box usually establishes only that someone attested to completion.&lt;/p&gt;

&lt;p&gt;For a specific execution, decide what evidence matters before designing the checklist. In the access example, that might mean linking the approved request to the resulting role assignment and recording who performed the change.&lt;/p&gt;

&lt;p&gt;A minimal execution record could contain:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Work item:
SOP identifier and revision used:
Operator:
Execution date/time:
Required verification result:
Evidence reference:
Exception or deviation:
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The revision matters. If the SOP changes next week, a record that links only to the latest document leaves you guessing which instructions applied.&lt;/p&gt;

&lt;p&gt;Choose evidence that supports the claim you need to make. A screenshot may show a result at one moment. An application audit event may establish that an account made a change. Neither necessarily explains whether the operator checked authorization first.&lt;/p&gt;

&lt;p&gt;For higher-impact work, combine evidence from the work request and the target system where practical. Preserve the sequence when sequence matters.&lt;/p&gt;

&lt;p&gt;Avoid collecting a recording of every execution by default. Recordings take time to review and can accumulate sensitive data. A narrowly scoped system event or verification result may provide better evidence with less exposure.&lt;/p&gt;

&lt;p&gt;No practical record proves every thought or action. Be precise about what your evidence establishes and what it leaves uncertain.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Make updating part of the change itself
&lt;/h2&gt;

&lt;p&gt;If an application change alters a documented workflow, documentation review belongs in that change's completion criteria.&lt;/p&gt;

&lt;p&gt;Add a question to the existing change record:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Which SOPs are affected, and what validation supports leaving
them unchanged or publishing a new revision?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;"Documentation updated" is easy to check without thinking. Asking for affected procedures and validation creates a more useful review.&lt;/p&gt;

&lt;p&gt;Keep the maintenance effort proportional to the change. A moved control may need one replacement screenshot and a revised instruction. A changed approval model needs a review of the decision logic, prerequisites, and execution evidence.&lt;/p&gt;

&lt;p&gt;Recording the changed portion can help, but someone still needs to check that it fits the rest of the procedure. Otherwise, locally accurate edits can leave contradictory instructions elsewhere.&lt;/p&gt;

&lt;p&gt;Assign ownership to a role with a named current assignee. "The team owns it" often means nobody has an explicit obligation to resolve reported defects.&lt;/p&gt;

&lt;p&gt;Reserve time for that obligation. Faster drafting will not solve a queue of unreviewed changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try the loop before evaluating software
&lt;/h2&gt;

&lt;p&gt;Run a small pilot on one procedure that people already use.&lt;/p&gt;

&lt;p&gt;Capture it during execution, validate the draft with another operator, and identify its staleness signals. On the next few executions, record which revision was used and whether anyone needed undocumented help.&lt;/p&gt;

&lt;p&gt;Track the effort to produce a usable draft and the effort to correct it after a real change. Note where people abandon the prescribed workflow.&lt;/p&gt;

&lt;p&gt;A growing library is not necessarily progress. Fewer unresolved mismatches and less dependence on verbal workarounds are more useful signs that the documentation is serving its purpose.&lt;/p&gt;

&lt;p&gt;When evaluating tools, repeat the pilot with the same procedure. Test how easily you can correct a bad draft, replace an outdated step, and find the procedure using the words an operator would actually search for. Ask vendors to demonstrate any revision history or execution evidence capabilities you require.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where our own product lands on this
&lt;/h2&gt;

&lt;p&gt;Adaptive Cadence addresses the capture and drafting part of this problem. Screen-record a task and it drafts numbered steps with screenshots and the transcribed voiceover, turning operational knowledge into documented, searchable SOPs.&lt;/p&gt;

&lt;p&gt;It also includes training quizzes, a manager coaching dashboard, and a department knowledge hub. You can deploy it on your own hardware or have us host it.&lt;/p&gt;

&lt;p&gt;The practical fit is reducing the work between performing a task and producing documentation someone can review. Quizzes and coaching can support training, but should not be treated as proof that a particular execution followed an SOP.&lt;/p&gt;

&lt;p&gt;You still need an owner, a way to detect changed behavior, and evidence appropriate to the task. Make those requirements explicit when evaluating Cadence.&lt;/p&gt;

&lt;p&gt;Disclosure: I work at Adaptive IP Services, a Dallas based IT and security firm.&lt;/p&gt;

&lt;p&gt;David J. Boggs&lt;br&gt;
Founder and CEO, Adaptive IP Services&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.adaptiveips.com/adaptive-cadence" rel="noopener noreferrer"&gt;Adaptive Cadence&lt;/a&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>devops</category>
      <category>management</category>
      <category>documentation</category>
    </item>
    <item>
      <title>Least Privilege Is a Policy Until the System Can Say No</title>
      <dc:creator>David Boggs</dc:creator>
      <pubDate>Sat, 12 Sep 2026 14:51:45 +0000</pubDate>
      <link>https://dev.to/david_boggs_adaptive/least-privilege-is-a-policy-until-the-system-can-say-no-311h</link>
      <guid>https://dev.to/david_boggs_adaptive/least-privilege-is-a-policy-until-the-system-can-say-no-311h</guid>
      <description>&lt;h1&gt;
  
  
  Least Privilege Is a Policy Until the System Can Say No
&lt;/h1&gt;

&lt;p&gt;A technician needs to change one DNS record. The ticket is approved. The access request says "least privilege." The technician receives membership in a group that can edit the entire zone.&lt;/p&gt;

&lt;p&gt;The workflow followed policy. The permission did not match the task.&lt;/p&gt;

&lt;p&gt;This is where many least-privilege programs stop: someone has justified a role, approved its assignment, and perhaps scheduled a review. But the running system still permits substantially more than the work requires.&lt;/p&gt;

&lt;p&gt;For a buyer, the useful question is not "Do you support least privilege?" It is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"What prevents someone authorized for this task from performing a different one?"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That question separates an access policy from an enforced boundary. It also gives you a practical way to evaluate a vendor without accepting "role-based access control" as a complete answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  A role is not necessarily a task boundary
&lt;/h2&gt;

&lt;p&gt;Role-based access control, or RBAC, assigns permissions through roles. It is useful for organizing access, and it can represent fine-grained permissions. There is nothing inherently incompatible between RBAC and action-level authorization.&lt;/p&gt;

&lt;p&gt;The problem is how roles are often defined.&lt;/p&gt;

&lt;p&gt;A "help desk" role might allow password resets across a broad user population. A "DNS operator" role might allow changes throughout a zone. Those permissions can remain available between tickets, even when the technician has no current reason to use them.&lt;/p&gt;

&lt;p&gt;An approval process does not narrow those permissions unless the system enforces the approved scope. A ticket saying "change this record" does not stop a credential from changing another record.&lt;/p&gt;

&lt;p&gt;Action-level authorization moves the boundary closer to the requested work. Instead of granting general authority over a resource, the system permits a defined operation against an allowed target, with constraints on its inputs.&lt;/p&gt;

&lt;p&gt;Consider a hypothetical DNS request:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Allowed operation: update an A record
Allowed target: app.example.com in the example.com zone
Allowed value: the address authorized for this change
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important property is what happens when the caller changes that request. Can they update a different hostname? Change a different record type? Supply an unapproved address?&lt;/p&gt;

&lt;p&gt;A narrow screen is not enough. The underlying authorization must reject requests outside the allowed operation.&lt;/p&gt;

&lt;p&gt;Action scope and access duration are also separate dimensions. A short-lived administrator session still permits broad actions while it is active. An action console can enforce narrow operations while leaving permission to invoke them available indefinitely. Buyers need to evaluate both.&lt;/p&gt;

&lt;h2&gt;
  
  
  Turn the claim into a testable contract
&lt;/h2&gt;

&lt;p&gt;Before a demo, pick one routine administrative task. Avoid starting with the vendor's entire permission model.&lt;/p&gt;

&lt;p&gt;Write down what an authorized technician should be able to do. Then write down the nearest things they should not be able to do.&lt;/p&gt;

&lt;p&gt;For a password reset, you might allow resets for a designated employee population while excluding privileged accounts. For file-lock release, you might allow work on specified file servers while excluding other systems.&lt;/p&gt;

&lt;p&gt;These are your requirements, not assumptions about what every product supports.&lt;/p&gt;

&lt;p&gt;A useful evaluation worksheet looks like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Boundary&lt;/th&gt;
&lt;th&gt;Write down before the demo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Caller&lt;/td&gt;
&lt;td&gt;Which person or group may invoke the action?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Operation&lt;/td&gt;
&lt;td&gt;What exact operation is permitted?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Target&lt;/td&gt;
&lt;td&gt;Which objects or systems are eligible?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Inputs&lt;/td&gt;
&lt;td&gt;Which values or options are accepted?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Duration&lt;/td&gt;
&lt;td&gt;When should invocation permission stop?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evidence&lt;/td&gt;
&lt;td&gt;What should the record of execution show?&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Use this worksheet to run the following checks in a controlled test environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Test the nearest forbidden action
&lt;/h2&gt;

&lt;p&gt;Ask the vendor to demonstrate the permitted task, then attempt a closely related forbidden task using the same identity.&lt;/p&gt;

&lt;p&gt;For DNS, that could mean changing a neighboring record. For password resets, it could mean targeting an excluded account. A useful denial test stays close enough to the approved workflow that it exposes a real boundary.&lt;/p&gt;

&lt;p&gt;Watch where enforcement occurs.&lt;/p&gt;

&lt;p&gt;A disabled button or hidden menu demonstrates a user-interface restriction. It does not establish that the backend will reject the request. Have the vendor exercise the relevant service endpoint or another supported test path with an out-of-scope request.&lt;/p&gt;

&lt;p&gt;The acceptance condition is concrete: the unauthorized operation must not execute.&lt;/p&gt;

&lt;p&gt;Record the denial, but also verify the target's state. An error message alone is weak evidence if a change could already have occurred.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Inspect inputs that can widen the action
&lt;/h2&gt;

&lt;p&gt;An operation can have a narrow name and still expose broad authority through its parameters.&lt;/p&gt;

&lt;p&gt;"Remediate vulnerability" sounds specific. If the caller can provide arbitrary shell commands, choose any script, or modify execution arguments without restriction, the effective permission may be general remote execution.&lt;/p&gt;

&lt;p&gt;Ask to see the action's input contract. Which fields does the caller control? Which values are fixed or validated by the service? Can a target identifier point outside the approved system set?&lt;/p&gt;

&lt;p&gt;Test a modified request that widens one of those inputs.&lt;/p&gt;

&lt;p&gt;Do not assume every variable input is dangerous. Technicians need useful choices. The issue is whether those choices remain inside the intended authority boundary.&lt;/p&gt;

&lt;p&gt;A credible answer explains how the backend validates the request. "Our technicians know which values to enter" describes training, not enforcement.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Find the authority behind the console
&lt;/h2&gt;

&lt;p&gt;A console may prevent technicians from receiving administrator credentials while still using a privileged identity to perform work on their behalf.&lt;/p&gt;

&lt;p&gt;That can be a meaningful improvement. It also moves the trust boundary to the service executing the action.&lt;/p&gt;

&lt;p&gt;Ask how that service authenticates to the target systems and how its authority is restricted. Find out who can change action definitions or expand the allowed target set.&lt;/p&gt;

&lt;p&gt;Two permissions deserve separate attention:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Permission to invoke an existing action.&lt;/li&gt;
&lt;li&gt;Permission to create or modify what that action does.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the same technician can rewrite an approved action into an arbitrary command, the action boundary offers little protection against that technician.&lt;/p&gt;

&lt;p&gt;You do not need a universal architecture requirement here. You need to understand where powerful authority resides, who controls it, and what a compromise of that component would expose.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Test revocation separately from task scope
&lt;/h2&gt;

&lt;p&gt;A tightly scoped action can still be available to the wrong person for too long.&lt;/p&gt;

&lt;p&gt;Remove a test user's permission while they have an authenticated session. Attempt the action again. Ask the vendor to explain when revocation takes effect, including any caching or session behavior.&lt;/p&gt;

&lt;p&gt;If your requirements include ticket-bound or time-limited authorization, test those explicitly. Close the test ticket or let the authorization expire, then retry.&lt;/p&gt;

&lt;p&gt;Do not treat these controls as automatic consequences of "least privilege." A product may constrain operations well without connecting authorization to individual tickets.&lt;/p&gt;

&lt;p&gt;That may be acceptable for recurring help desk work. For less frequent, higher-impact changes, you may require an additional approval or time boundary. Write that distinction into your evaluation instead of relying on the label.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Reconstruct the change from its audit record
&lt;/h2&gt;

&lt;p&gt;"Every action is logged" leaves substantial room for interpretation.&lt;/p&gt;

&lt;p&gt;After the test, ask a colleague who did not watch the demo to explain what happened using the available records.&lt;/p&gt;

&lt;p&gt;Can they identify the human caller, rather than only the backend service account? Can they determine the requested operation and target? Does the record distinguish a submitted request from a successfully completed change?&lt;/p&gt;

&lt;p&gt;For asynchronous operations, look for a way to connect the request to its eventual outcome. For failures, determine whether the record makes partial execution visible.&lt;/p&gt;

&lt;p&gt;Also ask who can modify or delete records and how your team would retrieve them during an investigation.&lt;/p&gt;

&lt;p&gt;Logging requires judgment. Recording passwords, reset secrets, or other sensitive input can create a new exposure. Define what investigators need while excluding values that should not appear in logs.&lt;/p&gt;

&lt;p&gt;A log is useful when it supports reconstruction, not merely when it exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Exercise the exception path
&lt;/h2&gt;

&lt;p&gt;Routine demonstrations tend to show valid input and a healthy target. Operational pressure arrives when those conditions disappear.&lt;/p&gt;

&lt;p&gt;Test what happens when the requested target is unsupported or the backend fails. Ask how technicians handle work that has no approved action.&lt;/p&gt;

&lt;p&gt;An exception path that routinely hands out broad administrator access can undermine the narrower workflow. That does not mean emergency access must disappear. It means you should evaluate its authorization and accountability separately.&lt;/p&gt;

&lt;p&gt;Also ask what it takes to add or revise an action. Someone must maintain the operation as systems change, validate it, and manage failures. A tightly constrained console is less useful if the approved action catalog cannot keep up with actual work.&lt;/p&gt;

&lt;p&gt;The buyer's question is whether the operational cost is manageable enough that staff will consistently use the controlled path.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decide based on the demonstrated boundary
&lt;/h2&gt;

&lt;p&gt;After the evaluation, summarize results in plain statements:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Demonstrated:
The test identity could reset passwords for the allowed population.
The same identity could not reset an excluded privileged account.

Unresolved:
Revocation behavior during an existing session was not demonstrated.

Required before acceptance:
Provide and test the expected revocation behavior.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is more useful than assigning a vendor a generic "least privilege" checkmark.&lt;/p&gt;

&lt;p&gt;Action-level controls also have limits. An authorized operation can still be a bad decision. Updating the correct DNS record to the wrong approved address can cause an outage. Releasing a file lock can disrupt active work.&lt;/p&gt;

&lt;p&gt;Authorization constrains who can do what. It does not replace change validation or recovery planning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where our own product lands on this
&lt;/h2&gt;

&lt;p&gt;Foyer, the Least-Privilege Action Console in Adaptive IP Services' Hub division, applies this approach to administrative work.&lt;/p&gt;

&lt;p&gt;IT staff receive a web console that runs only approved operations against allowed systems, without shared admin credentials or root. Every action is logged. The stated patterns include self-service DNS record changes, file-lock release, password resets, and vulnerability remediation.&lt;/p&gt;

&lt;p&gt;Those are the product's stated boundaries. Use the same evaluation above to examine them. Requirements such as ticket integration, time-limited grants, or particular audit-record fields should be verified directly; they should not be inferred from the phrase "least privilege."&lt;/p&gt;

&lt;p&gt;For your next evaluation, bring one real task and its nearest forbidden variation. Make the vendor show both the successful operation and the rejected request. That is where a policy claim becomes something you can inspect.&lt;/p&gt;

&lt;p&gt;Disclosure: I work at Adaptive IP Services, a Dallas based IT and security firm.&lt;/p&gt;

&lt;p&gt;David J. Boggs&lt;br&gt;
Founder and CEO, Adaptive IP Services&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.adaptiveips.com/adaptive-foyer" rel="noopener noreferrer"&gt;Foyer, Least-Privilege Action Console&lt;/a&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>devops</category>
      <category>sysadmin</category>
      <category>compliance</category>
    </item>
    <item>
      <title>Your AI vendor says "zero egress." Here is how to actually check.</title>
      <dc:creator>David Boggs</dc:creator>
      <pubDate>Sat, 12 Sep 2026 13:06:29 +0000</pubDate>
      <link>https://dev.to/david_boggs_adaptive/your-ai-vendor-says-zero-egress-here-is-how-to-actually-check-60</link>
      <guid>https://dev.to/david_boggs_adaptive/your-ai-vendor-says-zero-egress-here-is-how-to-actually-check-60</guid>
      <description>&lt;p&gt;Every private AI vendor now says some version of "your data never leaves your network." It is a good claim. It is also one of the easiest claims in the industry to make and one of the least often checked.&lt;/p&gt;

&lt;p&gt;I build and deploy this category of system for a living, so this is not a neutral post. But the test procedure below is vendor neutral, it runs in an afternoon, and it works just as well pointed at my product as at anyone else's. If you are evaluating a self-hosted AI knowledge base, RAG platform, or internal assistant, this is the part of the evaluation that nobody does and everybody should.&lt;/p&gt;

&lt;h2&gt;
  
  
  "Zero egress" is three separate claims wearing one coat
&lt;/h2&gt;

&lt;p&gt;When a vendor says zero egress, they could mean any of these, and the gap between them is where the surprises live.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The inference path.&lt;/strong&gt; Your prompts and your retrieved document chunks are not sent to a third party model API. This is the claim people think they are buying. It is also the one most likely to be true, because it is the headline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The data plane around inference.&lt;/strong&gt; Embeddings, reranking, OCR, speech to text, document parsing, image description. A system can run the chat model locally and still ship every page of every indexed document to a hosted embedding endpoint. If your document set is the sensitive thing, and it usually is, this path leaks more than the chat path does.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The control plane.&lt;/strong&gt; Telemetry, crash reporting, usage analytics, license check-in, auto-update, model pulls, container registry pulls, DNS, NTP. None of this is your document text. All of it is metadata about your environment, and some of it is a live outbound channel into your network that you did not deliberately open.&lt;/p&gt;

&lt;p&gt;A product can be entirely honest about the first claim and still fail the second and third. Ask about all three separately, in those words, and watch which ones get a crisp answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The paths that actually leak
&lt;/h2&gt;

&lt;p&gt;From evaluating and building these stacks, this is the list I work through. None of it is exotic. All of it has shown up in real deployments of real products.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hosted embedding models.&lt;/strong&gt; The most common one. Local chat model, remote embeddings. Ask specifically: what model generates the vectors, and where does it run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sidecar services.&lt;/strong&gt; OCR, transcription, and layout parsing are often the piece a vendor did not want to build, so they called an API. If the product ingests scanned PDFs or audio, ask what handles them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reranking.&lt;/strong&gt; Same story, one layer down the retrieval pipeline, and easy to miss because it only fires on queries, not on ingest.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error and crash reporting.&lt;/strong&gt; A Sentry-class SDK will happily transmit stack traces containing prompt fragments, file paths, usernames, and query strings. This is usually an oversight rather than a design, which does not make it better.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product analytics.&lt;/strong&gt; Event streams with document counts, seat counts, feature usage, and sometimes query text for "search quality improvement."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License and entitlement check-in.&lt;/strong&gt; A phone home on a timer. Often the hardest thing to remove, because the business model depends on it, and often the thing that silently breaks an air-gapped install thirty days after it worked fine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runtime model and dependency fetching.&lt;/strong&gt; If model weights are downloaded on first run instead of baked into the image, you have an outbound dependency and a supply chain question at the same time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DNS.&lt;/strong&gt; Even with egress blocked at the firewall, if the resolver is upstream then hostname lookups still describe your internal traffic to whoever runs that resolver. DNS query logs are the highest signal per unit of effort in this entire test.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Outbound integrations you turned on yourself.&lt;/strong&gt; Email notifications, webhooks, chat alerts, SSO to a cloud identity provider, connectors to SaaS sources. These are legitimate and deliberate. They are still egress, and they belong on the diagram.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How to test it in an afternoon
&lt;/h2&gt;

&lt;p&gt;You do not need a lab. You need one host, a packet capture, and a representative workload.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: default deny, and log the drops.&lt;/strong&gt; Put the deployment behind an egress policy that denies everything outbound and logs every denied packet. Do not start with allow-and-observe. Start denied, then read what screams. On Linux, an nftables or iptables OUTPUT chain with a log target on the drop rule is enough. The log is your finding list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: check the container network topology before you trust anything else.&lt;/strong&gt; If it ships as containers, inspect the network the AI services actually attach to. A bridge network created in internal mode has no gateway and no route out, which is a structural property you can verify in one command rather than a policy someone has to keep enforcing. Confirm which services sit on which network. The interesting finding is usually a single service that is on both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: sinkhole DNS and read the query log.&lt;/strong&gt; Point the deployment at a resolver you control that answers everything with a black hole address and logs every query. Then run a full workload. The query log is a plain text list of every remote host the software wanted to reach, including the ones the firewall already blocked and the ones that fail silently. I have never run this test and learned nothing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: run a representative workload, not a smoke test.&lt;/strong&gt; Index a real document set with real file types, including a scanned PDF and something with an embedded image. Ask twenty questions, including one that returns no good answer, because error paths are where crash reporters fire. Upload a document through the UI. Log in and out. Have an admin change a setting. Let it sit idle overnight, because timers are the point of the whole exercise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: capture the traffic, not just the logs.&lt;/strong&gt; Run a packet capture on the host interface for the whole window. Then look at what remains after you filter out your own management traffic. You are looking for TLS handshakes to hosts you cannot explain, and you are looking at timing, because a beacon on a fixed interval is a beacon regardless of what is inside it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6: pull the cord.&lt;/strong&gt; Remove the default route entirely and repeat the workload. Write down what breaks and how it breaks. Good behavior is full feature parity, or a clear degradation on a documented feature. Bad behavior is a hang, a silent failure, or a licensing error two days later. If a vendor says the product supports air-gapped operation, this test either confirms it in an hour or ends the conversation early, which is also a good outcome.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 7: ask how the isolation is enforced, not just whether it holds today.&lt;/strong&gt; The result you got is a snapshot of one build. The question that matters for the next three years is whether isolation is verified automatically on every build, or whether it was verified once by a person who has since moved teams. A vendor who can describe an automated check in their release pipeline is telling you something structurally different from a vendor who can only describe an architecture diagram.&lt;/p&gt;

&lt;h2&gt;
  
  
  Questions that are hard to bluff
&lt;/h2&gt;

&lt;p&gt;Send these before the demo. The answers, and how fast they come back, tell you most of what you need.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which components make outbound network calls at any point in normal operation, including timers and background jobs?&lt;/li&gt;
&lt;li&gt;Where do embeddings get generated, and by what model?&lt;/li&gt;
&lt;li&gt;What handles OCR, transcription, and document parsing?&lt;/li&gt;
&lt;li&gt;Is telemetry present, can it be disabled, and does disabling it stop the process or only stop the transmission?&lt;/li&gt;
&lt;li&gt;Does licensing require a periodic check-in, and what happens on day thirty with no route out?&lt;/li&gt;
&lt;li&gt;Are model weights and dependencies present in the artifact you ship, or fetched at first run?&lt;/li&gt;
&lt;li&gt;Is network isolation asserted in your release pipeline on every build, and what exactly does that check assert?&lt;/li&gt;
&lt;li&gt;What is the complete list of hostnames the product would resolve in a month of normal use?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last one is my favorite. A vendor who has genuinely built for isolation can answer it from memory or from a config file. A vendor who has not will need to go ask engineering, and the delay is the answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where our own product lands on this
&lt;/h2&gt;

&lt;p&gt;Adaptive Reservoir is a private AI knowledge platform that runs on hardware you own, on premise or in your own cloud account. It exists because the alternative most companies pick is banning AI outright and eating the productivity loss.&lt;/p&gt;

&lt;p&gt;Against the checklist above: the AI runs on an internal-only container network with no route to the internet, and that isolation is asserted by an automated release gate on every build rather than only claimed in documentation. It runs with no internet connection at all. There is no cloud account, no external API key, and no per-token bill, because the model runs on your hardware. The target footprint is a single Linux host with an NVIDIA GPU, and 16 GB of GPU memory is the practical sweet spot. Answers cite the documents and decisions they came from, which is its own small audit property: a citation you can open and read is a retrieval path you can verify by hand.&lt;/p&gt;

&lt;p&gt;The honest caveat, because a post about verifying claims should not hide behind its own. Reservoir offers optional connectors that pull AI activity from platforms you already use, through each vendor's official compliance API. Those connectors are outbound by definition. They are scoped, they are something you choose to enable, and they belong on your network diagram in a different color from the inference path. Any vendor telling you their product has literally zero outbound sockets under every possible configuration is describing marketing, not networking.&lt;/p&gt;

&lt;p&gt;Base pricing starts at $395 per month and scales with deployment size and the optional modules you turn on. Details at &lt;a href="https://www.adaptiveips.com/adaptive-reservoir" rel="noopener noreferrer"&gt;adaptiveips.com/adaptive-reservoir&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run the test
&lt;/h2&gt;

&lt;p&gt;The point of this post is not the product. The point is that "your data never leaves" is a testable assertion, and almost nobody tests it. A DNS sinkhole, a default deny rule, and a representative workload will tell you more in one afternoon than a security questionnaire will tell you in six weeks.&lt;/p&gt;

&lt;p&gt;Run it against whatever you are evaluating. Including ours.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I work at Adaptive IP Services, a Dallas based IT and security firm, and we build Adaptive Reservoir.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>security</category>
      <category>ai</category>
      <category>devops</category>
      <category>privacy</category>
    </item>
  </channel>
</rss>
