<?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: Shaikh Ubaid Ahmed</title>
    <description>The latest articles on DEV Community by Shaikh Ubaid Ahmed (@shaikhubaidahmed).</description>
    <link>https://dev.to/shaikhubaidahmed</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%2F541230%2F3e71fac2-421c-43ba-900d-edac6c8781a2.png</url>
      <title>DEV Community: Shaikh Ubaid Ahmed</title>
      <link>https://dev.to/shaikhubaidahmed</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shaikhubaidahmed"/>
    <language>en</language>
    <item>
      <title>TempoDesk: I turned lesson scribbles into private practice plans with local Gemma</title>
      <dc:creator>Shaikh Ubaid Ahmed</dc:creator>
      <pubDate>Sun, 18 Oct 2026 16:12:27 +0000</pubDate>
      <link>https://dev.to/shaikhubaidahmed/tempodesk-i-turned-lesson-scribbles-into-private-practice-plans-with-local-gemma-l7</link>
      <guid>https://dev.to/shaikhubaidahmed/tempodesk-i-turned-lesson-scribbles-into-private-practice-plans-with-local-gemma-l7</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;A music lesson rarely ends when the student leaves.&lt;/p&gt;

&lt;p&gt;Independent teachers still have to turn hurried notes such as "left hand tense in bars 9 to 12, count aloud, C major fingering slipped down" into something a student can actually practise. Then they often write a second version for a parent and decide what to check next week. Multiply that by a full afternoon of students and the unpaid admin adds up quickly.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;TempoDesk&lt;/strong&gt;, a local-first planning assistant for independent music teachers. A teacher pastes rough lesson notes, chooses the student's instrument and available practice time, and TempoDesk produces:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a realistic, time-boxed practice plan;&lt;/li&gt;
&lt;li&gt;wins worth reinforcing and focus areas for the week;&lt;/li&gt;
&lt;li&gt;a student-friendly recap;&lt;/li&gt;
&lt;li&gt;a concise parent update;&lt;/li&gt;
&lt;li&gt;measurable checkpoints for the next lesson; and&lt;/li&gt;
&lt;li&gt;explicit questions wherever the notes do not contain enough information.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lesson notes can contain details about children, their progress, and their schedules. TempoDesk sends them only to an Ollama server on the teacher's own computer. The settings screen rejects non-localhost model URLs, and the browser never stores lesson notes.&lt;/p&gt;

&lt;p&gt;Who would pay for it? The target user is a solo music teacher with 15 to 40 students who loses an hour or two each week to follow-up messages and practice-plan admin. My proposed product is a ₹799 (about $10) packaged edition with a one-click installer and setup help. The open-source web version remains free. Teachers would pay once for easier setup and support, with no subscription.&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%2F1eshhffwjfusgaczde4i.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%2F1eshhffwjfusgaczde4i.png" alt="TempoDesk generating a five-day piano practice brief" width="800" height="1054"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://shaikhubaidahmed.github.io/tempodesk/" rel="noopener noreferrer"&gt;Open the live TempoDesk demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The hosted demo includes a &lt;strong&gt;Preview sample plan&lt;/strong&gt; button, so it can be explored without installing a model. The sample is labeled clearly and does not pretend to be a live AI response.&lt;/p&gt;

&lt;p&gt;Run it locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull gemma3:4b
npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Then open &lt;code&gt;http://localhost:4173&lt;/code&gt; and select &lt;strong&gt;Use example&lt;/strong&gt;. If Ollama is not available, &lt;strong&gt;Preview sample plan&lt;/strong&gt; shows the complete product flow without pretending that the sample came from a live model.&lt;/p&gt;

