<?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: Julian Tao</title>
    <description>The latest articles on DEV Community by Julian Tao (@julian_tao_82353720ba9ff5).</description>
    <link>https://dev.to/julian_tao_82353720ba9ff5</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%2F4157957%2Fd238cf0f-2a76-4b3d-b199-fe3a97766f74.jpg</url>
      <title>DEV Community: Julian Tao</title>
      <link>https://dev.to/julian_tao_82353720ba9ff5</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/julian_tao_82353720ba9ff5"/>
    <language>en</language>
    <item>
      <title>A moderation timeout should release quota without retrying a paid request</title>
      <dc:creator>Julian Tao</dc:creator>
      <pubDate>Tue, 20 Oct 2026 09:42:23 +0000</pubDate>
      <link>https://dev.to/julian_tao_82353720ba9ff5/a-moderation-timeout-should-release-quota-without-retrying-a-paid-request-4pc2</link>
      <guid>https://dev.to/julian_tao_82353720ba9ff5/a-moderation-timeout-should-release-quota-without-retrying-a-paid-request-4pc2</guid>
      <description>&lt;p&gt;A safety check can fail before a media provider has received a generation request. Your queue needs to represent that state separately from an uncertain generation submission. Otherwise, a visitor can lose a concurrency slot indefinitely even though there is no generation task to poll.&lt;/p&gt;

&lt;p&gt;We encountered this while operating Rendastic, a Go and SQLite application that submits video and image jobs to external providers. Several jobs stayed in a pending-confirmation state after an automated content check stopped returning a usable result. Restarting the application preserved the stuck state. Retrying the same paid POST could introduce a second charge.&lt;/p&gt;

&lt;p&gt;Here is the state-model change we used, and how to test it without generating media.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep customer reservations and provider uncertainty separate
&lt;/h2&gt;

&lt;p&gt;A request can reserve three different things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A customer's free attempt or credits.&lt;/li&gt;
&lt;li&gt;A local concurrency slot.&lt;/li&gt;
&lt;li&gt;A conservative budget for an external provider request.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These reservations have different lifecycles. When a required safety check cannot finish, we can fail the customer job and release the first two. The external request may still have incurred a charge, so its journal entry and uncertain cost reservation remain unchanged.&lt;/p&gt;

&lt;p&gt;Releasing a customer's allowance does not prove that the provider refunded anything. That distinction matters when reconciling costs later.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use distinct error states
&lt;/h2&gt;

&lt;p&gt;Our original generic uncertainty path was useful for a media submission that might have reached the provider. It was insufficient for a failed safety check with no pollable task identifier.&lt;/p&gt;

&lt;p&gt;We introduced a typed moderation-unavailable error and gave content checks a bounded deadline. The following is illustrative pseudocode for the decision:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if required_check_is_unavailable:
    withhold_unchecked_result()
    fail_customer_job_and_release_customer_reservation()
    preserve_original_provider_journal()
elif main_generation_submission_is_uncertain:
    hold_customer_job_for_reconciliation()
    preserve_original_request_key()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The first branch concerns technical failures: timeout, transport failure, or an unusable safety verdict. An explicit policy refusal is a separate business outcome and should have its own disclosed handling.&lt;/p&gt;

&lt;p&gt;No unchecked result becomes downloadable in either branch. An uncertain external request keeps its original identity; it is never retried under a fresh key merely to escape the uncertain state.&lt;/p&gt;

&lt;h2&gt;
  
  
  Commit the terminal transition and release together
&lt;/h2&gt;

&lt;p&gt;The customer's job status and quota or credit release need to change in one database transaction. A process crash between those operations can otherwise leave a failed job that still consumes quota, or a running job whose credits were already returned.&lt;/p&gt;

&lt;p&gt;The operation also needs to be idempotent. Two workers can observe the same failure, and maintenance can run after a restart. A terminal-state guard should ensure that repeating settlement neither returns credits twice nor changes an already-settled result.&lt;/p&gt;

&lt;p&gt;SQLite transactions are useful here because job admission, local quota, and the credit ledger live in the same database. Systems using separate services need an equivalent reconciliation mechanism rather than assuming cross-service writes commit together.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recover old jobs conservatively
&lt;/h2&gt;

&lt;p&gt;We restricted historical recovery to identifiable, stale moderation requests with no task ID and no unresolved main media request. A job with evidence of an accepted or uncertain media submission stayed in reconciliation.&lt;/p&gt;

&lt;p&gt;This scope avoided treating every old pending job as safe to release or replay. We compared the provider journal before and after recovery to confirm that repairing the customer state did not create new external requests or erase uncertain provider costs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test failure paths without paying for media
&lt;/h2&gt;

&lt;p&gt;A local fake provider can return a timeout, a pending response, a valid refusal, or a completed response. The important assertions are behavioral:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An unavailable safety check releases the customer's reservation and concurrency slot.&lt;/li&gt;
&lt;li&gt;No unchecked output is served.&lt;/li&gt;
&lt;li&gt;Reprocessing the same request does not issue another paid POST.&lt;/li&gt;
&lt;li&gt;Settling the same failure twice does not return credits twice.&lt;/li&gt;
&lt;li&gt;An uncertain main generation task remains held for reconciliation.&lt;/li&gt;
&lt;li&gt;Recovery after restart preserves the original external request journal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Successful generation tests alone do not cover these boundaries. A useful acceptance run should explicitly interrupt each stage where customer state and provider state can diverge.&lt;/p&gt;

