<?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: simon levy</title>
    <description>The latest articles on DEV Community by simon levy (@simon_levy_e0b34a39073843).</description>
    <link>https://dev.to/simon_levy_e0b34a39073843</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%2F4157081%2F21d85301-6a32-4103-b3c4-77f4e9164d25.jpeg</url>
      <title>DEV Community: simon levy</title>
      <link>https://dev.to/simon_levy_e0b34a39073843</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/simon_levy_e0b34a39073843"/>
    <language>en</language>
    <item>
      <title>Runbook Repair Lab: Fixing Fictional Runbooks with Next.js and Sanity</title>
      <dc:creator>simon levy</dc:creator>
      <pubDate>Sat, 03 Oct 2026 14:33:29 +0000</pubDate>
      <link>https://dev.to/simon_levy_e0b34a39073843/runbook-repair-lab-fixing-fictional-runbooks-with-nextjs-and-sanity-4214</link>
      <guid>https://dev.to/simon_levy_e0b34a39073843/runbook-repair-lab-fixing-fictional-runbooks-with-nextjs-and-sanity-4214</guid>
      <description>&lt;p&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;/p&gt;

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

&lt;p&gt;The paper town starts with seven findings: missing prerequisites, incompatible tools, and downstream steps waiting for outputs that never appeared. A saved repair marks the prerequisites available and selects compatible releases. All three steps pass, and the original guide stays intact.&lt;/p&gt;

&lt;p&gt;Runbook Repair Lab is a Next.js app for exploring those dependencies. Its three fictional projects are &lt;strong&gt;Build a paper town&lt;/strong&gt;, &lt;strong&gt;Light a lantern garden&lt;/strong&gt;, and &lt;strong&gt;Stitch a pocket atlas&lt;/strong&gt;. Change their prerequisites, tool versions, or enabled steps to see what breaks and why. Every command is display text; nothing executes.&lt;/p&gt;

&lt;p&gt;Sanity stores the guides and their relationships, plus repair proposals with explicit approval or rejection decisions. A custom &lt;strong&gt;Repair review&lt;/strong&gt; Studio tool records those decisions. The public app can load a validated, approved repair into a visitor's local experiment.&lt;/p&gt;

&lt;p&gt;OpenAI Codex designed and implemented the app. The checker is deterministic TypeScript, with no AI calls at runtime. This is a &lt;strong&gt;Fully Autonomous&lt;/strong&gt; entry; the article was also AI-written from the source, build log, and verification evidence.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://runbook-repair-lab.simonlevy00.chatgpt.site/" rel="noopener noreferrer"&gt;Open Runbook Repair Lab&lt;/a&gt;. No login required.&lt;/p&gt;

&lt;h3&gt;
  
  
  Try the persisted repair
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Build a paper town&lt;/strong&gt; and choose &lt;strong&gt;Reset experiment&lt;/strong&gt;. You should see &lt;strong&gt;seven findings&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Try owner-approved repair&lt;/strong&gt;. It loads the saved Sanity proposal's conditions: &lt;strong&gt;Toy workspace&lt;/strong&gt; and &lt;strong&gt;Paper-town blueprint&lt;/strong&gt; available, &lt;strong&gt;Grove CLI v2&lt;/strong&gt;, &lt;strong&gt;Loom Engine v2&lt;/strong&gt;, and all three steps enabled. The result is &lt;strong&gt;three passing steps and zero findings&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Disable &lt;strong&gt;Prepare the town scene&lt;/strong&gt;. The preview step loses its &lt;code&gt;town-scene&lt;/code&gt; input, and the final step loses &lt;code&gt;town-preview&lt;/code&gt;. Re-enable the step or reset to explore again.&lt;/li&gt;
&lt;li&gt;Open &lt;strong&gt;Light a lantern garden&lt;/strong&gt;. Its proposal was rejected, so it has no owner-approved repair action. &lt;strong&gt;Try compatible conditions&lt;/strong&gt; still lets you explore a locally calculated repair.&lt;/li&gt;
&lt;/ol&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%2Faqjvy9grc9gngmzq1hwa.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%2Faqjvy9grc9gngmzq1hwa.png" alt="Paper-town baseline: seven findings, Grove CLI v1 and Loom Engine v4, with the persisted approved repair available." width="800" height="1174"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  How a proposal reaches that button
&lt;/h3&gt;

&lt;p&gt;The custom Studio workflow is &lt;strong&gt;create a pending proposal → approve or reject → rebuild the public snapshot&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Propose.&lt;/strong&gt; Studio calculates compatible conditions and stores a &lt;code&gt;repairProposal&lt;/code&gt; linked to the guide. The document includes selected prerequisites, tool references and versions, enabled-step state, and a fingerprint of the complete modeled content.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decide.&lt;/strong&gt; Approval checks that the proposal still matches the guide and its referenced content, then verifies that every step passes. Source and proposal revision guards commit with the decision in one atomic transaction. Rejection records the rejected state without changing the guide.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read back.&lt;/strong&gt; Real Sanity records show paper town moving from &lt;code&gt;pending&lt;/code&gt; to &lt;code&gt;approved&lt;/code&gt;, and lantern garden moving from &lt;code&gt;pending&lt;/code&gt; to &lt;code&gt;rejected&lt;/code&gt;. The garden proposal had compatible conditions; its rejection demonstrates that compatibility alone does not put a repair in the approved set. The published evidence does not record a rejection rationale.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build.&lt;/strong&gt; The public build independently validates approved proposals. Pending, rejected, stale, and malformed proposals are excluded. The included paper-town repair becomes an optional button that only changes the visitor's local experiment.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Who performed the decisions:&lt;/strong&gt; after I signed into Studio and authorized the work, the assistant created and decided both proposals using Windows UIAutomation confined to the authenticated Studio window. The UI label “owner-approved” refers to that approved record. This demonstration does not establish independent human review of the repair.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/simon-levy01/runbook-repair-lab/blob/f3c0fef8d5428ce1d186dd37d64e53a78e3a3e7f/docs/repair-workflow.md" rel="noopener noreferrer"&gt;Workflow implementation and live verification&lt;/a&gt; · &lt;a href="https://github.com/simon-levy01/runbook-repair-lab/blob/f3c0fef8d5428ce1d186dd37d64e53a78e3a3e7f/docs/workflow-evidence.json" rel="noopener noreferrer"&gt;Exact proposal IDs and machine-readable evidence&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%2Fg4r2h8dcgi7x6z8454pq.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%2Fg4r2h8dcgi7x6z8454pq.png" alt="The persisted approved repair loaded locally on mobile: both prerequisites supplied, compatible v2 tools, and all three steps passing." width="390" height="2753"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;These screenshots show the verified local export built from the actual reviewed Sanity records. The deployed app is also a &lt;strong&gt;static, build-time Sanity snapshot&lt;/strong&gt;, with its snapshot time displayed in UTC. Sanity content edits and review decisions require rebuilding and redeploying before visitors see them.&lt;/p&gt;