&lt;p&gt;For a screenshot-ready demo state, open &lt;code&gt;http://localhost:4173/?demo=1&lt;/code&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/shaikhubaidahmed" rel="noopener noreferrer"&gt;
        shaikhubaidahmed
      &lt;/a&gt; / &lt;a href="https://github.com/shaikhubaidahmed/tempodesk" rel="noopener noreferrer"&gt;
        tempodesk
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Private, local-first practice-plan assistant for independent music teachers, powered by Gemma through Ollama.
    &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;TempoDesk&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;TempoDesk is a local-first lesson-planning assistant for independent music teachers. Paste rough lesson notes and a local Gemma model turns them into a realistic weekly practice plan, a student recap, a parent update, and concrete next-lesson checkpoints.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://shaikhubaidahmed.github.io/tempodesk/" rel="nofollow noopener noreferrer"&gt;https://shaikhubaidahmed.github.io/tempodesk/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No student notes are sent to a hosted AI service. The browser talks directly to &lt;a href="https://ollama.com/" rel="nofollow noopener noreferrer"&gt;Ollama&lt;/a&gt; on &lt;code&gt;localhost&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/shaikhubaidahmed/tempodesk/assets/tempodesk-demo.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fshaikhubaidahmed%2Ftempodesk%2FHEAD%2Fassets%2Ftempodesk-demo.png" alt="TempoDesk desktop demo showing a generated piano practice plan"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why this exists&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Independent music teachers often finish a day with shorthand notes and several follow-up messages still to write. Generic AI tools can help, but uploading notes about students—often minors—to a third-party service is a poor default. TempoDesk keeps that workflow on the teacher's own computer and turns the output into something immediately useful.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Local Gemma inference through Ollama; no account or API key&lt;/li&gt;
&lt;li&gt;Evidence-grounded prompt that records missing information instead of inventing it&lt;/li&gt;
&lt;li&gt;Exactly time-boxed practice days with observable goals&lt;/li&gt;
&lt;li&gt;Ready-to-send student and parent messages&lt;/li&gt;
&lt;li&gt;Keyboard-accessible tabs…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/shaikhubaidahmed/tempodesk" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;a href="https://github.com/shaikhubaidahmed/tempodesk" rel="noopener noreferrer"&gt;Browse the source code on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project is MIT licensed, dependency-free at runtime, and includes focused tests for input validation, prompt construction, Ollama response parsing, output normalization, and copyable plan formatting.&lt;/p&gt;

