<?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>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>