&lt;p&gt;Experiments are separate browser-local state. Each guide remembers its own conditions across refreshes; reset restores the published baseline. If storage is blocked, the app works for the visit and explains the limitation. Public visitors cannot approve proposals or write to Sanity.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/simon-levy01/runbook-repair-lab" rel="noopener noreferrer"&gt;MIT-licensed GitHub repository&lt;/a&gt; · &lt;a href="https://github.com/simon-levy01/runbook-repair-lab/blob/f3c0fef8d5428ce1d186dd37d64e53a78e3a3e7f/BUILD_LOG.md" rel="noopener noreferrer"&gt;Build log&lt;/a&gt; · &lt;a href="https://github.com/simon-levy01/runbook-repair-lab/blob/f3c0fef8d5428ce1d186dd37d64e53a78e3a3e7f/VERIFICATION.md" rel="noopener noreferrer"&gt;Verification record&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The repository includes the Next.js/React/TypeScript frontend, separate Studio configuration, schemas, fictional seed content, deterministic checker, and browser tests. Codex is credited in the README.&lt;/p&gt;

&lt;p&gt;The workflow is easiest to inspect in the &lt;a href="https://github.com/simon-levy01/runbook-repair-lab/blob/f3c0fef8d5428ce1d186dd37d64e53a78e3a3e7f/sanity/repairReview.tsx" rel="noopener noreferrer"&gt;Studio review tool&lt;/a&gt;, &lt;a href="https://github.com/simon-levy01/runbook-repair-lab/blob/f3c0fef8d5428ce1d186dd37d64e53a78e3a3e7f/web/lib/workflow.mjs" rel="noopener noreferrer"&gt;shared proposal validation and decision guards&lt;/a&gt;, and &lt;a href="https://github.com/simon-levy01/runbook-repair-lab/blob/f3c0fef8d5428ce1d186dd37d64e53a78e3a3e7f/web/lib/approved-repairs.ts" rel="noopener noreferrer"&gt;approved-repair build query&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;The build used OpenAI Codex on October 3, 2026. This is an account of implementation decisions and corrections, rather than a reconstructed prompt transcript.&lt;/p&gt;

&lt;h3&gt;
  
  
  Make each finding traceable
&lt;/h3&gt;

&lt;p&gt;The model uses ordered steps, declared inputs and outputs, and inclusive major-version ranges. An output becomes available only after an enabled step passes every check. Failed or skipped steps cannot supply outputs, and a later step cannot satisfy an earlier requirement.&lt;/p&gt;

&lt;p&gt;For paper town, &lt;strong&gt;Prepare the town scene&lt;/strong&gt; needs &lt;code&gt;workspace&lt;/code&gt; and &lt;code&gt;blueprint&lt;/code&gt;, plus Grove CLI v2–v3. It produces &lt;code&gt;town-scene&lt;/code&gt;. The next step consumes that capability and produces &lt;code&gt;town-preview&lt;/code&gt;; the final step consumes the preview. The seven initial findings follow from two missing starting capabilities, three version conflicts, and two unavailable downstream outputs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try compatible conditions&lt;/strong&gt; supplies declared prerequisites, re-enables steps, and chooses published releases that satisfy every relevant interval. It cannot invent releases, resolve conflicting intervals, or create a capability with no producer. Those problems remain findings requiring an author correction.&lt;/p&gt;

&lt;h3&gt;
  
  
  Invalidate repairs when their dependencies change
&lt;/h3&gt;

&lt;p&gt;Review found that checking only the guide revision missed edits to referenced tool and prerequisite documents. The correction was a fingerprint of the complete resolved content, with regression coverage. After a rebuild includes changed content, outdated saved experiments return to baseline. Invalid or corrupt stored experiments do too.&lt;/p&gt;

&lt;p&gt;The persisted workflow uses that same modeled-content fingerprint. Approval also guards the current revisions of the proposal and its dependencies, so a concurrent edit cannot silently receive an outdated approval. The transaction's dependency writes update guard metadata, leaving guide instructions, defaults, and tool releases unchanged.&lt;/p&gt;

&lt;p&gt;Two deliberately stale live transactions returned &lt;strong&gt;409&lt;/strong&gt;. Direct reads confirmed unchanged source and proposal revisions, including rollback when a later revision check failed. A valid anonymous same-value write attempt returned &lt;strong&gt;403&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Studio uses its normal signed-in client; no server write key or anonymous mutation endpoint was added. Existing project permissions protect writes. Administrators and other members already granted write access can still use the API directly, so these client-side checks are not server-enforced, per-document owner-only permissions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Make snapshot freshness explicit
&lt;/h3&gt;