&lt;p&gt;I also tested the complete local model path with &lt;code&gt;gemma3:4b&lt;/code&gt;: Ollama returned schema-valid JSON with the requested number of practice days and exact per-day minute totals.&lt;/p&gt;
&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;TempoDesk is a small static web app built with semantic HTML, CSS, and JavaScript. It talks directly to Ollama's local &lt;code&gt;/api/chat&lt;/code&gt; endpoint and uses &lt;strong&gt;Gemma 3 4B&lt;/strong&gt; as its default open-weight model.&lt;br&gt;
&lt;/p&gt;
&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
  A[Teacher's browser] --&amp;gt;|lesson notes| B[Evidence-grounded prompt]
  B --&amp;gt;|localhost only| C[Ollama]
  C --&amp;gt; D[Gemma 3 4B]
  D --&amp;gt;|JSON matching a schema| E[Deterministic validator]
  E --&amp;gt; F[Practice plan + messages + checkpoints]&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;The model and ordinary code have separate jobs.&lt;/p&gt;

&lt;p&gt;Gemma handles the part that benefits from language understanding: reading messy teaching shorthand, finding the learning priorities, adapting the tone for a student or parent, and turning observations into clear practice targets.&lt;/p&gt;

&lt;p&gt;JavaScript handles predictable checks. TempoDesk validates the JSON, trims unbounded lists, enforces the requested number of practice days, reconciles every day's block minutes, escapes all rendered content through DOM text nodes, and falls back to safe defaults when a field is missing.&lt;/p&gt;

&lt;p&gt;The prompt has a strict evidence rule. When the teacher leaves out a useful fact, the model adds a question to &lt;code&gt;unknowns&lt;/code&gt;. In the sample, it asks which tempo is comfortable because the notes contain no metronome number.&lt;/p&gt;

&lt;p&gt;The interface was designed around a fast two-step workflow: notes on the left, a sendable plan on the right. It includes visible labels and focus states, keyboard-operable tabs, an error summary that receives focus, 44px-or-larger controls, reduced-motion support, and responsive layouts tested at desktop and 390px mobile widths.&lt;/p&gt;
&lt;h3&gt;
  
  
  Scope choices
&lt;/h3&gt;

&lt;p&gt;The MVP does not keep a student database, sync notes, send messages automatically, or require an account. Those features would weaken the privacy story and expand the project before the core workflow was proven.&lt;/p&gt;

&lt;p&gt;The local-model dependency stays visible. The interface shows the connection status and settings, errors explain how to install the model, and the offline sample is clearly labeled.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;Open weights change the economics and the trust model of this product.&lt;/p&gt;

&lt;p&gt;A cloud AI version would create a recurring inference bill for every lesson plan. I would either have to charge a subscription, ration usage, or silently send sensitive lesson notes to another company. Local Gemma makes the marginal inference cost effectively zero after the teacher owns the laptop and downloads the model. That makes a low-cost one-time license believable for a solo teacher.&lt;/p&gt;

&lt;p&gt;It also gives the teacher control. They can work without an internet connection, choose a smaller Gemma model for an older laptop, inspect the prompt, change the behavior, or replace the model entirely. Their notes do not become someone else's data-retention decision, and the product does not break because an API price or policy changes.&lt;/p&gt;

&lt;p&gt;Gemma performs the central transformation. Without its ability to interpret unstructured lesson observations and produce audience-specific language, TempoDesk would be a rigid form template.&lt;/p&gt;
&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Best Use of Gemma: Gemma 3 runs locally through Ollama and performs the lesson-notes-to-practice-plan transformation.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The &lt;code&gt;unknowns&lt;/code&gt; field was more effective than adding another instruction to "be accurate." It gives missing information somewhere to go, so the model can ask for a tempo, fingering edition, or deadline when the notes do not supply one.&lt;/p&gt;

&lt;p&gt;Local-first UX needs to treat model setup as part of the product. A private architecture still needs a visible connection state, an actionable missing-model error, a smaller-model option, and a demo path that works before a multi-gigabyte download finishes.&lt;/p&gt;

&lt;p&gt;TempoDesk covers one lesson at a time and produces one useful week. Keeping that boundary made the workflow specific enough for a teacher to use.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>opensource</category>
    </item>
    <item>
      <title>AccessPath-ai: I built my sibling a subway planner that won't strand him when a lift breaks</title>
      <dc:creator>Shaikh Ubaid Ahmed</dc:creator>
      <pubDate>Mon, 05 Oct 2026 03:28:38 +0000</pubDate>
      <link>https://dev.to/shaikhubaidahmed/accesspath-ai-i-built-my-sibling-a-subway-planner-that-wont-strand-him-when-a-lift-breaks-3cj</link>
      <guid>https://dev.to/shaikhubaidahmed/accesspath-ai-i-built-my-sibling-a-subway-planner-that-wont-strand-him-when-a-lift-breaks-3cj</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;My sibling relies on step-free transit. A route planner can call a trip accessible and still send them through a transfer that becomes unusable when one lift fails. The usual route card does not say which equipment the journey depends on, when it was last checked, or where to go if it stops working.&lt;/p&gt;

&lt;p&gt;I built AccessPath for that situation. It plans step-free NYC Subway journeys, checks the equipment and outage evidence behind each route, and prepares another valid route when the first one breaks. The rider's requirements stay fixed even when the network changes.&lt;/p&gt;

&lt;p&gt;The demo starts at Grand Central-42 St and ends at Astoria Blvd. Plan A changes from the 7 to the N at Queensboro Plaza. I inject a clearly labelled failure of the transfer lift, which invalidates that plan and runs the graph search again. Plan B keeps the step-free requirement and transfers at Times Sq-42 St.&lt;/p&gt;

&lt;p&gt;Both routes stay on screen so the change is easy to inspect. The result also includes current warnings, model confidence, source timestamps, and an evidence ledger. A simulated outage is always labelled as a simulation, never as a live MTA fact.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Live app: &lt;a href="https://accesspath-ai.onrender.com" rel="noopener noreferrer"&gt;https://accesspath-ai.onrender.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Video-demo: &lt;a href="https://youtu.be/bitCWvo5Fdk" rel="noopener noreferrer"&gt;https://youtu.be/bitCWvo5Fdk&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the stable judging path:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Leave Grand Central-42 St and Astoria Blvd selected.&lt;/li&gt;
&lt;li&gt;Keep Step-free and Short transfers checked.&lt;/li&gt;
&lt;li&gt;Choose Outage demo.&lt;/li&gt;
&lt;li&gt;Press Build my access plan.&lt;/li&gt;
&lt;li&gt;Compare the interrupted Queensboro Plaza route with the Times Square reroute.&lt;/li&gt;
&lt;li&gt;Open Evidence and review the sources, timestamps, and confidence labels.&lt;/li&gt;
&lt;li&gt;Play the spoken journey briefing.&lt;/li&gt;
&lt;/ol&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/shaikhubaidahmed" rel="noopener noreferrer"&gt;
        shaikhubaidahmed
      &lt;/a&gt; / &lt;a href="https://github.com/shaikhubaidahmed/accesspath-ai" rel="noopener noreferrer"&gt;
        accesspath-ai
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Evidence-first accessible journey planner for transit riders.
    &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;AccessPath&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;AccessPath is an evidence-first journey planner for riders who depend on step-free transit. It checks the infrastructure a route needs, shows the source behind each access claim, and calculates a backup when a lift failure invalidates the original trip.&lt;/p&gt;
&lt;p&gt;The working demonstration plans a trip from Grand Central-42 St to Astoria Blvd. Its original route changes at Queensboro Plaza. A clearly labelled simulated transfer-lift outage blocks that interchange, so the planner finds a second route through Times Sq-42 St without relaxing the rider's step-free requirement.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why this project exists&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Most route planners treat accessibility as a filter attached to a station. A wheelchair user needs a stronger answer. The station entrance, platform, direction of travel, transfer path, and the equipment serving them all have to work at the same time.&lt;/p&gt;
&lt;p&gt;My sibling relies on step-free transit, but ordinary route planners do not reliably account for inaccessible transfers or elevator…&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/shaikhubaidahmed/accesspath-ai" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The repository contains the app, tests, deployment manifests, and a reproducible public-data pipeline. It also includes the TabPFN benchmark, the Tinker training and evaluation pipeline, and partner activation evidence. A checked-in replay fixture keeps the judging path available when an external service is down.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/shaikhubaidahmed/accesspath-ai.git
&lt;span class="nb"&gt;cd &lt;/span&gt;accesspath-ai
npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Where models and code separate
&lt;/h3&gt;

&lt;p&gt;I decided early that the model should interpret what a rider says, while official data and deterministic code should decide whether a route is usable.&lt;/p&gt;

&lt;p&gt;When configured, Gemma turns a short rider note into typed preferences such as &lt;code&gt;stepFree&lt;/code&gt;, &lt;code&gt;avoidLongWalks&lt;/code&gt;, and &lt;code&gt;needsAccessibleToilet&lt;/code&gt;. It also writes a short briefing after the route has been calculated. Gemma cannot mark a station accessible, clear an outage, or loosen a hard preference to save time.&lt;/p&gt;

&lt;p&gt;Official MTA records and the graph search handle those decisions. AccessPath checks every start, arrival, and transfer point. It adds a larger cost to transfers when the rider asks for shorter station changes, and it blocks an interchange when an outage affects a required platform path.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Mastra workflow
&lt;/h3&gt;

&lt;p&gt;Mastra runs the planning process as five typed steps:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rider note
  -&amp;gt; interpret access needs
  -&amp;gt; resolve MTA evidence
  -&amp;gt; compute constrained route
  -&amp;gt; explain verified result
  -&amp;gt; ground extra official evidence
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Each step returns &lt;code&gt;complete&lt;/code&gt; or &lt;code&gt;fallback&lt;/code&gt;, along with its duration and a plain-language detail. If local Gemma is down, the workflow keeps the rider's explicit checkbox choices and uses local rules. If the live MTA endpoint times out, it switches to the recorded response and reports the fallback in the workflow result.&lt;/p&gt;
&lt;h3&gt;
  
  
  Building the transit graph
&lt;/h3&gt;

&lt;p&gt;The data script combines the MTA Subway Stations dataset with Regular Subway GTFS. Adjacent stops become travel edges, while connections inside station complexes become walking edges. Equipment and outage feeds provide the current infrastructure state. Monthly availability records provide the reliability history.&lt;/p&gt;

&lt;p&gt;The processed graph currently contains 496 stops and the travel and interchange edges used for routing. &lt;code&gt;npm run data:sync&lt;/code&gt; rebuilds it from the official endpoints.&lt;/p&gt;

&lt;p&gt;There are three evidence modes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Live asks the current MTA outage feed.&lt;/li&gt;
&lt;li&gt;Replay uses a timestamped response for a stable demonstration.&lt;/li&gt;
&lt;li&gt;Outage demo adds one local, labelled Queensboro Plaza transfer-lift failure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each claim in the evidence ledger has a source type, URL, observation time, freshness note, and confidence level.&lt;/p&gt;
&lt;h3&gt;
  
  
  Estimating lift risk with TabPFN
&lt;/h3&gt;

&lt;p&gt;The outage feed tells AccessPath what is broken now. TabPFN estimates which lift dependencies deserve more caution based on their history.&lt;/p&gt;

&lt;p&gt;The pipeline uses monthly MTA availability and unscheduled-outage records. It creates one-month lags and three-month rolling features, then reserves the latest 20 percent of months for testing. Keeping the split chronological prevents future months from leaking into training.&lt;/p&gt;

&lt;p&gt;I compare TabPFN with a histogram gradient-boosting baseline using balanced accuracy, F1, ROC AUC, and runtime. A real TabPFN run writes station-complex forecasts that the TypeScript route engine loads directly.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Balanced accuracy&lt;/th&gt;
&lt;th&gt;F1&lt;/th&gt;
&lt;th&gt;ROC AUC&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Baseline&lt;/td&gt;
&lt;td&gt;0.7878&lt;/td&gt;
&lt;td&gt;0.8574&lt;/td&gt;
&lt;td&gt;0.8908&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TabPFN&lt;/td&gt;
&lt;td&gt;0.7888&lt;/td&gt;
&lt;td&gt;0.8583&lt;/td&gt;
&lt;td&gt;0.8946&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The script writes a &lt;code&gt;tabpfn&lt;/code&gt; artifact only when it has run with a real token. Fallback scores use a different label.&lt;/p&gt;
&lt;h3&gt;
  
  
  Fine-tuning the preference extractor with Tinker
&lt;/h3&gt;

&lt;p&gt;The Tinker pipeline fine-tunes Qwen3.5-4B for one task: turning a rider's plain-language note into five typed constraints. The dataset covers wheelchair use, fatigue, crowd sensitivity, toilet access, and explicit walking limits. Four examples are kept out of training for evaluation.&lt;/p&gt;

&lt;p&gt;The script evaluates the base model, performs 12 supervised LoRA updates, and evaluates the same holdout again. It records exact JSON match, per-field accuracy, loss, and elapsed time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Base exact match: &lt;strong&gt;0.0%&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Fine-tuned exact match: &lt;strong&gt;50.0%&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Base field accuracy: &lt;strong&gt;0.0%&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Fine-tuned field accuracy: &lt;strong&gt;90.0%&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Training loss: &lt;strong&gt;1.2858&lt;/strong&gt; (step 00) → &lt;strong&gt;0.0002&lt;/strong&gt; (step 11)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The complete 12-step loss sequence was:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1.2858 → 0.1938 → 0.0861 → 0.0591 → 0.0380 → 0.0320
       → 0.0219 → 0.0125 → 0.0042 → 0.0020 → 0.00022 → 0.00019
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;On the four-example holdout, the base model produced no parseable JSON. The fine-tuned model matched two examples exactly and got 18 of 20 individual fields right.&lt;/p&gt;

&lt;p&gt;The authenticated rerun preserved the baseline and fine-tuned sampler checkpoints under Tinker training model &lt;code&gt;828027e1-aa15-5721-abd1-eee47c49e1fd:train:0&lt;/code&gt;. Their complete &lt;code&gt;tinker://&lt;/code&gt; paths, model identity, dependency versions, and holdout outputs are in &lt;code&gt;training/reports/tinker-evaluation.json&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Monitoring a route with Temporal
&lt;/h3&gt;

&lt;p&gt;A route planned now may be wrong by the time the rider leaves. The Temporal workflow checks live evidence on a timer, retries failed planning activities with exponential backoff, compares the new route with the previous one, and records any change. If a worker restarts, Temporal reconstructs the monitor from its event history.&lt;/p&gt;

&lt;p&gt;I would use this monitor for the hours before a concert or appointment. It records route changes without requiring a browser tab to stay open.&lt;/p&gt;
&lt;h3&gt;
  
  
  What the other services do
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;ElevenLabs speaks the evidence-bound route briefing. Browser speech synthesis remains available when the API is not configured.&lt;/li&gt;
&lt;li&gt;Backboard runs the same held-out extraction notes through three open models and records field accuracy, latency, resolved model, and cost.&lt;/li&gt;
&lt;li&gt;MongoDB Atlas stores expiring journey-plan documents.&lt;/li&gt;
&lt;li&gt;Tiger Data stores source claims as timestamped evidence events for later time-aware retrieval.&lt;/li&gt;
&lt;li&gt;SerpApi adds a current result from an official domain when destination evidence is needed.&lt;/li&gt;
&lt;li&gt;Sentry wraps the planning workflow in an agent span and captures API failures.&lt;/li&gt;
&lt;li&gt;The Render Blueprint deploys the public web application from the Docker image.&lt;/li&gt;
&lt;li&gt;The DigitalOcean manifests deploy either the application or the private Ollama and Gemma inference service.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Technical checks
&lt;/h3&gt;

&lt;p&gt;The current repository passes:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;4 test files
11 tests
Oxc TypeScript lint
TypeScript client check
TypeScript server check
Vite production build
npm audit: 0 vulnerabilities
production SPA and API smoke test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The tests cover the hard access constraint and the Queensboro Plaza reroute. They also check TabPFN forecast loading with historical fallbacks, evidence labels, all five Mastra steps, malformed API input, health metadata, and Temporal's degraded response.&lt;/p&gt;
&lt;h2&gt;
  
  
  Focus on open-source infrastructure
&lt;/h2&gt;

&lt;p&gt;A rider may write about wheelchair use, pain, fatigue, or toilet access. AccessPath can process that note with Gemma running through Ollama beside the app, including on a laptop, instead of requiring a closed model provider.&lt;/p&gt;

&lt;p&gt;Mastra keeps the orchestration readable and replaceable. The deterministic fallback still enforces hard requirements when no model service is available. If another open-weight model handles the extraction task better, the Backboard benchmark and Tinker evaluation let me measure the difference without rebuilding the product around one vendor.&lt;/p&gt;

&lt;p&gt;The same design helps with debugging. I can inspect the profile passed to the route engine, the graph rule that rejected a transfer, the data behind a warning, and the text Gemma received after the route decision. Model output never becomes an accessibility fact on its own.&lt;/p&gt;

&lt;p&gt;AccessPath keeps rider notes local where possible. Deterministic code enforces safety constraints, and every factual claim carries a source.&lt;/p&gt;
&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;


&lt;div class="ltag-agent-session"&gt;
  &lt;div class="agent-session-header"&gt;
    
    &lt;span class="agent-session-tool-icon-badge" title="Claude Code"&gt;
&lt;/span&gt;
    &lt;span class="agent-session-title"&gt;Pre-submission review of AccessPath, an evidence-first step-free transit planner&lt;/span&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-scroll"&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Review AccessPath before I submit it to the Hacktoberfest Weekend Challenge (Build for a Friend). Check that SUBMISSION.md matches what the repository and the live deployment actually do, and keep secrets out of anything public.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;I'll start with the write-up, then verify each claim against the code, the checks, and the live app.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-read"&gt;Read&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;SUBMISSION.md&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre highlight markdown"&gt;&lt;code&gt;SUBMISSION.md&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre highlight markdown"&gt;&lt;code&gt;Claims to verify:
&lt;span class="p"&gt;-&lt;/span&gt; Mastra workflow with five typed steps, each returning complete or fallback
&lt;span class="p"&gt;-&lt;/span&gt; Outage demo: Plan A transfers 7→N at Queensboro Plaza; a labelled transfer-lift failure forces Plan B via Times Sq-42 St
&lt;span class="p"&gt;-&lt;/span&gt; 496 stops in the processed graph
&lt;span class="p"&gt;-&lt;/span&gt; TabPFN vs gradient-boosting baseline (ROC AUC 0.8946 vs 0.8908)
&lt;span class="p"&gt;-&lt;/span&gt; Tinker LoRA fine-tune of Qwen3.5-4B: exact match 0% → 50%, field accuracy 0% → 90% on a 4-example holdout
&lt;span class="p"&gt;-&lt;/span&gt; 4 test files / 11 tests, lint, typecheck, build, npm audit clean
&lt;span class="p"&gt;-&lt;/span&gt; Prize categories: Mastra, Render, TabPFN, Tinker (Arduino, Entire, Copilot deliberately excluded)&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-bash"&gt;Bash&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;git log --oneline &amp;amp;&amp;amp; git status -sb&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ git log --oneline &amp;amp;&amp;amp; git status -sb&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;12 commits on main, tracking origin/main
5a63ac5 Improve evidence dark mode and simplify page
39b1111 Fix outage demo interaction and clarify workflow trace
c2bbf87 Record verified Render deployment
48a0a4c Configure free Render deployment
0d00d4b Add persistent Tinker training evidence
9a03cb1 Add verified TabPFN and Tinker evaluation evidence
07f05a8 Initial AccessPath project
(list trimmed)

Uncommitted: SUBMISSION.md (copy edit), .gitignore, package.json; untracked webreel.config.json&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Before running anything, a secret scan of every tracked file.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-bash"&gt;Bash&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;git ls-files | xargs grep -nIE '&amp;lt;API-key, token, connection-string and local-...&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ git ls-files | xargs grep -nIE '&amp;lt;API-key, token, connection-string and local-path patterns&amp;gt;'&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;No API keys, access tokens, passwords, or database connection strings in tracked files.
.env is gitignored; .env.example contains only empty placeholders.

One account-scoped identifier: a Tinker training-run ID appears in SUBMISSION.md and training/reports/tinker-evaluation.json. It is not a credential, but it is omitted from this transcript.&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Now the technical checks the submission lists.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-bash"&gt;Bash&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;npm test&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ npm test&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt; Test Files  4 passed (4)
      Tests  11 passed (11)
   Duration  639ms&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-bash"&gt;Bash&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;npm run lint&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ npm run lint&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;oxlint src server shared scripts --deny-warnings
(no warnings)&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-bash"&gt;Bash&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;npm run typecheck&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ npm run typecheck&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;tsc --noEmit &amp;amp;&amp;amp; tsc -p tsconfig.server.json --noEmit
(no errors)&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-bash"&gt;Bash&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;npm audit&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ npm audit&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;found 0 vulnerabilities&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;All four pass. Next, the public deployment and the exact judging path from the write-up.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-bash"&gt;Bash&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;curl https://accesspath-ai.onrender.com/api/health&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ curl https://accesspath-ai.onrender.com/api/health&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;ok: true, service: accesspath-api
live: TabPFN, Render, Mastra
fallback: Gemma, DigitalOcean, ElevenLabs, SerpApi, MongoDB, Sentry&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-bash"&gt;Bash&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;curl -X POST https://accesspath-ai.onrender.com/api/plan  # Grand Central-42 ...&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ curl -X POST https://accesspath-ai.onrender.com/api/plan  # Grand Central-42 St → Astoria Blvd, mode=scenario, stepFree + avoidLongWalks&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;Original route — unavailable — 53 min
  Grand Central-42 St (7) … Queensboro Plaza ⇄ transfer to N … Astoria Blvd
Recommended reroute — recommended — 60 min
  Grand Central-42 St (7) → Times Sq-42 St ⇄ transfer to N → … Queensboro Plaza (stays on N) … Astoria Blvd

activeOutages[0]: Queensboro Plaza, DEMO-EL-QBP-XFER, "Simulated transfer-lift outage", return to service: "Demonstration only"

trace:
  Understand access needs ............ fallback
  Check lift and outage information .. complete
  Find a route that keeps requirements complete
  Write the journey briefing ......... fallback
  Check extra destination information  fallback

evidence: mta-stations verified, mta-outages verified, mta-history high, scenario verified&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;I read the remaining public routes, since anything the server exposes is part of the submission too.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-read"&gt;Read&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;server/app.ts&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ts&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;GET&lt;/span&gt;  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;health&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sr"&gt;/api/&lt;/span&gt;&lt;span class="nx"&gt;bootstrap&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sr"&gt;/api/&lt;/span&gt;&lt;span class="nx"&gt;evidence&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;scenario&lt;/span&gt;
&lt;span class="nx"&gt;POST&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sr"&gt;/api/m&lt;/span&gt;&lt;span class="nf"&gt;onitor &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;503&lt;/span&gt; &lt;span class="nx"&gt;unless&lt;/span&gt; &lt;span class="nx"&gt;Temporal&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="nx"&gt;configured&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="sr"&gt;/api/&lt;/span&gt;&lt;span class="nx"&gt;voice&lt;/span&gt;
&lt;span class="nx"&gt;GET&lt;/span&gt;  &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;debug&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nx"&gt;recent&lt;/span&gt; &lt;span class="err"&gt;→&lt;/span&gt; &lt;span class="nx"&gt;returns&lt;/span&gt; &lt;span class="nx"&gt;only&lt;/span&gt; &lt;span class="nx"&gt;requestId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;generatedAt&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;mode &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;no&lt;/span&gt; &lt;span class="nx"&gt;rider&lt;/span&gt; &lt;span class="nx"&gt;notes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div&gt;
                  &lt;div class="agent-session-text agent-session-text-collapse"&gt;
                    &lt;p&gt;Review result: the write-up holds up.&lt;/p&gt;

&lt;p&gt;Verified&lt;br&gt;
- The outage demo behaves as described. The reroute still passes through Queensboro Plaza, but stays on the N there. Only the 7→N transfer lift is marked failed, so the step-free requirement is kept rather than relaxed.&lt;br&gt;
- The simulated outage is labelled as a simulation in the outage record, the evidence ledger, and the trace.&lt;br&gt;
- The five-step workflow trace shows each step's status as complete or fallback, as the write-up says.&lt;br&gt;
- Tests, lint, both typechecks, and npm audit pass.&lt;br&gt;
- /api/debug/recent exposes no rider text.&lt;/p&gt;

&lt;p&gt;Things to be aware of&lt;br&gt;
- On the public Render deploy, Gemma runs in fallback mode, so the deterministic rules interpret the rider's preferences. The write-up already says "When configured", which is accurate, but a judge who opens the trace will see "fallback" on step 1. A sentence saying the hosted demo uses the rule-based fallback and Gemma runs via Ollama locally or on DigitalOcean would remove the surprise.&lt;br&gt;
- /api/voice forwards any text to ElevenLabs with no rate limit. It is harmless on the current deploy because no ElevenLabs key is set. If one is added, put a limit on it first.&lt;br&gt;
- The local SUBMISSION.md copy edit is not committed or pushed, so the public repo still has the older wording.&lt;/p&gt;

                  &lt;/div&gt;
                  Show more
                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Prepare a clean session for the submission. Build it from this review only, not from earlier chats.&lt;/p&gt;

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

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Prepared. The session contains only this review. It leaves out:&lt;br&gt;
- credentials, tokens, and account identifiers, including the Tinker training-run ID&lt;br&gt;
- local machine paths and personal contact details&lt;br&gt;
- personal details about the person the project was built for. The transcript describes the users only as riders who depend on step-free transit.&lt;br&gt;
- request IDs from the live API calls&lt;/p&gt;

&lt;p&gt;Long tool output is trimmed to the lines that support each claim.&lt;/p&gt;

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

  &lt;div class="agent-session-footer"&gt;
    &lt;span class="agent-session-meta"&gt;
        9 of 9 messages
    &lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;I used an AI coding agent during the challenge window. The work included data-source checks, route-engine debugging, an accessibility review, and a production smoke test. The agent also caught a compiled-path bug after the development build had passed. The embedded session is a curated, secret-free record of the final project review: it re-runs the checks, exercises the outage demo on the live deployment, and scans the repository for secrets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;I have evidence for these categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Best Use of Mastra&lt;/li&gt;
&lt;li&gt;Best Use of Render&lt;/li&gt;
&lt;li&gt;Best Use of TabPFN&lt;/li&gt;
&lt;li&gt;Best Use of Tinker&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
  </channel>
</rss>
