<?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: Seshank Mallireddigari</title>
    <description>The latest articles on DEV Community by Seshank Mallireddigari (@seshank).</description>
    <link>https://dev.to/seshank</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F99mvlsfu5tfj9m7ku25d.png</url>
      <title>DEV Community: Seshank Mallireddigari</title>
      <link>https://dev.to/seshank</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/seshank"/>
    <language>en</language>
    <item>
      <title>Not An Insider (Just Lucky)</title>
      <dc:creator>Seshank Mallireddigari</dc:creator>
      <pubDate>Tue, 22 Sep 2026 19:01:17 +0000</pubDate>
      <link>https://dev.to/seshank/not-an-insider-just-lucky-2nmo</link>
      <guid>https://dev.to/seshank/not-an-insider-just-lucky-2nmo</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/mlh-hackathon"&gt;MLH x DEV Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;What if the person betting on an outcome is also the person who can influence it?&lt;br&gt;
That question became our project at VTHacks 14: Not An Insider (Just Lucky).&lt;br&gt;
We built a prediction-market prototype that checks a trader’s identity and recorded affiliations before allowing a trade, rather than treating conflicts of interest as something to investigate afterward.&lt;br&gt;
The name is a joke. The design problem isn’t.&lt;br&gt;
Identity is only the beginning&lt;br&gt;
Knowing who signed a request does not tell you whether they should be allowed to place that trade.&lt;br&gt;
For example, someone affiliated with an athletics department might be restricted from trading on their university’s games, while remaining eligible for unrelated markets. An identity should not need to be globally banned for one conflict of interest.&lt;br&gt;
Our backend connects trader identities to market-specific restrictions. Signed trade requests pass through checks for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A valid cryptographic signature.&lt;/li&gt;
&lt;li&gt;A nonce that has not already been used.&lt;/li&gt;
&lt;li&gt;ANS registration validity.&lt;/li&gt;
&lt;li&gt;Affiliation and age restrictions.&lt;/li&gt;
&lt;li&gt;Available account balance.&lt;/li&gt;
&lt;li&gt;Proximity to a declared material event.
The timing check is intentionally different: it can flag a trade for review rather than automatically block it.
Trade decisions carry reasons and are recorded in a hash-linked audit trail. We wanted an answer to “Why was this blocked?” to be part of the system, not something reconstructed from scattered logs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  The stack
&lt;/h1&gt;

&lt;p&gt;The interface uses HTML, CSS, and JavaScript, with Next.js and TypeScript serving the backend API routes.&lt;br&gt;
Supabase PostgreSQL stores identities, affiliations, markets, replay-protection records, and trade decisions. Polymarket supplies reference market data, alongside simulated markets for demonstrating behavior. Our app does not execute orders on Polymarket.&lt;br&gt;
We deployed the web application on Vercel and used Vitest for automated testing.&lt;br&gt;
The biggest lesson was that a convincing interface and a trustworthy trade pipeline are separate accomplishments. Both matter, but one does not prove the other.&lt;/p&gt;
&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://anti-insiderz.vercel.app/index.html" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;anti-insiderz.vercel.app&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/ynaowVwzhvo" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/FluffyCube9343" rel="noopener noreferrer"&gt;
        FluffyCube9343
      &lt;/a&gt; / &lt;a href="https://github.com/FluffyCube9343/not-an-insider-just-lucky" rel="noopener noreferrer"&gt;
        not-an-insider-just-lucky
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Prediction markets that check who’s trading and whether they should be.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Not An Insider (Just Lucky)&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;"Foreknowledge cannot be elicited from spirits, nor from gods, nor by analogy with past events, nor from calculations. It must be obtained from men who know the enemy's situation" -- Sun Tzu, The Art of War&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Except half the time that's not insight, it's just who happened to be in the room. And someone on the other end of that trade never knew they didn't have a shot, with no enforcement of trading on public information.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;&lt;strong&gt;Price discovery, without privileged access.&lt;/strong&gt;&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A pari-mutuel prediction market that enforces conflicts of interest &lt;em&gt;before&lt;/em&gt; money moves. Real markets handle insider risk with policy documents and after-the-fact investigations; here the restrictions live in the trade path itself. Every trade is signed in the browser, passes six enforcement gates, and gets a receipt in a hash-chained audit trail — including the blocked ones.&lt;/p&gt;
&lt;p&gt;Identities are registered agents in GoDaddy's &lt;strong&gt;ANS&lt;/strong&gt;…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/FluffyCube9343/not-an-insider-just-lucky" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The central demonstration is a comparison between two cases:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A trader submits a signed request for a market they are eligible to participate in.&lt;/li&gt;
&lt;li&gt;A trader with a restricted affiliation attempts to enter a related market.
The backend is designed to explain the different outcomes through its decision records—not simply display a generic error.
For example, our demo personas include an athletics-affiliated trader and a technology-company-affiliated trader. Their restrictions apply to relevant markets instead of preventing participation everywhere.
Public-demo limitation: banking endpoints are currently disabled on our public deployment while account-ownership authorization is completed. Some private profile fields are also withheld. The hosted site is a prototype, not a production-ready financial service, and end-to-end payment behavior still needs further verification.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Partner Technologies
&lt;/h2&gt;