&lt;p&gt;The Next.js frontend exports statically. Review exposed a persistent fetch-cache risk, so each build now reads current published Sanity data through server-only native HTTPS, with an eight-second timeout and one-megabyte response limit. Invalid or unavailable data fails the build instead of silently substituting sample content.&lt;/p&gt;

&lt;p&gt;This deployment needs no runtime token, AI key, SSR worker, or CORS change. Its deliberate tradeoff is a rebuild after content changes. Reduced cloud-build concurrency addressed resource usage without changing the checking rules.&lt;/p&gt;

&lt;h3&gt;
  
  
  Verify real data and browser behavior
&lt;/h3&gt;

&lt;p&gt;Early checks used explicitly labeled synthetic fixtures. Final verification used the actual public dataset and its real document IDs. The completed workflow extension records:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;20 passing deterministic unit tests&lt;/strong&gt;, including version boundaries, skipped/failed producers, conflicting intervals, stale/corrupt storage, proposal validation, and revision guards&lt;/li&gt;
&lt;li&gt;Passing frontend lint and TypeScript checks, Studio typechecking, and production builds&lt;/li&gt;
&lt;li&gt;Baseline findings of &lt;strong&gt;7, 7, and 6&lt;/strong&gt;, reduced to &lt;strong&gt;0, 0, and 0&lt;/strong&gt; with compatible conditions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Six passing real-data browser workflow groups&lt;/strong&gt; in the original verification, covering repair, reset, reload, guide isolation, and blocked/corrupt storage; stricter approval assertions were added later&lt;/li&gt;
&lt;li&gt;Responsive checks at &lt;strong&gt;1400, 768, 390, and 320 pixels&lt;/strong&gt;, zero browser page errors, and inspected desktop/mobile screenshots&lt;/li&gt;
&lt;li&gt;Source and exported-browser-asset secret-pattern checks before publication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;October 4 regression update:&lt;/strong&gt; review found that the earlier six-group suite allowed a missing approved action and did not assert garden exclusion; a separate screenshot/check script had supplied the latter evidence. The strengthened suite now requires exactly one paper-town approved action that yields three passing steps and zero findings, with reset restoring findings, plus no approved action for the rejected lantern garden or proposal-free pocket atlas. A fresh local build and the existing hosted demo each passed seven groups with zero uncaught JavaScript page exceptions. Three deliberately wrong action-count expectations were correctly rejected on each target. All 20 unit tests, lint, a fresh Next.js build, and Studio typecheck passed. Production code and schemas were unchanged; no redeploy or new Studio decision was needed. &lt;a href="https://github.com/simon-levy01/runbook-repair-lab/blob/22e5e440807a471b0dfb91a6bcbdb64c9e19823f/docs/approval-regression-evidence.json" rel="noopener noreferrer"&gt;Pinned regression evidence&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mobile inspection led to larger touch targets, clearer explanations, and experiment controls appearing before steps on narrow screens.&lt;/p&gt;

&lt;p&gt;The checker covers modeled capabilities and major-version intervals. It does not parse command syntax, infer semantic-version compatibility, or establish whether real-world instructions are safe or correct.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Project:&lt;/strong&gt; Runbook Repair Lab&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project ID:&lt;/strong&gt; &lt;code&gt;ipp6nys2&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dataset:&lt;/strong&gt; &lt;code&gt;production&lt;/code&gt; (public)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verified content:&lt;/strong&gt; 12 fictional documents: three tools, four prerequisites, three guides, and two reviewed repair proposals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The relationships carry the checking rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;&lt;code&gt;tool&lt;/code&gt;&lt;/strong&gt; lists published fictional major releases. Guide defaults and step requirements reference the same tool documents.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;&lt;code&gt;prerequisite&lt;/code&gt;&lt;/strong&gt; describes a starting capability. For example, the Toy workspace document supplies &lt;code&gt;workspace&lt;/code&gt;; guides reference it rather than duplicating its definition.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;&lt;code&gt;guide&lt;/code&gt;&lt;/strong&gt; references prerequisites and tools, and contains ordered steps with &lt;code&gt;needs&lt;/code&gt;, &lt;code&gt;gives&lt;/code&gt;, inert command examples, and inclusive &lt;code&gt;min&lt;/code&gt;/&lt;code&gt;max&lt;/code&gt; tool versions.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;&lt;code&gt;repairProposal&lt;/code&gt;&lt;/strong&gt; references its guide and selected tools, stores prerequisite IDs and conditions, and carries a content fingerprint, status, and timestamps. It preserves the decision separately from the guide's published starting conditions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A GROQ projection resolves the guide references into the checker's input and excludes draft guides. Build-time validation checks that response before export. Because a repair is tied to the resolved content, changing a referenced release list or prerequisite can invalidate it even when the guide document itself is unchanged.&lt;/p&gt;

&lt;p&gt;This version uses Sanity schemas, references, GROQ, and a custom Studio tool. It does not use App SDK, native Sanity Workflows, Context MCP, or a runtime agent. The public frontend has no real-time content subscription.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent Session
&lt;/h2&gt;

&lt;p&gt;No raw agent session is public. The &lt;a href="https://github.com/simon-levy01/runbook-repair-lab/blob/f3c0fef8d5428ce1d186dd37d64e53a78e3a3e7f/BUILD_LOG.md" rel="noopener noreferrer"&gt;sanitized build log&lt;/a&gt;, &lt;a href="https://github.com/simon-levy01/runbook-repair-lab/blob/f3c0fef8d5428ce1d186dd37d64e53a78e3a3e7f/VERIFICATION.md" rel="noopener noreferrer"&gt;verification record&lt;/a&gt;, and source document implementation decisions, failures, corrections, and checks without publishing private conversations or credentials.&lt;/p&gt;

