<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <updated>2026-06-07T10:37:04Z</updated>
  <generator>https://yabu.me</generator>

  <title>Nostr notes by arihantdeva</title>
  <author>
    <name>arihantdeva</name>
  </author>
  <link rel="self" type="application/atom+xml" href="https://yabu.me/npub13n633wahpe2x76yluq7vyl7dsgugwtnku8pcjjnvs6qzerlxq3hqpgvnhl.rss" />
  <link href="https://yabu.me/npub13n633wahpe2x76yluq7vyl7dsgugwtnku8pcjjnvs6qzerlxq3hqpgvnhl" />
  <id>https://yabu.me/npub13n633wahpe2x76yluq7vyl7dsgugwtnku8pcjjnvs6qzerlxq3hqpgvnhl</id>
  <icon>https://pbs.twimg.com/profile_images/2059022310472921090/zcHuhauZ_400x400.jpg</icon>
  <logo>https://pbs.twimg.com/profile_images/2059022310472921090/zcHuhauZ_400x400.jpg</logo>




  <entry>
    <id>https://yabu.me/nevent1qqs9pr40k9495kw9c57yxnv064zds08gr6xtpcttcrz7udszwahp3sgzyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxuc9hpz9</id>
    
      <title type="html">What happens when your rate limiter says stop but your tick still ...</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqs9pr40k9495kw9c57yxnv064zds08gr6xtpcttcrz7udszwahp3sgzyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxuc9hpz9" />
    <content type="html">
      What happens when your rate limiter says stop but your tick still fires?&lt;br/&gt;&lt;br/&gt;I hit that exact bug in the comments engine. Fixed it by making `tick` return `[]` the moment `warmup.over_ceiling` is true, and clamping per tick `n` to `warmup.remaining` for both explicit and natural paths. That means `post_reply` literally cannot be called past the ceiling, not as a convention, not as a callsite check the caller might forget, but as a structural guarantee baked into the tick itself.
    </content>
    <updated>2026-06-13T14:56:23Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsg0fqj7gnjx4vuf8z0ee20zhu0xautrzd2lglle59xqr7zhkzeu8szyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxukw23ly</id>
    
      <title type="html">10 weeks. That is the ceiling rebuild curve I designed after a ...</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsg0fqj7gnjx4vuf8z0ee20zhu0xautrzd2lglle59xqr7zhkzeu8szyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxukw23ly" />
    <content type="html">
      10 weeks. That is the ceiling rebuild curve I designed after a shadowban: daily write cap starts at 0, crawls to 2, then 5, 15, 50, 120, 200. Each phase gates on a fetch_metrics health check. I retired the floor_catchup bypass entirely because shaving days off the climb is exactly how you restart the clock. Auto advance evaluator rolls back a full phase on any 226. Slow is fast.
    </content>
    <updated>2026-06-13T14:21:42Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqszemn5puz96duhj5g50ez9qlfderazfcmgpn8lx53w3nn3sagk8wqzyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxujvjxal</id>
    
      <title type="html">Shadowban lifted but trust is still low. I enabled phase 0 of the ...</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqszemn5puz96duhj5g50ez9qlfderazfcmgpn8lx53w3nn3sagk8wqzyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxujvjxal" />
    <content type="html">
      Shadowban lifted but trust is still low. I enabled phase 0 of the warm up today: zero writes, likes and follows only as the human present signal. The ceiling ramps from 0 to 200 over 8 phases before I graduate to normal cadence. 137 tests pass across 8 deterministic runs.
    </content>
    <updated>2026-06-13T14:01:19Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqszj6fdllwy9dy43qcql5h3vsg2cs60nw64660zgzdlqnwqamaq5uczyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxunrc7s3</id>
    
      <title type="html">Most engineers put their type discipline in the exception ...</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqszj6fdllwy9dy43qcql5h3vsg2cs60nw64660zgzdlqnwqamaq5uczyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxunrc7s3" />
    <content type="html">
      Most engineers put their type discipline in the exception hierarchy and leave the state machine untyped. Backwards. I added a `code` field to every write flag dict so callers can distinguish a 226 from a 344 from an untyped pause before any recovery logic runs. Three test cases: code=226, code=344, and code=None as the default for flags that predate the field. Now the call site knows what it is recovering from instead of pattern matching on vibes.
    </content>
    <updated>2026-06-13T13:10:20Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsdqxsn97y3qg9cwe6xd3vc7vlfxe6zcat8k2m33npdr272uyhzvfszyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxugzxukd</id>
    
      <title type="html">13 of 15 API profiles updated in one shot. Built profile sync to ...</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsdqxsn97y3qg9cwe6xd3vc7vlfxe6zcat8k2m33npdr272uyhzvfszyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxugzxukd" />
    <content type="html">
      13 of 15 API profiles updated in one shot. Built profile sync to push the full @DevaBuilds brand kit across 19 platforms at once: 9 Mastodon instances, Bluesky, Nostr, Matrix, prose.sh, Telegraph. Two fell through because one instance has login disabled at the server level and another gates profile edits behind the paid tier. That is the real cost of distributed social: every network has a slightly different broken thing. 23 hermetic tests cover the adapters so next time something breaks I know which one, not just &amp;#34;something is wrong.&amp;#34;
    </content>
    <updated>2026-06-13T01:57:43Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsyvgxpgx4gj7407xsapelz879ku6dgeg346hswtutfydjshypp7wgzyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxuz76ds8</id>
    
      <title type="html">Soft AI guardrails are a false floor. If your content policy only ...</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsyvgxpgx4gj7407xsapelz879ku6dgeg346hswtutfydjshypp7wgzyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxuz76ds8" />
    <content type="html">
      Soft AI guardrails are a false floor. If your content policy only lives in a prompt, one infra blip or hallucinated critic pass can publish something you never intended. I wired violates_topic_policy() as a hard fail in all six pipelines so the deterministic lint floor kills out of lane drafts before the claude critic even sees them. The LLM is still useful for quality judgment. It is a terrible gatekeeper.
    </content>
    <updated>2026-06-13T00:40:05Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqst59dmc2z0u3r3ymgqkrjy5zhnc0ja6jsnntd38txquz2v5yq55vqzyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxunwqkfn</id>
    
      <title type="html">The topic check in my content engine does the opposite of the ...</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqst59dmc2z0u3r3ymgqkrjy5zhnc0ja6jsnntd38txquz2v5yq55vqzyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxunwqkfn" />
    <content type="html">
      The topic check in my content engine does the opposite of the critic gate: the critic passes through on infra failure so an outage never blocks posting, but the topic guardrail is pure Python with no claude p dependency and hard blocks on failure. The asymmetry is intentional. Missing a quality pass is recoverable. Publishing political content by accident is not. Economics is the only carve out from the politics ban.
    </content>
    <updated>2026-06-12T22:19:41Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqs2er0al5dhhehjwswxnm6jxesx9setfwqxg65yej2pgzv6cx2pgxgzyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxut6xva9</id>
    
      <title type="html">12 posts per week on LinkedIn was hurting my reach, not helping ...</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqs2er0al5dhhehjwswxnm6jxesx9setfwqxg65yej2pgzv6cx2pgxgzyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxut6xva9" />
    <content type="html">
      12 posts per week on LinkedIn was hurting my reach, not helping it.&lt;br/&gt;&lt;br/&gt;Two posts per weekday meant both hit the same golden hour window. The feed ranker almost never shows both to the same person, so the second post just diluted the first. I cut it to 1 per day.&lt;br/&gt;&lt;br/&gt;Also added a reflection topic stream at roughly 1 in 3 posts. Every signal source was AI news, so the audience kept seeing the same note on repeat. 36 seed topics rotate oldest first so nothing repeats until the whole pool has cycled.
    </content>
    <updated>2026-06-12T16:33:47Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsp9qg32h7kpfncrqfzt25dvw8283420vrtvj57fnah04tqt3czzaczyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxu99x3aj</id>
    
      <title type="html">Reply engines were treating every parent post as a sincere claim. ...</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsp9qg32h7kpfncrqfzt25dvw8283420vrtvj57fnah04tqt3czzaczyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxu99x3aj" />
    <content type="html">
      Reply engines were treating every parent post as a sincere claim. I had wired them to take a position or correct it, with nothing telling the model to check whether the parent was a joke first. Result: earnest corrections under shitposts.&lt;br/&gt;&lt;br/&gt;Fixed it with arihantdeva_core.humor.humor_aware_directive(), one shared prompt fragment folded into the existing claude p call as a silent first step. Zero added LLM calls, no classifier, no gating. When the model detects comedy it softens the corrective register but still lands one real point. Wired across all 5 reply paths in a single commit.
    </content>
    <updated>2026-06-11T14:51:38Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsrnxna62lhjnf2m8udxypzeys8clv3c8znc4ae3kgstxq37t0y54szyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxutx7uft</id>
    
      <title type="html">More instances is not more reach. Had 3 Mastodon instances ...</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsrnxna62lhjnf2m8udxypzeys8clv3c8znc4ae3kgstxq37t0y54szyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxutx7uft" />
    <content type="html">
      More instances is not more reach. Had 3 Mastodon instances posting on my behalf, masto.es, piaille.fr, and ruhr.social, and each had already fired once before the brand gate caught it. Spanish, French, and German regional feeds that never asked for English language tech content. That is spam, not distribution. Flipped all three to disabled. Creds stay in the config but I marked them never to re enable. Presence in the wrong room is not presence.
    </content>
    <updated>2026-06-11T14:30:13Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsy6ugmqnx7qwkmgs2v9gpnrtqru40cstcsy8ksmxwylcuytzfvuyczyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxujet4wn</id>
    
      <title type="html">300 seconds between fetches. That&amp;#39;s all it takes to replace a ...</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsy6ugmqnx7qwkmgs2v9gpnrtqru40cstcsy8ksmxwylcuytzfvuyczyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxujet4wn" />
    <content type="html">
      300 seconds between fetches. That&amp;#39;s all it takes to replace a remote Oracle VM with a local launchd job.&lt;br/&gt;&lt;br/&gt;The x engine reader runner was fetching tweet data from a VM I don&amp;#39;t control, serving it over HTTP, and depending on systemd staying alive. Deleted the deploy script, the serve layer, and the VM references. Now a single plist file on the local machine runs the fetch loop every 5 minutes and writes directly to a file the engine reads.&lt;br/&gt;&lt;br/&gt;Less infrastructure, fewer moving parts, zero network dependency for a read operation that was never worth the exposure.
    </content>
    <updated>2026-06-11T14:11:08Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsvegnje4ge9v5dassw2qlzmtchqvh5gzp9a5874kevyxckzjjmwhszyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxullju3d</id>
    
      <title type="html">614 tests green across core and every engine after I wired a ...</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsvegnje4ge9v5dassw2qlzmtchqvh5gzp9a5874kevyxckzjjmwhszyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxullju3d" />
    <content type="html">
      614 tests green across core and every engine after I wired a civility guardrail into every generation and critic seam.&lt;br/&gt;&lt;br/&gt;The rule is simple: attack the argument as hard as you want, never the person. It lives in two places. At generation time, a hard rule in build_voice_block() reaches every engine. At critic time, a personal attack trips a hard fail in the LinkedIn rubric, verdict=revise, score capped at 3, so it cannot sneak through on a high overall score.&lt;br/&gt;&lt;br/&gt;Prompt only change. Zero control flow impact. The distinction between &amp;#34;your reasoning is wrong&amp;#34; and &amp;#34;you are an idiot&amp;#34; matters and now the system enforces it.
    </content>
    <updated>2026-06-11T13:30:27Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsy4k6nfjfk0urca952v0phjpkxu3neu6fyxfnx0kdphchauxehsgczyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxu809xzw</id>
    
      <title type="html">Caught two instances that slipped through my brand safety gate: ...</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsy4k6nfjfk0urca952v0phjpkxu3neu6fyxfnx0kdphchauxehsgczyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxu809xzw" />
    <content type="html">
      Caught two instances that slipped through my brand safety gate: occm.cc (Korean OC roleplay) and tkz.one (Spanish anime/otaku). Both were enabled and live. Root cause: my reconciliation logic trusted the on disk enabled flag instead of calling /api/v1/instance again to actually check. A fresh vetting run across all 19 enabled instances caught them. Guard is at 17 now. The 4 posts they already received are cleaned up separately.
    </content>
    <updated>2026-06-11T02:45:51Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsr9umr93wqdfljtu6gg7gwhdsasmdcw0ltu8p0zcp4qlx5skrg6wqzyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxusgnaql</id>
    
      <title type="html">What&amp;#39;s the actual trick with Cloudflare Turnstile? ...</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsr9umr93wqdfljtu6gg7gwhdsasmdcw0ltu8p0zcp4qlx5skrg6wqzyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxusgnaql" />
    <content type="html">
      What&amp;#39;s the actual trick with Cloudflare Turnstile? There&amp;#39;s nothing to solve. Managed mode auto issues the token in a clean fingerprint browser before you click anything. I just wait for cf turnstile response to populate and only trigger the checkbox fallback if the passive pass doesn&amp;#39;t fire on its own. 42 tests passed. Tier 0 means zero solver interactions.
    </content>
    <updated>2026-06-07T12:57:05Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsdgf50yumxx6ca02sjcem4lwtt3zqu397vp6p43wqkan0tdnd83cczyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxu9tl3ts</id>
    
      <title type="html">Adding a new platform is never the hard part. The hard part is ...</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsdgf50yumxx6ca02sjcem4lwtt3zqu397vp6p43wqkan0tdnd83cczyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxu9tl3ts" />
    <content type="html">
      Adding a new platform is never the hard part. The hard part is learning your runtime resolves descriptor.secrets into credentials but silently drops anything in extra.identifier_secret. I had valid Bluesky creds in notes.env from day one. Every publish attempt died with &amp;#39;missing AT Proto identifier&amp;#39; because PE_BSKY_IDENTIFIER lived in the wrong config bucket. Moved it into the secrets list, and both dev.to and Bluesky went live on the same day.
    </content>
    <updated>2026-06-07T12:19:05Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsrwyaf2ue6dgc0x2e75d6se64q7pv3kxwv58scdjlmvxga8zzsj8gzyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxu2atrgv</id>
    
      <title type="html">The fediverse being &amp;#34;open&amp;#34; doesn&amp;#39;t mean easy to ...</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsrwyaf2ue6dgc0x2e75d6se64q7pv3kxwv58scdjlmvxga8zzsj8gzyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxu2atrgv" />
    <content type="html">
      The fediverse being &amp;#34;open&amp;#34; doesn&amp;#39;t mean easy to automate. App OAuth clears signup captcha but not email confirmation: prod hCaptcha kills the solver every time. Out of every instance I vetted, exactly two, tty0.social and technodon.org, could be confirmed without manual intervention. Both are live now with real posts. The rest stay gated. Openness at the protocol layer doesn&amp;#39;t fix captcha walls at the account layer.
    </content>
    <updated>2026-06-07T10:19:14Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsdekxy6sa2te4ql5vqgfpthvhr7vywphmac666wz8xgjvrgwprungzyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxufyhv3z</id>
    
      <title type="html">I wired 908 Substack creator dossiers into the Notes commenter. ...</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsdekxy6sa2te4ql5vqgfpthvhr7vywphmac666wz8xgjvrgwprungzyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxufyhv3z" />
    <content type="html">
      I wired 908 Substack creator dossiers into the Notes commenter. Pool went from ~410 to ~1094 targets once you filter out the QA rejects. The enrichment block injects known_for, recent_themes, and angle into the generation prompt, confidence gated so low signal dossiers don&amp;#39;t leak noise into every reply. Fully reversible via a single env flag if the data turns out to be garbage.
    </content>
    <updated>2026-06-06T14:28:38Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqst4kzy87tqyveqw0ppctsnawuyzm4led4negrv7umnp5td6eyww3szyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxuhjrwem</id>
    
      <title type="html">The persistence layer isn&amp;#39;t the boring part you defer. ...</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqst4kzy87tqyveqw0ppctsnawuyzm4led4negrv7umnp5td6eyww3szyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxuhjrwem" />
    <content type="html">
      The persistence layer isn&amp;#39;t the boring part you defer. It&amp;#39;s the constraint that shapes everything else. If a registrar errors, I capture ok=False and move on rather than aborting the batch, because a coordinator that can&amp;#39;t survive partial failure isn&amp;#39;t coordinating anything.
    </content>
    <updated>2026-06-06T13:48:28Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsxc7cpxa9t7xj864kuxs75kwaevvawytfvkelea9qpthr6qg3angczyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxu9qyqkc</id>
    
      <title type="html">1186 creator records in creators.json with category, tone, ...</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsxc7cpxa9t7xj864kuxs75kwaevvawytfvkelea9qpthr6qg3angczyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxu9qyqkc" />
    <content type="html">
      1186 creator records in creators.json with category, tone, rapport angle, and engagement signals, all of it unused. I was pulling handle, name, tweet text only. Wired the rest in today: generation splices a resonant angle and topic focus into prompts, targeting multiplies live scores by a log scaled follower quality factor, cadence orders sweeps best first within each tier. Confidence gated so low confidence records only get topic tags, not synthesized tone. Four knobs, all reversible.
    </content>
    <updated>2026-06-06T10:11:29Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsrkzjd34se7vs84r4ns62tgn2ad9nualtc9dcvk0uklg6vazuceyczyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxuta36lk</id>
    
      <title type="html">The fediverse&amp;#39;s pitch is &amp;#34;leave the walled garden.&amp;#34; ...</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsrkzjd34se7vs84r4ns62tgn2ad9nualtc9dcvk0uklg6vazuceyczyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxuta36lk" />
    <content type="html">
      The fediverse&amp;#39;s pitch is &amp;#34;leave the walled garden.&amp;#34; In practice, 6 of my first 10 instance signups hit a 403, a Cloudflare block, an abuse filter, or a timeout before I got anywhere. One account live (@arihantdeva@privacysafe.social), three sitting in hCaptcha purgatory waiting for confirmation emails that may never work. Decentralization doesn&amp;#39;t mean frictionless. It means the friction is just distributed.
    </content>
    <updated>2026-06-05T12:37:27Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqswrcr8ynf9p7hckakv87cxn07zu29cgm5z5lvqu022rmn4y6avffszyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxue66ty9</id>
    
      <title type="html">Fixed length targets are a crutch. Every post chasing 200 chars ...</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqswrcr8ynf9p7hckakv87cxn07zu29cgm5z5lvqu022rmn4y6avffszyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxue66ty9" />
    <content type="html">
      Fixed length targets are a crutch. Every post chasing 200 chars is a uniform distribution with extra steps. I switched to a triangular draw skewed toward the short end (mode at min, tailing out to 260 for posts and 150 for replies) so most output is punchy and the occasional longer take earns its length naturally. The &amp;#34;target 200&amp;#34; default was lying: it reads as guidance but functions as a ceiling writers fill to. Randomize the target, and short and long both show up without forcing them.
    </content>
    <updated>2026-06-05T11:04:45Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqs9kha2z0r3uhg2l30acktxe3p54v2e63q0mdd0vl70pgz507krjeszyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxut24zcf</id>
    
      <title type="html">Most content strategy is vibes with a publishing schedule. Nobody ...</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqs9kha2z0r3uhg2l30acktxe3p54v2e63q0mdd0vl70pgz507krjeszyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxut24zcf" />
    <content type="html">
      Most content strategy is vibes with a publishing schedule. Nobody actually closes the feedback loop. I did: 4 hook arms (contrarian, question, data, observation) pooled across the fleet so Thompson sampling has enough initial signal, scored against CWES, posteriors updated by meta run. Live test scored 3 real Mastodon posts via fetch_engagement. Posterior stayed empty until posts with recorded arms accrued real engagement. No fabricated zeros. That empty posterior is the data. You cannot optimize what you refuse to measure and most accounts never try.
    </content>
    <updated>2026-06-04T10:41:53Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsglp0e3rdd4pv58hudq97e02n3kp9w60u9925ky74ekhf0eqn8jsqzyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxueet9ce</id>
    
      <title type="html">Prompting an LLM to end with a question is not a rule. It is a ...</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsglp0e3rdd4pv58hudq97e02n3kp9w60u9925ky74ekhf0eqn8jsqzyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxueet9ce" />
    <content type="html">
      Prompting an LLM to end with a question is not a rule. It is a suggestion it will randomly ignore. I added a deterministic lint gate that rejects any LinkedIn post where the final content line does not end with a question mark. One config flag, QUALITY_REQUIRE_ONRAMP, same pattern as the existing QUALITY_REQUIRE_FIRST_PERSON check. The closing question converts views to replies better than anything else in the pipeline. Lock it down in code, not in a prompt.
    </content>
    <updated>2026-06-04T04:53:58Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqs0hhq3p9g0mgs5ms2rz9g85aa388ptpa446y6mxzm74mj4t5s7dxczyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxu7lstf8</id>
    
      <title type="html">How do you post to Farcaster, Matrix, Ghost, and 200 Discourse ...</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqs0hhq3p9g0mgs5ms2rz9g85aa388ptpa446y6mxzm74mj4t5s7dxczyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxu7lstf8" />
    <content type="html">
      How do you post to Farcaster, Matrix, Ghost, and 200 Discourse forums from the same codebase without it turning into a pile of special cases?&lt;br/&gt;&lt;br/&gt;Every adapter in my fleet implements one contract: supported_kinds, publish, a probe() canary that catches schema drift before it silently breaks you, and fetch_engagement that returns None instead of fabricating numbers.&lt;br/&gt;&lt;br/&gt;Shipped 15 new families today. Fleet is pushing toward 500&#43; platforms. AT Proto, Misskey, Lemmy, Tumblr with hand rolled OAuth 1.0a HMAC SHA1, the whole IndieWeb micropub stack. One interface, one breaker, HTTP failures always raise AdapterError(status_code=) so nothing eats errors quietly.&lt;br/&gt;&lt;br/&gt;Distribution infrastructure is the unsexy work that compounds.
    </content>
    <updated>2026-06-03T13:12:25Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqs9dsm5xwmge2xeu9ahdcvq9c78gqsu5l6frntkrqfxq4ey4jflmygzyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxu02wlgr</id>
    
      <title type="html">Spent a week wondering why my post generator kept producing ...</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqs9dsm5xwmge2xeu9ahdcvq9c78gqsu5l6frntkrqfxq4ey4jflmygzyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxu02wlgr" />
    <content type="html">
      Spent a week wondering why my post generator kept producing drafts the critic rejected at score 6. Root cause: it was grounding on Obsidian session logs, which are purely mechanical metadata. Out of roughly 1000 files over 7 days, exactly 2 sections cleared the length filter. Both were just tool tallies. Every draft read as a vague flex with nothing real behind it.&lt;br/&gt;&lt;br/&gt;Fixed it by sourcing topics from git commit history instead. A commit subject and body is actual build narrative: the diagnosis, the numbers, the tradeoff. That&amp;#39;s what the drafting prompts need to produce something concrete. Session logs stay as fallback for anything git doesn&amp;#39;t cover.
    </content>
    <updated>2026-06-03T11:51:17Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqs9fgd4e0m6srr2n2ftrqmq06z95paa3t6rnevlvwkme9svpjdg45gzyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxuygnurl</id>
    
      <title type="html">Shipped the provisioning coordinator today. It sits between the ...</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqs9fgd4e0m6srr2n2ftrqmq06z95paa3t6rnevlvwkme9svpjdg45gzyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxuygnurl" />
    <content type="html">
      Shipped the provisioning coordinator today. It sits between the harvested fediverse pool and the registration adapters for each platform (Mastodon, Misskey, Lemmy). One design call I liked: render_descriptor always emits enabled=false in the TOML output. Enabling a new account stays a manual step. No batch loop should ever turn accounts live on its own. 521 tests pass, all offline, no real network.
    </content>
    <updated>2026-06-03T11:14:35Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqswlhl2h2cltlp08ancluwrxjxpj02swc7m6krqw0a23995jjfypnczyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxuuq62de</id>
    
      <title type="html">My personal site arihantdeva.com is currently just a blog ...</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqswlhl2h2cltlp08ancluwrxjxpj02swc7m6krqw0a23995jjfypnczyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxuuq62de" />
    <content type="html">
      My personal site arihantdeva.com is currently just a blog pretending to be a portfolio. Took 107 bash commands and a Vercel build log pull to scope the damage. Builder&amp;#39;s tax: the thing you ship last is always the thing with your name on it.
    </content>
    <updated>2026-06-03T10:11:28Z</updated>
  </entry>

  <entry>
    <id>https://yabu.me/nevent1qqsfhcdjkytjjur0tssg0csxampywc4zfh3xhqjt2q7uv0ps2ja9u2gzyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxum6qu9j</id>
    
      <title type="html">arihantdeva.com regressed to showing only the blog section. I ran ...</title>
    
    <link rel="alternate" href="https://yabu.me/nevent1qqsfhcdjkytjjur0tssg0csxampywc4zfh3xhqjt2q7uv0ps2ja9u2gzyzx02x9mku89gmmgnlsresnlekpr3pewwmsu8z22djrgqty0uczxum6qu9j" />
    <content type="html">
      arihantdeva.com regressed to showing only the blog section. I ran 107 bash commands and pulled live screenshots through Chrome DevTools to track down what changed. The most dangerous code is always the code nobody touched.
    </content>
    <updated>2026-06-02T22:12:17Z</updated>
  </entry>

</feed>