&lt;p&gt;GoDaddy ANS: connecting identity to signed requests&lt;br&gt;
We used GoDaddy’s Agent Name Service (ANS) in the trader identity-validation flow.&lt;br&gt;
Our demo represents traders using registered agent identities. The browser signs a canonical trade payload, and the backend verifies that signature against the stored public key. It then checks the identity against ANS, including registration status and key consistency.&lt;br&gt;
A trade payload includes fields such as:&lt;br&gt;
tradeId&lt;br&gt;
agentId&lt;br&gt;
marketId&lt;br&gt;
outcome&lt;br&gt;
amount&lt;br&gt;
nonce&lt;br&gt;
timestamp&lt;/p&gt;

&lt;p&gt;The field order matters because the signer and verifier must agree on the exact bytes being signed. Two JSON objects can represent the same information while producing different signatures if serialized differently.&lt;br&gt;
The private key is used in the browser for signing; the backend receives the request and its signature.&lt;br&gt;
ANS gave us a way to connect a request to a registered identity. Our application still has to decide what that identity is allowed to do.&lt;br&gt;
That distinction became one of our most important design lessons:&lt;br&gt;
Identity validation establishes who is acting. Eligibility checks establish whether that action is allowed.&lt;/p&gt;

&lt;p&gt;There is also an important limitation: our affiliations are currently declared data, not independently verified employer or league attestations. ANS does not automatically prove that someone’s claimed affiliation is true.&lt;br&gt;
Capital One Nessie: making account behavior concrete&lt;br&gt;
We developed a Capital One Nessie integration to explore how trade decisions connect to simulated banking accounts.&lt;br&gt;
The integration includes server-side account operations and code paths for recording simulated movements between trader accounts and a market pool. Nessie uses sandbox data—not real customer funds.&lt;br&gt;
Working with it pushed us beyond a frontend balance counter. We had to consider account identifiers, persistent wallet links, ledger records, and what the interface should show when the provider is unavailable.&lt;br&gt;
It also exposed a difficult systems problem: a payment operation and a database update are not one atomic action.&lt;br&gt;
If one succeeds and the other fails, simply returning “trade failed” may leave the application in an inconsistent state. Retrying blindly can make that worse. Reliable reconciliation is therefore part of our remaining work.&lt;br&gt;
We also found that hiding an API key on the server is necessary but insufficient. The server still needs to verify that a caller owns the account they are trying to access. That is why we disabled the public banking endpoints until those controls are ready.&lt;/p&gt;

&lt;h1&gt;
  
  
  Supporting infrastructure
&lt;/h1&gt;

&lt;p&gt;Supabase gave us a managed PostgreSQL database so we could spend more of the hackathon on trade screening and the interface.&lt;br&gt;
Vercel provided the public deployment, with backend credentials stored as server-side environment variables. We also used Codex to assist with implementation, debugging, testing, and deployment checks.&lt;br&gt;
These tools helped us move quickly, but integration still required careful review—especially when independently developed pieces started sharing the same identity, account, and trade data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hackathon Experience
&lt;/h2&gt;