&lt;p&gt;This revision incorporated review feedback from &lt;strong&gt;OpenAI Astra&lt;/strong&gt;, &lt;strong&gt;Claude Opus 5.5 High&lt;/strong&gt;, and &lt;strong&gt;Claude Sonnet 5.5 High&lt;/strong&gt;. Implementation remains credited to OpenAI Codex. The Claude reviews did not provide live browser verification.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>sanitychallenge</category>
      <category>sanity</category>
      <category>ai</category>
    </item>
    <item>
      <title>Rehearsal Mirror helps you find your own story before an interview</title>
      <dc:creator>simon levy</dc:creator>
      <pubDate>Fri, 02 Oct 2026 21:43:58 +0000</pubDate>
      <link>https://dev.to/simon_levy_e0b34a39073843/rehearsal-mirror-helps-you-find-your-own-story-before-an-interview-1d1n</link>
      <guid>https://dev.to/simon_levy_e0b34a39073843/rehearsal-mirror-helps-you-find-your-own-story-before-an-interview-1d1n</guid>
      <description>&lt;p&gt;Entry for &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;Someone close to me wants help organising real experiences into interview answers. I built Rehearsal Mirror around the step before writing an answer: finding an experience to draw on.&lt;/p&gt;

&lt;p&gt;A question about handling a calendar conflict might connect to a small piece of work that is easy to overlook: checking availability, finding another slot and making sure everyone received the change. The experience belongs to the person practising. The app's job is to help them find it and put it into words themselves.&lt;/p&gt;

&lt;p&gt;Rehearsal Mirror is a browser-local story bank and rehearsal space. You save experiences as &lt;strong&gt;Situation, Task, Action and Result (STAR)&lt;/strong&gt; cards, choose a practice question, and ask a small local AI model to retrieve related cards. It shows an excerpt copied from your notes, with a link back to the full card. You write your answer and practise with a 60- or 90-second timer.&lt;/p&gt;

&lt;p&gt;The pilot has 12 questions across personal-assistant, customer-support and administration roles. It has no answer generator, grammar grade or hiring score. Keeping the original experience visible is central to the design: a polished sentence would be unhelpful if it introduced something that never happened.&lt;/p&gt;

&lt;p&gt;I have not yet handed it to its intended recipient. The results below come from technical checks with fictional data; I cannot yet say whether it helps them prepare for an interview.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://rehearsal-mirror-private-pilot.simonlevy00.chatgpt.site/" rel="noopener noreferrer"&gt;Try Rehearsal Mirror&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The demo uses three fictional stories: a calendar collision, a delayed delivery and a duplicate invoice. They are labelled as examples throughout. No personal experience is needed to try the flow.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select &lt;strong&gt;Load fictional demo&lt;/strong&gt;. If you already have cards, export a backup first: loading the examples replaces those cards after confirmation.&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;Personal assistant&lt;/strong&gt; and the first question: “Two appointments overlap unexpectedly. How would you resolve the calendar conflict while keeping everyone informed?”&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Download &amp;amp; load local AI&lt;/strong&gt;. The first load needs internet and roughly 50 MB of model/runtime downloads, depending on compression. You can browse cards manually without loading the model.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;Find relevant stories&lt;/strong&gt;. In the recorded checks, &lt;strong&gt;Fictional · Calendar collision&lt;/strong&gt; ranked first. Open &lt;strong&gt;Review full card&lt;/strong&gt; to see the Situation, Task, Action and Result behind the excerpt.&lt;/li&gt;
&lt;li&gt;Write a short practice answer in your own words. Choose 60 or 90 seconds, then start, pause, resume or restart the timer as needed.&lt;/li&gt;
&lt;/ol&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%2F7es07ueb5j0jny2j037q.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%2F7es07ueb5j0jny2j037q.png" alt="Rehearsal Mirror showing the calendar-conflict question, a fictional practice answer and Calendar collision ranked first, with its original excerpt and a link to the full card." width="800" height="646"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Desktop capture from the local production-build test using the actual MiniLM model on October 3. The answer and all three stories are fictional. This is a local-build screenshot, not a hosted-site verification.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The calendar card's action is concrete: check attendees' availability, offer another time, update the calendar and send the revised details. Those are the notes the person can draw on. The model does not turn them into a script or add a more impressive result.&lt;/p&gt;

&lt;p&gt;For two more checks, try the upset-customer question and the administration question about correcting a record. The delayed-delivery and duplicate-invoice cards respectively ranked first in the original verification run. These are deliberately distinct examples, so they demonstrate the flow rather than establish retrieval accuracy.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/simon-levy01/rehearsal-mirror" rel="noopener noreferrer"&gt;Source code and local setup on GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The original application code is MIT-licensed. Model, library and runtime terms are recorded separately in the dependency notices. The repository includes source, tests, model provenance and licences; generated build output is excluded.&lt;/p&gt;

&lt;p&gt;With Node.js 22.12+ or 24 and Python 3 installed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm ci
npm run build
npm &lt;span class="nb"&gt;test
&lt;/span&gt;python tools/serve.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open &lt;code&gt;http://127.0.0.1:4173&lt;/code&gt; and leave the server running. For a browser-only Linux installation, the README explains how to skip the unused native CUDA download.&lt;/p&gt;

&lt;p&gt;The built app serves static files. There is no application backend, account system or upload endpoint.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Keep the source experience visible
&lt;/h3&gt;