&lt;p&gt;Disclosure: I operate &lt;a href="https://rendastic.com/" rel="noopener noreferrer"&gt;Rendastic&lt;/a&gt;, where we implemented this recovery flow. This article describes our application behavior, not a guarantee about another provider's billing or moderation decisions. This draft was generated by an AI agent and checked against our implementation and recorded tests.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>go</category>
      <category>sqlite</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Public sharing as a snapshot, not a live editor</title>
      <dc:creator>Julian Tao</dc:creator>
      <pubDate>Sat, 10 Oct 2026 15:55:57 +0000</pubDate>
      <link>https://dev.to/julian_tao_82353720ba9ff5/public-sharing-as-a-snapshot-not-a-live-editor-3gmh</link>
      <guid>https://dev.to/julian_tao_82353720ba9ff5/public-sharing-as-a-snapshot-not-a-live-editor-3gmh</guid>
      <description>&lt;p&gt;A sharing button changes the trust boundary of a transcription app. The editor belongs to one person; anyone holding a public link can read the published text. Those are separate responsibilities.&lt;/p&gt;

&lt;p&gt;I am Julian Tao, the maker of ShortTranscript. This note describes the sharing behavior we implemented, rather than a claim that transcripts are automatically accurate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate the private draft from the public snapshot
&lt;/h2&gt;

&lt;p&gt;Publishing an editable result directly would make every later correction public. Instead, the owner reviews the draft, chooses a public title, confirms permission, and creates a snapshot. Private edits do not silently change it. An explicit update refreshes the snapshot at the same link.&lt;/p&gt;

&lt;p&gt;The public representation only needs the chosen title, a platform label, reviewed text and timestamps. It does not need the account email, private job identifier, uploaded filename or original video address. Use a separate random public identifier rather than exposing the private job route.&lt;/p&gt;

&lt;h2&gt;
  
  
  Revocation is a lifecycle operation
&lt;/h2&gt;

&lt;p&gt;Turning sharing off invalidates the link. Recreating it produces a different identifier. Deleting the original result also removes its snapshot. For expiring guest results, access must stop at expiry even before a scheduled cleanup runs. None of these operations can recall copies another person already saved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unlisted is still public
&lt;/h2&gt;

&lt;p&gt;A noindex directive asks search engines not to index a page; it is not access control. The UI should say that anyone with the link can read it. Do not create links by default, and do not place them in a sitemap.&lt;/p&gt;

&lt;p&gt;A useful acceptance sequence is: create, open without a login, edit privately, check that the snapshot is unchanged, update deliberately, revoke, recreate, and delete the original. Check the exported public fields at each step.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://shorttranscript.com/instagram-transcript" rel="noopener noreferrer"&gt;Instagram transcription tool I maintain&lt;/a&gt; produces drafts that should be checked against the source audio before sharing. This is a maker-authored implementation note, not an independent review.&lt;/p&gt;

&lt;p&gt;Disclosure: AI assisted the drafting of this note. Its product claims were checked against the implemented behavior and acceptance evidence.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>security</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>Classifying failure modes in URL-based transcription</title>
      <dc:creator>Julian Tao</dc:creator>
      <pubDate>Fri, 02 Oct 2026 16:05:10 +0000</pubDate>
      <link>https://dev.to/julian_tao_82353720ba9ff5/classifying-failure-modes-in-url-based-transcription-57md</link>
      <guid>https://dev.to/julian_tao_82353720ba9ff5/classifying-failure-modes-in-url-based-transcription-57md</guid>
      <description>&lt;p&gt;A single “transcription failed” bucket hides several different problems. For a link-based tool, the source may be unavailable, playback may begin muted, the audio may contain music without speech, or speech may be present but masked by noise. Those cases need different follow-up tests.&lt;/p&gt;

&lt;p&gt;A useful test record starts with retrieval: does the public URL load from a clean session, and can the audio be played? Next, note the actual sound after unmuting the player. Then classify the audio as clear speech, mixed speech and noise, music-only, silence, or uncertain. Finally, record whether a transcript was returned, how long it took, and whether the result needs human correction.&lt;/p&gt;

&lt;p&gt;Keep the categories separate. A deleted or restricted URL is an access failure, not a recognition error. Music-only audio should not produce invented dialogue. Distant or overlapping speech should remain visibly uncertain rather than being presented as exact wording. Timestamps help a reviewer return to the source, but they do not certify accuracy.&lt;/p&gt;

&lt;p&gt;For a small product, a fixed set of clips can be varied by accent, duration, music, background noise, and source platform. Report the sample size and individual causes; do not generalize from a handful of clips.&lt;/p&gt;

&lt;p&gt;I am Julian Tao, the independent maker of ShortTranscript, a browser tool for public TikTok and Instagram Reels links. The free workflow and supported formats are described at &lt;a href="https://shorttranscript.com/" rel="noopener noreferrer"&gt;https://shorttranscript.com/&lt;/a&gt;. This article is original, AI-assisted in editing, and reviewed by me.&lt;/p&gt;

</description>
      <category>monitoring</category>
      <category>software</category>
      <category>testing</category>
    </item>
  </channel>
</rss>