&lt;p&gt;We built this project at VTHacks 14, working as a team across the interface, identity integration, backend, and account workflows.&lt;br&gt;
The most memorable part of the build was bringing those pieces together. A teammate’s CLI flow could be working while the browser still expected an older data format. A database change could support a new feature while breaking an assumption elsewhere. Even figuring out which frontend version we were running became part of the experience.&lt;br&gt;
That made communication as important as coding. We had to coordinate GitHub changes, agree on request formats, and test the connections between features—not just each feature individually.&lt;/p&gt;

&lt;p&gt;We came away with three lessons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A signature is not an authorization policy. A correctly signed request can still be ineligible.&lt;/li&gt;
&lt;li&gt;An audit trail needs careful claims. Hash links can help detect changes when verified; they do not make a database magically impossible to alter.&lt;/li&gt;
&lt;li&gt;Deployment is another test environment. A successful build does not prove that authentication, payments, and user flows are ready for unrestricted public use.
Our next steps are to finish account authorization, strengthen payment reconciliation, expand end-to-end tests, and move toward independently attested affiliations.
We are not claiming to have eliminated insider trading. We built a prototype around a narrower question:
Can a market check known conflicts before accepting a trade—and make that decision understandable afterward?
That is the idea we want to keep developing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Teammates: &lt;a href="https://github.com/FluffyCube9343" rel="noopener noreferrer"&gt;https://github.com/FluffyCube9343&lt;/a&gt;, &lt;a href="https://github.com/AbhiramRuthala" rel="noopener noreferrer"&gt;https://github.com/AbhiramRuthala&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mlhacks</category>
      <category>devchallenge</category>
      <category>hackathon</category>
    </item>
    <item>
      <title>Bureau of Anomalous Artifacts (BAA)</title>
      <dc:creator>Seshank Mallireddigari</dc:creator>
      <pubDate>Tue, 22 Sep 2026 18:44:07 +0000</pubDate>
      <link>https://dev.to/seshank/bureau-of-anomalous-artifacts-baa-3h3f</link>
      <guid>https://dev.to/seshank/bureau-of-anomalous-artifacts-baa-3h3f</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/sanity-2026-09-16"&gt;Sanity Challenge, Path Two: Vibe-Code Something Strange&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I built the Bureau of Anomalous Artifacts (BAA), a brutalist, SCP-inspired terminal interface for tracking and containing anomalous entities.&lt;/p&gt;

&lt;p&gt;The goal was to build something that didn't just look "vibe-coded" but actually functioned as a serious, usable application. It features a Next.js 15 frontend with a custom Sanity Studio fully embedded directly into the /studio route.&lt;/p&gt;