&lt;p&gt;The retrieval model is the &lt;a href="https://huggingface.co/Xenova/all-MiniLM-L6-v2" rel="noopener noreferrer"&gt;Xenova ONNX conversion of all-MiniLM-L6-v2&lt;/a&gt;, running through &lt;a href="https://huggingface.co/docs/transformers.js/index" rel="noopener noreferrer"&gt;Transformers.js&lt;/a&gt; 3.8.1. The model is pinned to revision &lt;code&gt;751bff37182d3f1213fa05d7196b954e230abad9&lt;/code&gt;. Both the conversion and the &lt;a href="https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2" rel="noopener noreferrer"&gt;upstream Sentence Transformers model&lt;/a&gt; declare Apache-2.0 licensing.&lt;/p&gt;

&lt;p&gt;The quantized model runs in a dedicated browser worker through WebAssembly. Matching has two stages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Embed the selected question and each card as normalized, 384-dimensional vectors. Rank the cards by cosine similarity.&lt;/li&gt;
&lt;li&gt;For each of the top three cards, compare the question with its individual STAR fields. Display the closest field exactly as written.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That second step makes the result inspectable. Someone can read the excerpt, open the whole card and decide whether it belongs in their answer.&lt;/p&gt;

&lt;p&gt;There is an important limit: the closest card can still be a poor fit. With a nonempty story bank, a ranking can return something even when none of the experiences answers the question. Relatedness is only a prompt to review the notes. It cannot establish that an experience happened or that an answer is strong.&lt;/p&gt;

&lt;h3&gt;
  
  
  The bug appeared when rehearsal began
&lt;/h3&gt;

&lt;p&gt;The original October 2 verification recorded four passing unit checks and 18 passing browser checks. A later browser review found a problem that those checks had missed. The app could load the model and find the calendar story, but typing the first character of a practice answer made the matches disappear.&lt;/p&gt;

&lt;p&gt;The cause was in the UI state handling. The answer field called the shared save function on every keystroke. That function also cleared retrieval results and invalidated in-flight requests. Clearing was useful when the underlying story changed; doing it while writing an answer removed the reference at the moment it was needed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/simon-levy01/rehearsal-mirror/commit/be7a6c49f61d7162d93a24979171d52462f3334d" rel="noopener noreferrer"&gt;The follow-up source revision&lt;/a&gt; separates saving practice text from invalidating story matches. In the recorded local checks, typing an answer and changing the timer length preserve the retrieved cards. Changing the question, role or underlying stories clears matches that may be stale. Request and worker checks also prevent late replies from restoring an old result.&lt;/p&gt;

&lt;p&gt;This revision was deployed to the linked demo on October 4. Deployment and verification are separate: the screenshots and actual-model test results here come from the local production builds described below.&lt;/p&gt;

&lt;p&gt;The revision puts a fictional-demo shortcut in the empty matching area and explains that the closest card may still be unsuitable. A final recovery change restores manual mode and a usable download control even if clearing the model cache fails.&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%2F83jfxudhq1btcf2ljfc6.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%2F83jfxudhq1btcf2ljfc6.png" alt="Mobile layout with a fictional practice answer above the retained Calendar collision match and the other retrieved fictional stories." width="350" height="1976"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Local production-build capture from the same actual-model run, using a 390-pixel-wide mobile viewport. The answer and retrieved cards remain available in the stacked layout. This predates the final cache-recovery change.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The useful test is the whole sequence: find a story, begin an answer, and keep using the story. A correct ranking alone does not show that the rehearsal flow works.&lt;/p&gt;

&lt;h3&gt;
  
  
  Check the privacy claim at the network boundary
&lt;/h3&gt;

&lt;p&gt;Practice text is saved in this browser's local storage. Embeddings stay in worker memory. Model downloads contact Hugging Face and its file hosts, which receive ordinary connection metadata; stories and answers are not sent to a remote inference service.&lt;/p&gt;

&lt;p&gt;The follow-up actual-model run on October 3 passed 20 checks in Chrome on Windows, including the three fictional ranking cases and answer/timer preservation. Its network checks covered two specific boundaries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Text transmission:&lt;/strong&gt; distinct synthetic markers were entered into a story and an answer. Neither appeared in captured page or worker request URLs or bodies during the recorded flows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loaded-model offline inference:&lt;/strong&gt; a synthetic story was edited and matched with browser networking disabled after model loading. Matching succeeded without additional requests.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The offline check covers inference in an already loaded app. Startup after closing or reloading the page can still need internet.&lt;/p&gt;

&lt;p&gt;After the final cache-recovery change, the production build, four unit checks and nine controlled browser regression groups passed. Those browser tests control worker replies to exercise preservation, invalidation, late replies, retry and mobile layout; they do not run inference. The 20-check actual-model suite was not rerun after that final change. The &lt;a href="https://github.com/simon-levy01/rehearsal-mirror/blob/e21b69b3bfd7e213f5c5159dc8747b49261e0bbc/docs/verification-2026-10-04.md" rel="noopener noreferrer"&gt;dated verification report&lt;/a&gt; records the commits and scope of both runs. Later local and hosted controlled-worker runs each passed 9/9 groups with zero page errors and no model inference or downloads; the hosted run recorded two blocked same-origin Cloudflare POST attempts.&lt;/p&gt;

&lt;p&gt;There are other limits worth keeping visible. Browser storage and exported JSON backups are unencrypted, and clearing browser data can remove notes. Long text is truncated by the model, so concise cards work best. The three ranking examples are smoke tests. Other browsers, low-memory phones and full screen-reader accessibility have not been independently verified.&lt;/p&gt;

&lt;p&gt;The report also records unresolved dependency advisories and the affected native-codec and development-server surfaces. This UI fix does not resolve those advisories.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;The open model makes the automatic matching possible. Without it, this build supports manual card browsing but cannot retrieve stories by meaning.&lt;/p&gt;

&lt;p&gt;Running that model in the browser also fits the task. Personal practice notes can be compared with interview questions without sending those notes to a hosted inference endpoint. There is no per-query API charge, account or API key. The trade-off is an initial download and the memory and processing work on the person's device.&lt;/p&gt;

