<?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: Safak Akyol</title>
    <description>The latest articles on DEV Community by Safak Akyol (@safak_akyol_5afbaa858d6ae).</description>
    <link>https://dev.to/safak_akyol_5afbaa858d6ae</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%2F4160568%2F3f5875bc-c2d4-4e34-a41d-5e6de574a397.png</url>
      <title>DEV Community: Safak Akyol</title>
      <link>https://dev.to/safak_akyol_5afbaa858d6ae</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/safak_akyol_5afbaa858d6ae"/>
    <language>en</language>
    <item>
      <title>An AI tool call is not consent: building visitor-approved question forwarding</title>
      <dc:creator>Safak Akyol</dc:creator>
      <pubDate>Sun, 04 Oct 2026 17:48:57 +0000</pubDate>
      <link>https://dev.to/safak_akyol_5afbaa858d6ae/an-ai-tool-call-is-not-consent-building-visitor-approved-question-forwarding-401j</link>
      <guid>https://dev.to/safak_akyol_5afbaa858d6ae/an-ai-tool-call-is-not-consent-building-visitor-approved-question-forwarding-401j</guid>
      <description>&lt;p&gt;I build &lt;a href="https://tasda.com/en/" rel="noopener noreferrer"&gt;Tasda&lt;/a&gt;, a web platform where people configure an AI representative using their own information and share a public profile. This is a product implementation note from its developer, not an independent review.&lt;/p&gt;

&lt;p&gt;A useful piece of feedback was that a representative needs a way to hand an unanswered question back to its creator. The tempting implementation is to give the model a “send to owner” tool. I chose a different boundary: &lt;strong&gt;the model can prepare a question, but the visitor decides whether to send it.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate proposing from writing
&lt;/h2&gt;

&lt;p&gt;The model-facing tool returns a short preview. Calling the tool does not create a request. The web client shows the exact question and a confirmation control. Only a separate authenticated confirmation request can persist that question.&lt;/p&gt;

&lt;p&gt;In simplified pseudocode, the distinction is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;model proposes question
    -&amp;gt; server creates signed preview
    -&amp;gt; client displays question
visitor confirms
    -&amp;gt; server validates preview and current eligibility
    -&amp;gt; server stores one request
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That last step is an application action, not a second interpretation of the conversation by the model. This matters because “the model decided it should forward this” is not the same as “the visitor chose to share this.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Bind the preview to its context
&lt;/h2&gt;

&lt;p&gt;The preview expires after one hour and is signed. Confirmation checks its representative, visitor and chat binding, as well as whether forwarding is still available for that representative. A valid signature alone is not sufficient if the current context no longer permits the action.&lt;/p&gt;

&lt;p&gt;The confirmation payload is kept out of the model-visible tool result. The model receives the conversational result it needs; the client receives the separate confirmation card.&lt;/p&gt;

&lt;h2&gt;
  
  
  Share the question, not the transcript
&lt;/h2&gt;

&lt;p&gt;Only the short question shown in the preview is stored for the creator. The forwarding action does not send the rest of the conversation or its attachments. This is a boundary for this feature, not a claim that the platform processes no chat data.&lt;/p&gt;

&lt;p&gt;The creator answers through the existing Requests area, and the visitor finds the answer in My requests. The answer does not automatically become new knowledge for the representative. Responding to one visitor and changing what a representative tells future visitors are separate decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Make confirmation safe to repeat
&lt;/h2&gt;

&lt;p&gt;A double-click or a retried network request should not create two questions. The confirmation path uses transaction locking and a receipt key derived from the preview token so the same confirmation is idempotent.&lt;/p&gt;

&lt;p&gt;The checks cover the absence of a write before confirmation, the allowed question payload, expired or mismatched previews, and repeated confirmation. We also verified the real web flow: prepare the question, confirm it, answer it as the creator and read that answer as the visitor. These checks do not establish usefulness for real customers; that needs user testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Do not expose a flow the client cannot support
&lt;/h2&gt;

&lt;p&gt;This feature is live in web text chat. Realtime voice does not expose it because the voice flow does not have the explicit confirmation card. Older mobile clients are also excluded from receiving a card they cannot handle. The newer mobile UI is implemented in source but should not be described as publicly released.&lt;/p&gt;

&lt;p&gt;The practical lesson for me is to design the write boundary before designing the AI tool. A tool can suggest an action while the application owns authorization, context validation and the durable result.&lt;/p&gt;

&lt;p&gt;If you build conversational products, how do you distinguish a model recommendation from a user-authorized write? I would particularly welcome examples of preview-and-confirm flows that were confusing to users.&lt;/p&gt;

&lt;p&gt;Disclosure: I am the developer of Tasda. This post was generated by an AI agent from the implementation records and checked against the documented web workflow.&lt;/p&gt;

</description>
      <category>ai</category>
    </item>
    <item>
      <title>Show DEV: Tasda, a platform for human-designed AI representatives</title>
      <dc:creator>Safak Akyol</dc:creator>
      <pubDate>Sat, 03 Oct 2026 22:17:04 +0000</pubDate>
      <link>https://dev.to/safak_akyol_5afbaa858d6ae/show-dev-tasda-a-platform-for-human-designed-ai-representatives-p7b</link>
      <guid>https://dev.to/safak_akyol_5afbaa858d6ae/show-dev-tasda-a-platform-for-human-designed-ai-representatives-p7b</guid>
      <description>&lt;p&gt;I've been building Tasda as a side project: a web platform where anyone can create an AI representative and share it with a link.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A guided wizard collects the representative's description, behaviour rules, scenarios and capabilities. No code.&lt;/li&gt;
&lt;li&gt;Knowledge comes from the owner's own documents and links.&lt;/li&gt;
&lt;li&gt;Visitors talk to it by text or voice and can leave service requests for the person behind it.&lt;/li&gt;
&lt;li&gt;The interface and representatives work in English, German and Turkish.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why
&lt;/h2&gt;

&lt;p&gt;People who share knowledge or services online can't answer everyone around the clock, and generic chatbots don't sound like them. I wanted each representative to feel like the person or character who designed it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://tasda.com/en/" rel="noopener noreferrer"&gt;https://tasda.com/en/&lt;/a&gt; — new users get free starter credits. A few public examples: English Buddy (English conversation practice) and Startup Critic (feedback on startup ideas).&lt;/p&gt;

&lt;p&gt;Feedback on the creation flow is very welcome.&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>ai</category>
      <category>webdev</category>
      <category>startup</category>
    </item>
  </channel>
</rss>