&lt;p&gt;Authorized personnel can log into the embedded Studio to document new anomalies, set Threat Levels (Safe, Euclid, Keter, Apollyon), and write containment procedures using PortableText. The frontend then dynamically renders this data with a retro-terminal aesthetic, complete with redacted text effects for sensitive information.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn7wvtbgou7q8jwe0nesk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn7wvtbgou7q8jwe0nesk.png" alt="The Anomaly Index (The Dashboard)" width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnupenhhtsd1a60fn451p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnupenhhtsd1a60fn451p.png" alt="The Dossier Page (The Hover Effect)" width="800" height="547"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu530mlxrs682rdudju6u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu530mlxrs682rdudju6u.png" alt="The Embedded Sanity Studio" width="800" height="608"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm2ln1pjklr3xe77g1ppt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm2ln1pjklr3xe77g1ppt.png" alt=" " width="800" height="744"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/PlutonicSauce" rel="noopener noreferrer"&gt;
        PlutonicSauce
      &lt;/a&gt; / &lt;a href="https://github.com/PlutonicSauce/sanity-baa" rel="noopener noreferrer"&gt;
        sanity-baa
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;This is a &lt;a href="https://nextjs.org" rel="nofollow noopener noreferrer"&gt;Next.js&lt;/a&gt; project bootstrapped with &lt;a href="https://nextjs.org/docs/app/api-reference/cli/create-next-app" rel="nofollow noopener noreferrer"&gt;&lt;code&gt;create-next-app&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Getting Started&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;First, run the development server:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;npm run dev
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; or&lt;/span&gt;
yarn dev
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; or&lt;/span&gt;
pnpm dev
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; or&lt;/span&gt;
bun dev&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Open &lt;a href="http://localhost:3000" rel="nofollow noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt; with your browser to see the result.&lt;/p&gt;
&lt;p&gt;You can start editing the page by modifying &lt;code&gt;app/page.tsx&lt;/code&gt;. The page auto-updates as you edit the file.&lt;/p&gt;
&lt;p&gt;This project uses &lt;a href="https://nextjs.org/docs/app/building-your-application/optimizing/fonts" rel="nofollow noopener noreferrer"&gt;&lt;code&gt;next/font&lt;/code&gt;&lt;/a&gt; to automatically optimize and load &lt;a href="https://vercel.com/font" rel="nofollow noopener noreferrer"&gt;Geist&lt;/a&gt;, a new font family for Vercel.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Learn More&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;To learn more about Next.js, take a look at the following resources:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://nextjs.org/docs" rel="nofollow noopener noreferrer"&gt;Next.js Documentation&lt;/a&gt; - learn about Next.js features and API.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://nextjs.org/learn" rel="nofollow noopener noreferrer"&gt;Learn Next.js&lt;/a&gt; - an interactive Next.js tutorial.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can check out &lt;a href="https://github.com/vercel/next.js" rel="noopener noreferrer"&gt;the Next.js GitHub repository&lt;/a&gt; - your feedback and contributions are welcome!&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Deploy on Vercel&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;The easiest way to deploy your Next.js app is to use the &lt;a href="https://vercel.com/new?utm_medium=default-template&amp;amp;filter=next.js&amp;amp;utm_source=create-next-app&amp;amp;utm_campaign=create-next-app-readme" rel="nofollow noopener noreferrer"&gt;Vercel Platform&lt;/a&gt; from the creators of Next.js.&lt;/p&gt;
&lt;p&gt;Check out our &lt;a href="https://nextjs.org/docs/app/building-your-application/deploying" rel="nofollow noopener noreferrer"&gt;Next.js deployment documentation&lt;/a&gt; for more…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/PlutonicSauce/sanity-baa" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  My Build Process
&lt;/h2&gt;

&lt;p&gt;This was built entirely using the Google Antigravity IDE. I wanted to push the agent to build something structural and robust, not just a fragile prototype.&lt;/p&gt;

&lt;p&gt;The build process was a wild ride:&lt;/p&gt;

&lt;p&gt;The Disk Space Crisis: Halfway through scaffolding the Next.js app, the agent literally ran out of disk space in its scratch environment. We had to pause, clean up the system, and migrate the whole project to my Desktop to keep going.&lt;br&gt;
The React 19 Dependency War: When we tried to embed the Sanity Studio via next-sanity, we hit a massive peer dependency conflict because we were using React 18, but the latest Sanity packages required React 19. The agent made the bold decision to just upgrade the entire app to the Next.js 15 Release Candidate on the fly.&lt;br&gt;
The Async Params Bug: Because we upgraded to Next.js 15, we instantly got hit by a brand new Next.js breaking change—dynamic route params are now Promises! The dossier page crashed because it was trying to fetch from Sanity before the URL parameter resolved. The agent had to jump in, debug the GROQ query, and implement a bulletproof async wrapper for the params.&lt;br&gt;
It felt like true pair programming. We fought through dependency hell, fixed breaking changes, and came out the other side with a really cool, fully functioning app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sanity Project Details
&lt;/h2&gt;

&lt;p&gt;Project ID: iqopcrqz &lt;br&gt;
Dataset: production&lt;/p&gt;

&lt;p&gt;We used standard string fields for the metadata, strict arrays with options for Threat Levels, and PortableText blocks for the deep-dive containment procedures (which allowed us to map standard bold/italic marks to our custom React  components on the frontend).&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>sanitychallenge</category>
      <category>sanity</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