&lt;p&gt;The pinned weights, runtime and application source can be inspected separately. Someone adapting the app can change the question set or try another embedding model, then rerun the tests. That openness is useful precisely because this small model has limits: subtle experiences may be hard to distinguish, and a nearest match may still be irrelevant.&lt;/p&gt;

&lt;p&gt;The next useful test is with the intended recipient: can they add one truthful experience, find it for a relevant question and use it during a short rehearsal? That has not happened yet. It is the question this pilot is meant to answer.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI assistance
&lt;/h3&gt;

&lt;p&gt;Built using OpenAI Codex. OpenAI Codex and OpenAI writing tools provided substantial assistance with implementation, automated verification and this article. Claude Opus 5.5 High, Claude Sonnet 5.5 High and OpenAI Astra provided review feedback for this revision. Browser-verification claims come from the recorded browser checks described above; the Claude reviews did not run those checks. Technical claims are grounded in source code and recorded synthetic tests. No recipient testimonial or interview outcome has been generated or inferred.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>A CSV benchmark with two zero scores and a useful diagnostic</title>
      <dc:creator>simon levy</dc:creator>
      <pubDate>Fri, 02 Oct 2026 20:45:27 +0000</pubDate>
      <link>https://dev.to/simon_levy_e0b34a39073843/a-csv-benchmark-with-two-zero-scores-and-a-useful-diagnostic-n9e</link>
      <guid>https://dev.to/simon_levy_e0b34a39073843/a-csv-benchmark-with-two-zero-scores-and-a-useful-diagnostic-n9e</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/kaggle-2026-09-23"&gt;Kaggle Benchmarking Challenge&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Inventory reconciliation sounds straightforward: match a count to an exported product row and replace its new quantity. The difficult part is preserving everything else and recognizing when an update should be blocked.&lt;/p&gt;

&lt;p&gt;CSV Contract Integrity tests this with synthetic, offline inputs. Each model receives an export CSV, a count CSV, an explicit column mapping, and a reconciliation contract. It must return one JSON object containing a candidate CSV, row-level issues, and any fatal file error.&lt;/p&gt;

&lt;p&gt;Small differences matter. The SKU &lt;code&gt;0005&lt;/code&gt; is a string identifier. Locations &lt;code&gt;North&lt;/code&gt; and &lt;code&gt;north&lt;/code&gt; are distinct. A blank new-quantity cell differs from &lt;code&gt;0&lt;/code&gt;. Quoted fields can contain commas or newlines. Unknown columns must survive unchanged. Duplicate keys, conflicting values, and incomplete product information can block an update.&lt;/p&gt;

&lt;p&gt;The scorer allows harmless representation differences: reordered headers, CSV quote style, LF or CRLF line endings, and equivalent integer spellings in the editable quantity field. Every protected cell still requires exact string preservation. Candidate row order matters too.&lt;/p&gt;

&lt;p&gt;The source contains 72 fixtures: 48 original cases and 24 compositions. Twelve original cases are reserved for development, leaving 36 original evaluation cases plus 24 compositions in each reported run. Those compositions come from six recipes with four related transformations each. The suite is small and deliberately inspectable, with correlated cases rather than 60 independent samples of inventory work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Models Tested
&lt;/h2&gt;

&lt;p&gt;The current comparison uses &lt;a href="https://www.kaggle.com/code/simonlevy42/csv-inventory-contract-benchmark/output?scriptVersionId=354731097" rel="noopener noreferrer"&gt;Gemini 3.7 Flash&lt;/a&gt; (&lt;code&gt;google/gemini-3.7-flash&lt;/code&gt;) and &lt;a href="https://www.kaggle.com/code/simonlevy42/csv-inventory-contract-benchmark/output?scriptVersionId=354732397" rel="noopener noreferrer"&gt;Claude Haiku 4.5&lt;/a&gt; (&lt;code&gt;anthropic/claude-haiku-4-5@20251001&lt;/code&gt;) through Kaggle Model Proxy. Comparing two providers gives this narrow task more than one model response pattern to inspect.&lt;/p&gt;

&lt;p&gt;Both completed the same 60 selected cases under the frozen contract and scorer. Each case received a fresh chat. The task requested temperature 0, seed 0, no tools, and a maximum of 8,000 output tokens per response. These were text-generation calls, without an enforced JSON output schema or generated-code execution.&lt;/p&gt;

&lt;p&gt;An inspection of the installed SDK confirmed that its string-response path adds no formatting instruction and returns model text unchanged. The reported results therefore include the behavior of the configured model and provider interface, not an SDK operation that adds or removes code fences.&lt;/p&gt;

&lt;h2&gt;
  
  
  Findings
&lt;/h2&gt;

&lt;p&gt;Both models returned 60 nonempty responses. Both scored &lt;strong&gt;0/60 on the strict contract&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The primary score requires the raw response to satisfy the JSON interface and then match the allowed CSV semantics and issue report. A response wrapped in Markdown fails the raw JSON requirement even when its contents look correct to a reader.&lt;/p&gt;

&lt;p&gt;A separate post hoc diagnostic removed exactly one complete outer &lt;code&gt;json&lt;/code&gt; code fence. It accepted no surrounding prose, repaired no incomplete JSON, and made no other correction. It then applied the same scorer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gemini 3.7 Flash: &lt;strong&gt;59/60&lt;/strong&gt;, comprising 35/36 original cases and 24/24 compositions&lt;/li&gt;
&lt;li&gt;Claude Haiku 4.5: &lt;strong&gt;14/60&lt;/strong&gt;, comprising 14/36 original cases and 0/24 compositions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Post hoc saved-response analysis, October 4, 2026.&lt;/strong&gt; Following &lt;a href="https://dev.to/arhancanli/comment/3gbel"&gt;Arhan Canli’s request for a failure breakdown&lt;/a&gt;, I reanalyzed the saved responses from those same runs. No model was rerun, and the benchmark, adapter, and scorer were unchanged.&lt;/p&gt;

&lt;p&gt;The diagnostic outcomes split into:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Outcome&lt;/th&gt;
&lt;th&gt;Gemini&lt;/th&gt;
&lt;th&gt;Haiku&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Passed after one-fence removal&lt;/td&gt;
&lt;td&gt;59&lt;/td&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Parsed as JSON, then failed the contract&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;38&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Eligible for the adapter, but JSON did not parse&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ineligible for the adapter&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;td&gt;60&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All 52 adapter-eligible Haiku responses parsed as JSON. Its remaining 38 failures therefore concern the returned content, rather than another JSON parsing failure. The eight ineligible responses contained trailing explanation or multiple blocks; they stay in the denominator, and I do not extract a preferred block from them.&lt;/p&gt;

&lt;p&gt;These numbers answer two questions. The strict result measures whether the specified interface can consume the response directly and obtain a correct result. The diagnostic measures correctness after one narrowly defined formatting adjustment.&lt;/p&gt;

&lt;p&gt;Reporting only the zero scores would conceal the content differences that the diagnostic reveals. Presenting 59/60 or 14/60 as the official score would conceal the interface failures. Both views belong in the report.&lt;/p&gt;

&lt;p&gt;Gemini’s remaining case, &lt;code&gt;preservation-05&lt;/code&gt;, contains an unusually long identifier. Its response had incomplete JSON, an unclosed fence, and 448 visible characters, so it was ineligible for the adapter. Usage reported 7,996 output tokens against the requested 8,000 cap. That token total is not a visible-text length. The cause is unestablished; a larger budget is a follow-up experiment, not a demonstrated fix.&lt;/p&gt;

&lt;h3&gt;
  
  
  A warning that did not block the update
&lt;/h3&gt;

&lt;p&gt;One small case makes the content gap concrete. In &lt;code&gt;current_safety-05&lt;/code&gt;, export record 2 already has &lt;code&gt;On hand (new) = 7&lt;/code&gt;; its matching count requests &lt;code&gt;4&lt;/code&gt;. The contract says any nonempty existing new-quantity cell blocks that row.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Expected: a header-only candidate CSV and &lt;code&gt;NEW_VALUE_CONFLICT&lt;/code&gt; for export record 2.&lt;/li&gt;
&lt;li&gt;Haiku after fence removal: the same, correct issue report, &lt;strong&gt;plus the blocked row with its new quantity changed from &lt;code&gt;7&lt;/code&gt; to &lt;code&gt;4&lt;/code&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Gemini after fence removal: the expected header-only candidate and issue report.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recognizing the conflict was insufficient: the candidate also had to obey it. This is why the scorer checks both the issue report and the emitted rows.&lt;/p&gt;

&lt;p&gt;That pattern recurred. Among Haiku’s 38 parsed-but-wrong responses, 31 emitted at least one source row the contract prohibited; 33 had an incorrect issue report; 12 omitted at least one eligible row; and 7 changed at least one protected string value. These are &lt;strong&gt;overlapping descriptive flags&lt;/strong&gt;, not a partition or a count of independent causes. A response can both emit a blocked row and omit an eligible one.&lt;/p&gt;

&lt;p&gt;Two other cases show what those flags can hide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Exact strings:&lt;/strong&gt; in &lt;code&gt;preservation-04&lt;/code&gt;, Haiku returned the right new quantity but changed the SKU from &lt;code&gt;e\u0301&lt;/code&gt; (U+0065 followed by U+0301) to &lt;code&gt;\u00e9&lt;/code&gt; (U+00E9). The glyphs can look alike; the identifier strings differ. Gemini preserved the original string.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validation across locations:&lt;/strong&gt; in &lt;code&gt;composition-v3-04-01&lt;/code&gt;, one variant has packed dimensions at location &lt;code&gt;L&lt;/code&gt; and blank dimensions at &lt;code&gt;Other&lt;/code&gt;, which has no matching count. The contract still requires consistency across both locations and blocks the whole variant. Haiku reported &lt;code&gt;PACKED_INCONSISTENT&lt;/code&gt; at &lt;code&gt;Other&lt;/code&gt; but emitted the row at &lt;code&gt;L&lt;/code&gt;; Gemini excluded both and updated only the unrelated eligible variant.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These examples describe the saved outputs. They do not establish what internal reasoning produced them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where the failures occurred
&lt;/h3&gt;

&lt;p&gt;For the 36 original evaluation cases, each source-defined family contains six cases. These are case-family results under the one-fence diagnostic, not independent pass rates for every contract clause:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Original case family&lt;/th&gt;
&lt;th&gt;Gemini passes&lt;/th&gt;
&lt;th&gt;Haiku passes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Exact joins&lt;/td&gt;
&lt;td&gt;6/6&lt;/td&gt;
&lt;td&gt;1/6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protected-cell preservation&lt;/td&gt;
&lt;td&gt;5/6&lt;/td&gt;
&lt;td&gt;4/6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Current quantity and update safety&lt;/td&gt;
&lt;td&gt;6/6&lt;/td&gt;
&lt;td&gt;1/6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ambiguity and unmatched records&lt;/td&gt;
&lt;td&gt;6/6&lt;/td&gt;
&lt;td&gt;0/6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quantity semantics&lt;/td&gt;
&lt;td&gt;6/6&lt;/td&gt;
&lt;td&gt;4/6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CSV format&lt;/td&gt;
&lt;td&gt;6/6&lt;/td&gt;
&lt;td&gt;4/6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total&lt;/td&gt;
&lt;td&gt;35/36&lt;/td&gt;
&lt;td&gt;14/36&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The 24 compositions combine rules in six recipes, with four related transformations per recipe:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Recipe and main interaction&lt;/th&gt;
&lt;th&gt;Gemini passes&lt;/th&gt;
&lt;th&gt;Haiku passes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1: exact keys, invalid counts, unmatched rows&lt;/td&gt;
&lt;td&gt;4/4&lt;/td&gt;
&lt;td&gt;0/4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2: duplicate export and count keys&lt;/td&gt;
&lt;td&gt;4/4&lt;/td&gt;
&lt;td&gt;0/4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3: existing values, blank quantities, zero&lt;/td&gt;
&lt;td&gt;4/4&lt;/td&gt;
&lt;td&gt;0/4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4: packed dimensions across locations&lt;/td&gt;
&lt;td&gt;4/4&lt;/td&gt;
&lt;td&gt;0/4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5: product-wide option completeness&lt;/td&gt;
&lt;td&gt;4/4&lt;/td&gt;
&lt;td&gt;0/4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6: duplicate variant/location and not-stocked rows&lt;/td&gt;
&lt;td&gt;4/4&lt;/td&gt;
&lt;td&gt;0/4&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Recipe 3 has one adapter-ineligible Haiku response; all other composition failures parsed as JSON. Every one of those 23 parseable composition responses emitted a row the contract should have blocked. The pattern spans all six recipes, but the four variants within each recipe share ingredients. These results do not identify 24 independent failures or six independent causes.&lt;/p&gt;

&lt;p&gt;The comparison is descriptive. It does not establish a general ranking of these model families. A different prompt, structured-output interface, token budget, provider configuration, or repeat run could produce different results.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the benchmark cannot establish
&lt;/h3&gt;

&lt;p&gt;This is conservative offline validation. No Shopify import or real inventory change was performed. A failed contract verdict does not demonstrate inventory damage.&lt;/p&gt;

&lt;p&gt;The emitted-row mutation diagnostic also has a narrower meaning: it counts unexpected emitted rows relative to the expected candidate. Omitted rows fail overall correctness but are not counted as emitted-row mutations. For both models, all 60 primary responses failed JSON parsing and mutation remained unassessed. Unknown must never become “zero damage.”&lt;/p&gt;

&lt;p&gt;Coverage is incomplete. Several error branches in the written contract have no evaluation fixture in this version. Expected outputs and grading code also need scrutiny: passing expected answers through the scorer checks consistency, not the independent correctness of every label.&lt;/p&gt;

&lt;h3&gt;
  
  
  What to measure next
&lt;/h3&gt;

&lt;p&gt;A useful next experiment would predeclare separate interface conditions: the existing raw-text prompt, a one-fence adapter, and supported structured-output modes. Their scores should remain separate rather than retroactively changing this benchmark's primary metric.&lt;/p&gt;

&lt;p&gt;Further work should vary the output budget for long preservation cases, add independently authored cases, fill the coverage gaps, and repeat runs. The current results are one completed run per model, without a formal statistical generalization claim.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Benchmark
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.kaggle.com/benchmarks/simonlevy42/csv-contract-integrity" rel="noopener noreferrer"&gt;CSV Contract Integrity on Kaggle&lt;/a&gt; contains the &lt;a href="https://www.kaggle.com/benchmarks/tasks/simonlevy42/csv-inventory-contract-integrity-v6" rel="noopener noreferrer"&gt;CSV Inventory Contract Integrity task&lt;/a&gt;. The collection and task are now published publicly on Kaggle.&lt;/p&gt;

&lt;p&gt;The benchmark's primary result is the mean of 60 strict binary verdicts. Source materials retain the contract, fixtures, expected outputs, scorer, request hashes, raw responses, usage, and separate diagnostics. These make the evaluation inspectable; requested seeds do not guarantee identical future provider output. There is no hidden-test claim or production-safety guarantee.&lt;/p&gt;

&lt;p&gt;To inspect the examples above, open the saved Kaggle outputs for &lt;a href="https://www.kaggle.com/code/simonlevy42/csv-inventory-contract-benchmark/output?scriptVersionId=354731097" rel="noopener noreferrer"&gt;Gemini, script version 354731097&lt;/a&gt; or &lt;a href="https://www.kaggle.com/code/simonlevy42/csv-inventory-contract-benchmark/output?scriptVersionId=354732397" rel="noopener noreferrer"&gt;Haiku, script version 354732397&lt;/a&gt;. Each includes &lt;code&gt;primary-report.json&lt;/code&gt; with case IDs and raw responses, plus &lt;code&gt;posthoc-diagnostics.json&lt;/code&gt;. The offline reanalysis verified all 120 saved request hashes and reproduced all saved primary and one-fence verdicts. This checks replay consistency, not independent correctness of the expected answers.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/simon-levy01/csv-contract-integrity-analysis/blob/7a7c2953aa74eb3da48bd3c4177b270bf3b63042/README.md" rel="noopener noreferrer"&gt;pinned offline reproducibility supplement&lt;/a&gt; contains the saved evidence, analysis code, and tests. With Python 3.8 or later, run &lt;code&gt;python3 -B analyze.py&lt;/code&gt; from the downloaded repository folder to verify hashes, replay the saved verdicts, and regenerate the breakdowns. Once downloaded, it needs no network access, provider credentials, or model inference. Replay checks consistency with the frozen scorer; it does not independently validate the expected answers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI disclosure: Fully Autonomous.&lt;/strong&gt; AI assistance was used to create the prototype, synthetic fixtures, grading code, tests, documentation, and this article. The article was drafted primarily by an AI agent. This revision used Codex, with reviews from Astra, Claude Opus 5.5 High, and Claude Sonnet 5.5 High. The grader itself does not use an LLM judge.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>kagglechallenge</category>
      <category>ai</category>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
