DEV Community

Cover image for The Cryptid Field Office: an AI triages sightings, a person signs off
Mohammed Abdul Mubeen Khan
Mohammed Abdul Mubeen Khan

Posted on

The Cryptid Field Office: an AI triages sightings, a person signs off

Sanity Challenge Path Two Submission

This is a submission for the Sanity Challenge, Path Two: Vibe-Code Something Strange

What I Built

The Cryptid Field Office: a deadpan government bureau that takes every unexplained sighting seriously. Cryptids, lights over the desert, a figure on the stairs, a jinn in the storeroom, a lodge that is on no property register. You file a report. An AI Field Investigator reads it, scores it and decides where it goes. A person signs off on anything unclear. Every case ends in a stamp: CLASSIFIED, DEBUNKED or INCONCLUSIVE.

It is silly on the surface and serious underneath. Take away the Bigfoot and it is a report-triage pipeline: public intake, AI screening, linking related reports, a human decision, and an audit trail. Swap the creatures for potholes and you have a city 311 system. The same pattern runs bug trackers, insurance claims and fraud review. That was the point: something strange, built on something real.

It has three surfaces on one Sanity content lake:

What it is Who uses it
Public site (Next.js) Case map and files, a four-step report form, a live "your report is being triaged" page, and a public Director's Desk Anyone. No login.
Case Board (Sanity App SDK) A live corkboard: drag case photos around, pull a red pin from one card onto another to draw a string, approve or reject the AI's suggested links, fire workflow actions Bureau staff
Studio Custom desk, status badges, a map location picker, and the official Workflows plugin Editors

The part I am proudest of: the agent and a person move a case through exactly the same workflow actions. The AI triages a report, a visitor on the Director's Desk opens an investigation, and a staff member closes it from the Case Board, and all three are the same fireAction on the same instance, recorded in one audit trail.

Demo

Live site (no login needed): https://cryptid-field-office-mubeen9.vercel.app

Try it in about a minute:

  1. File a report. Describe something, drop a pin, optionally attach a photo. About 15 seconds after you submit, the Field Investigator has read it and a stamp lands on your case.
  2. Open the Director's Desk and decide a case that needs a person.
  3. Open the resulting case file: memo, evidence, red strings to related cases, and the timeline showing who did what ("Agent", "Visitor Director", "Bureau").

The Studio and Case Board need a Sanity login, so the video and screenshots below show them. The Director's Desk gives you the same workflow power without one.

The video shows the whole loop, from a public report to a stamp, and it is the only place to see the Case Board and Studio without a Sanity login.

The home page
A report, triaged by the Field Investigator
A case file
The map and case list
The Director's Desk
Dark mode
On a phone

Code

https://github.com/MAMubeenKhan/cfo

The repo includes PLAN.md (the full runbook I had Claude write before any code) and BUILDLOG.md (an honest day-by-day log, including everything that broke).

My Build Process

Tools: Claude Code (Opus 5.5 for planning, Sonnet 5 for most building), the official sanity-best-practices agent skill, Playwright, axe-core and Lighthouse for testing. I am non-technical; I directed, Claude built.

The idea (and the prompt that mattered most)

My first prompt was the challenge page pasted in, plus: "give me options on what we should make and tell me what is best and why." Claude scored four ideas against the four judging criteria and both bonuses and recommended the cryptid bureau, because a case moving from triage to a verdict is exactly the "agent moves it forward, a person approves it" pattern, and a red-string board is a natural App SDK app.

My honest worry was: "won't it be weird and silly and make me a joke?" Claude's answer became the design rule for the whole project: play it deadpan. The humour lives in the bureaucracy (case numbers, stamps, memos), never in the subject. A silly idea with a real workflow reads as clever; a silly idea with three screens reads as a joke.

Then I kept pushing the scope: "include UFOs, aliens, Area 51", then "ghosts, jinn, spirits and occult", then "secret cults and societies." That created a real design question I want to be upfront about, because it shaped the code:

  • Jinn are part of real religious belief. So the bureau's humour must never touch them. Rules that ended up in code, not just in copy: faith-related reports are never auto-closed; the AI prompt forbids ruling on belief or calling a witness mistaken; the final filing step refuses an agent "debunked" stamp on a faith-sensitive case even if everything upstream failed; and a human closing one must tick an extra confirmation.
  • Every secret society is invented. No real group, religion or person appears anywhere.
  • Reports suggesting distress or coercion force human review and show a calm banner.

The plan-first prompt

Before writing code I asked for "an end to end plan so a new session doesn't have to do any planning, including edge cases, no tests until completion, only one comprehensive test at the end." Claude read the Workflows and App SDK docs, checked real package versions, and wrote a ~500-line runbook. Three mid-flight prompts shaped it: "it should be attractive with good UX and highly polished", "as per current standards" (this became a WCAG 2.2 AA, Core Web Vitals, dark-mode, reduced-motion spec), and my memory file (a memory.md Claude reads at every session start and appends lessons to).

Sanity features I used

  • Content model: 8 document types (case, subject, region, witness, connection, board pin, settings, counter) and 5 object types. Typed evidence union (photo, footprint, sound, testimony), geopoints, references, and a first-class connection document with provenance and confidence: the red strings. Witnesses are anonymous codenames with a credibility score computed across their cases.
  • Studio customisation: status-queue desk structure, category and restricted-site lists, badges (status, plausibility P0-100, hidden), delete removed for cases (it would orphan their workflow instance), and a MapLibre location picker replacing the default geopoint input (which needs a Google Maps key).
  • Workflows (0.35, early access): the case-lifecycle definition: five stages, five automated effects, human actions for the Director and Investigator. It passed sanity-workflows deploy --check on the first attempt. I then ran all 30 seeded cases through the real engine using the same actions a person fires, and asserted the stage histogram matched the plan exactly.
  • Functions: a document Function fires when a workflow instance gains unclaimed effects and runs the AI handlers in Sanity's cloud, and a daily Scheduled Function sweeps stale claims and re-evaluates open cases.
  • Agent Actions: the Field Investigator and the Cross-Referencer both call client.agent.action.prompt.
  • App SDK: the Case Board (useQuery streams, useWorkflowEngine, useWorkflowSession, @sanity/workflow-diagram).

Where it got stuck, and how we corrected course

I would rather show the dead ends than pretend there were none.

  • A big Bash command silently applied nothing (twice): long heredocs containing an apostrophe failed with "unexpected EOF". The lesson, saved to memory: write files with the file tool, one call per file.
  • Half-installed packages: an interrupted npm install left a half-extracted zod, which made every Sanity CLI command fail with MODULE_NOT_FOUND, then made a second install fail with Invalid Version:. Fix: delete node_modules and the lockfile, install fresh, in the background. On this network installs took 10 to 25 minutes.
  • The skill corrected the plan. I installed Sanity's sanity-best-practices skill and it caught that @sanity/icons v5 has no root exports (every icon imports from its own path). My draft compiled and would have failed at bundle time.
  • Permissions: my API token could deploy the Studio and Functions but not an App SDK app (missing an organisation-level grant) and could not create the organisation stack that Scheduled Functions need. I did not work around it: I shipped without the daily backup job and wrote a repair command instead, deployed the Case Board from my own login, and later, once I was logged in, created the organisation stack, moved both Functions onto it and retired the old one.
  • Vercel served 404 for everything: the CLI created the project with no framework preset, so the build passed but the edge served nothing. One API call to set framework: nextjs and a redeploy fixed it. Deployment Protection was also putting a login in front of the site.
  • The AI was too harsh. In the live test, a credible sighting with a photo and a footprint scored 68, just under the 70 "investigate" bar. I added a scoring guide to the prompt ("a submitted photo or footprint counts as physical evidence"; "vague is not false: when in doubt, score 20-49 so a person can look") and redeployed. The same report then opened an investigation, and the Cross-Referencer proposed 3 real related files.
  • Things the live test found that no type-checker would have: a missing case returned HTTP 200 (a soft 404) because of a page-wide loading skeleton; the map threw "Worker failed to load" because MapLibre 6's worker files can't be bundled by Next; the map opened on Scotland instead of framing all cases; my evidence photos were bad at first sight (a footprint that looked like a snowman, a triangle invisible on a dark sky), which I only caught by looking at them.
  • My first rate limiter was useless, and only a live test showed it. I had built it in server memory and even documented it as a known limit. Then I filed eight reports at once from one connection with the limit set to five: all eight went through, because serverless hosting spreads requests over many servers. I rebuilt it as counters stored in Sanity as private documents (an id with a dot in it is unreadable to the public). The same test then accepted five and refused three, and an anonymous query for those counters returns nothing.
  • Vercel blocked a deployment once I started committing to git: the CLI attached my commit author, which was not on the Vercel team. Deploying from a copy of the folder without git history fixes it (scripts/deploy-web.sh).
  • Recording the demo video found three more bugs. Watching my own screen recording, the red strings on the Case Board were grey and hair-thin: React Flow's stylesheet loads later and beat mine, so I raised the selector's specificity. The Studio's map input was blank: MapLibre 6 needs a worker URL in every host, not only the Next site, so I serve the worker from the Studio's static folder. And demo cases I had hidden were still appearing as "related files" on public pages, so the query now drops a connection if either end is hidden.
  • Speed: the case page scored 57 on a throttled phone because a 290 KB map library loaded below the fold. Mounting the map only when it scrolls into view took it to 93. Accessibility is 100 on every page; the search-engine score stays near 66 only because Vercel adds a noindex header to its free addresses.

The App SDK and Workflows, honestly

  • Workflows is a library, not a service: it acts only when your code calls it. That felt unfamiliar for a day, then clicked. Defining the process as data next to the content, with conditions in GROQ, made "the agent and a person use the same transitions" almost free. The cookbook matched the installed types closely, which is rare for a 0.x release. A deterministic instance ID (prod.wf-instance.<caseId>) made starting a case idempotent.
  • App SDK hooks stayed live without any polling code of my own, and the workflow session gave me the action list, the definition and the history for the diagram in one object. The one rule I obeyed carefully: never edit a workflow instance document directly.

What is honestly not there

  • No CAPTCHA. Abuse is limited by a durable rate limit (5 reports an hour per visitor, 40 overall), a honeypot, a minimum fill time, and a daily AI budget with a kill switch in Bureau settings.
  • The Case Board is desktop-only, by design.
  • Not tested: two people using the Case Board at the same moment (the live sync is Sanity's, and I only tried it alone); a real screen reader (I ran axe-core, which scored 100, and did a keyboard-only pass, but I did not listen to it); and the daily sweeper's first scheduled run, which was due after I wrote this.
  • The AI can be wrong. Code, not the model, picks the route, but a very low score (under 20) still auto-debunks an ordinary case. The safety net is narrower than "a person sees everything": faith, distress and coercion flags always force human review, and every automated step is written to the case's audit log so a person can find and reverse it.

Sanity Project Details

  • Project ID: cyh4xyo1 · Dataset: production (public)
  • Sample query: https://cyh4xyo1.api.sanity.io/v2026-09-01/data/query/production?query=*[_type=="case"][0...5]{caseNumber,title,category,status}
  • Studio: https://cryptid-field-office.sanity.studio/ (needs a Sanity login)
  • Schema highlights: case (workflow subject with a status mirror), connection (red strings with provenance), witness (anonymous, credibility computed across cases), subject (six categories), region (a restricted flag drives the Area 51 banner and redactions).

Agent Session

Vibe-coding a cryptid bureau on Sanity: the key moments
You

https://dev.to/challenges/sanity-2026-09-16

<pasted_content id="a237">
DEV Community
Create Post
Edit
Preview

Upload Cover ImageNo file chosenUse a ratio of 1000:420 for best results.
🍌 Generate Image
Cover Video Link
New post title here...

Add up to 4 tagsMaximum 4 selections
Selected items:

devchallenge

sanitychallenge

sanity

ai

Bold CTRL + B
Italic CTRL + I
Link CTRL + K
Ordered list
Unordered list
Heading
Quote
Code
Code block
Embed CTRL + SHIFT + K
No file chosenUpload image

This is a submission for the Sanity Challenge, Path Two: Vibe-Code Something Strange

What I Built

<!-- Tell us about the app you prompted into existence. What does it do and who is it for? -->

Demo

<!-- Share a link to your deployed project and include a video walkthrough or screenshots. -->

Code

<!-- Embed or share a link to your repository. -->

My Build Process

<!-- This is the heart of your submission. Which AI-native IDE did you use? Share the prompts that worked, the ones that didn't, where the model got stuck, and how you course-corrected. If you reached past the Studio into the App SDK or Workflows, tell us how that went. -->

Sanity Project Details

<!-- Required: share your Sanity project ID or a link to a public dataset URL so the Sanity team can see how you modeled and used your structured content. -->

Agent Session

<!-- Optional but encouraged: upload your transcript at https://dev.to/agent_sessions/new, curate or slice the parts worth showing, and embed it right here. Supported tools include Claude Code, Gemini CLI, Codex, GitHub Copilot CLI, and Pi. -->
<!-- Sessions are unlisted by default, so hit Make Public before you publish or judges won't be able to open it. Check your transcript for keys and sensitive data first. -->

<!-- Don't forget to add a cover image if you want! -->

<!-- Team Submissions: Please pick one member to publish the submission and credit teammates by listing their DEV usernames directly in the body of the post. -->

<!-- Thanks for participating! -->
Publishing Tips
Ensure your post has a cover image set to make the most of the home feed and social media platforms.
Share your post on social media platforms or with your co-workers or local communities.
Ask people to leave questions for you in the comments. It's a great way to spark additional discussion describing personally why you wrote it or why people might find it helpful.
Publish
Save Draft
AI Disclosure
Advanced Options
</pasted_content id="a237">

<pasted_content id="a237">
Path Two: Vibe-Code Something Strange
Prompt your way to a working app. Any AI-native IDE, Next.js or Astro on the front, Sanity behind it.

This one is judged on the build as much as the result. How deep did you get into Sanity's features? Did you customize the interface? Build a new component to turn videos into gifs? Create a workflow that kicks off an external API call? A rough app with an honest writeup beats a [... 4497 characters omitted for upload size ...] the entry that received the highest number of positive reactions on their DEV post to determine the winner.

How will I know if I won?
Winners will be announced in a DEV post on the winner announcement date noted in our key dates section.

When will I receive my DEV badge?
Both participation and winner badges will be awarded, in most cases, the same day as the winner announcement.

When will I receive my prizes?
The DEV Team will contact you via the email associated with your DEV profile within, at most, 10 business days of the announcement date to share the details of claiming your prizes.

What steps do I need to take to receive my cash prize?
The winner (including each member of a team) may be required to sign and return an affidavit of eligibility and publicity/liability release, and provide any additional tax filing information (such as a W-9, social security number or Federal tax ID number) within seven (7) business days following the date of your first email notification.

Sanity Challenge Rules
NO PURCHASE NECESSARY. Open only to 18+. Contest entry period ends October 4, 2026 at 11:59 PM PDT. Contest is void where prohibited or restricted by law or regulation. All entries must be submitted during the contest period. For Official Rules, see Sanity Challenge Contest Rules and General Contest Official Rules.
</pasted_content id="a237">

. So, let's make something and win this challenge. You give me options on what we should make and tell me what is best for this and why

Agent

Checked the challenge page plus Sanity's Workflows and App SDK docs. Now I'm writing up the options and a recommended build plan.

Agent

I haven't built anything yet. Here's what I've got so far, then tell me what you'd like to clarify.

What wins this path: judges score four things: an honest build write-up, a working app, a well-designed schema, and creativity. The bonus is for going past the Studio: an App SDK app (a custom real-time interface) or Workflows, where a draft moves through set stages that both an agent and a person can advance. Sanity only launched Workflows on Sep 14 and it's early access, so few entrants will use it well. That's our best edge. The deadline is Oct 4, 10 days from now.

Options:

Idea Workflow fit App SDK fit Schema Strangeness
A. Cryptid Field Office: a bureau processing Bigfoot/Mothman sighting reports Natural Natural Rich High
B. Exquisite Corpse Gazette: surreal newspaper written in turns Good Good Medium Medium
C. Dream Patent Office: dreams filed as patents Good Medium Medium High
D. Fridge Court: leftovers put on trial Good Weak Thin High

My pick is A, the Cryptid Field Office. It's the only idea where both bonuses come straight out of the premise:
- Workflows: a sighting report moves Reported → an AI "Field Investigator" triages it → human review if flagged → verdict. The agent and a person press the same buttons, which is what the judges asked for.
- App SDK: a live red-string conspiracy board. Dragging a string between two sightings creates a real link between those records, and you can approve a case from the board.
- Schema: sightings, creatures, witnesses (with a credibility score across cases), typed evidence, map locations and connections. That gives us plenty to say about why the data had to be structured.
- Demo: a public Next.js map of sightings that judges can use without logging in.

One risk: Workflows needs early-access sign-up. If we don't have access by day 2, we model the workflow ourselves as Sanity documents, and the write-up says so honestly.

What would you like to clarify? It could be the ideas, the stack, what accounts you have (Sanity, Vercel, an Anthropic API key), or something else.

Sources:
- DEV Sanity Challenge
- Sanity Workflows cookbook
- AI content pipeline recipe
- App SDK intro
- Everything NYC 2026 recap

You

if i chose cryptid field office, won't it be weird and silly and will it be acceptable and won't it make me a joke in there?

Agent

It's a fair worry, but I don't think it will make you look like a joke. Here's why.

1. The brief asks for strange. The path is literally called "Vibe-Code Something Strange", and creativity is one of the four judging criteria. The judges will read dozens of blog templates and "AI content helper" apps. A playful premise done well stands out. A safe idea done well blends in.

2. People laugh at weak engineering, not at a funny theme. A silly idea with three screens and a thin write-up looks like a joke. A silly idea with a real workflow, an agent handing cases to a human, a live App SDK board and a carefully designed schema looks like someone who's good enough to have fun. The theme is the costume. The engineering is what gets judged.

3. It's a serious system in disguise. Take out the cryptids and what's left is a report-triage pipeline: the public files reports, an AI screens them, related reports get linked, a human makes the final call, and there's an audit trail. That's how pothole reports, bug trackers, insurance claims and fraud flags work. The write-up can say so outright: "Swap Bigfoot for potholes and this is a city 311 system." Judges see the fun and the real-world pattern, and that's a strong combination.

4. Tone is our choice. It doesn't have to be goofy. I'd play it deadpan: a dry government-bureau look with case numbers, "CLASSIFIED" stamps and formal language, taken completely seriously. It's in the spirit of the SCP Foundation or The X-Files. Humour that plays it straight comes across as clever, not silly.

If you'd still feel uncomfortable putting your name on it, that matters. You'll be the one posting it and answering comments. The same engineering can wear a more serious costume.

You

first, write end to end plan on how to implement this so if i start a new session and give the file to claude, it should not have to do planning of any kind, you get how planned I want this to be? including edge cases etc as we are short on time, also mention in the plan, no tests during implementation until completion. only one comprehensive test after completion. also, make a memory.md file and read it before starting any task, It should hold my preferences and lessons learnt in current and past sessions. After each task, if I corrected you or you learned something worth keeping, add one short dated and timed line to memory.md. Do not rewrite old lines.

Agent

Where the plan is

It's saved in one file:

[REDACTED]\.claude\plans\https-dev-to-challenges-sanity-2026-09-1-optimized-plum.md

Once you approve it, the first thing the build does is copy it into your project folder as [REDACTED]\sanity\PLAN.md. Any new Claude session can be given that file and start building straight away, with no re-planning. It covers every step, the exact commands, the problems that could come up and what to do about each one, the design rules, the rule of one full test at the very end, and exactly which small steps you'll need to do yourself.

About memory.md: you already have one at [REDACTED]\.claude\memory.md, and it's loaded automatically at the start of every session. So I won't create a second one. I'm not allowed to change files until you approve the plan, so it's the plan's first step to add today's new preferences to that file: fully detailed plans, a polished UI, and simple explanations for you.

What we're building, in plain words

We're building a website that pretends to be a serious government office for Bigfoot sightings. It's called the Cryptid Field Office.

What a visitor can do:
1. Report a sighting. They fill in a short form: what they saw, where (by pinning it on a map), when, and an optional photo.
2. Watch an AI "investigator" read it in about 30 seconds. It gives the report a believability score out of 100 and writes a short, dry office memo about it.
3. See the report sorted automatically:
- Obviously fake → stamped "DEBUNKED" right away.
- Unclear → sent to a human "Director" to decide.
- Believable → opened as an investigation. A second AI then looks for similar sightings nearby and links them with red strings, like a detective's wall.
4. Browse every case on a map, and open any case to read its full file.
5. Play the Director. A visitor page lets anyone approve or reject waiting cases, so the judges can try the whole thing without logging in.

What you (as staff) get: a private "Case Board". It's a digital corkboard where case cards are pinned and red strings connect related sightings. Your team can drag cards, draw strings and make decisions, and everyone sees changes instantly.

Why a joke idea is a smart entry: under the costume, this is a real system. It's the same one cities use for pothole complaints and companies use for customer claims: people report, AI screens, a human decides, and everything is recorded. The judges asked for exactly this ("an agent moves it forward, a person approves it"), and we use both of Sanity's newest features that they said they especially want to see.

How it will look: it'll be polished and modern, styled like old government files: paper colours, typewriter-style case numbers, ink stamps that "thump" onto the page, and a dark mode. It'll work well on phones and follow current accessibility standards.

What you'll need to do yourself (I'll walk you through each with exact clicks): log in to Sanity once, create a Vercel account, paste one secret key into a file, click through the Vercel setup, record a 2–3 minute screen video, and publish the post on DEV. I'll do everything else.

Timeline: building Sep 25 – Oct 1, the one full test on Oct 2, and writing and publishing the post on Oct 3. That leaves Oct 4 as a spare day before the deadline.

You

carryon but i think we should also include ufos and aliens, area 51 etc

Switched to claude-sonnet-5
Agent

Good call. UFOs, aliens and Area 51 fit the "Department of Unexplained Sightings" idea, and they open up better material. UFO reports can be explained by Venus, satellites or aircraft, which suits an AI investigator, and Area 51 gives us a redacted-document look. Nothing is seeded yet, so changing the schema now costs almost nothing.

The change: "Creature" becomes a broader Subject (cryptid, UFO craft, extraterrestrial, folklore, misidentified). Cases get a category, and regions can be flagged restricted (Area 51 and similar).

You

also, ghosts, jinn, spirits and occult sightings

You

even occult secret cults and societies

Agent

Two fixes before checking: my "restricted regions" filter query was malformed, and the map picker still needs attaching to the location field.

Agent

I'll validate the definition offline. The --check option contacts nothing and only tests whether the engine accepts my process map.

Agent

The workflow passes validation on the first try. I'll deploy it to your dataset now, so any dataset-level problem shows up early.

Agent

The workflow, the AI handlers and the cloud automation are built and running. The Studio is redeployed at https://cryptid-field-office.sanity.studio/ with the workflow plugin, so refresh it. Cases now have real stages, and the thumbnails show on the list. I haven't looked at it in a browser myself.

  • The workflow works end to end. All 30 sample cases ran through the real engine, using the same actions a person would use. They landed exactly where planned: 8 classified, 9 debunked, 4 inconclusive, 5 under investigation, 4 waiting for the Director. Each case's log, verdict and witness credibility updated correctly.
  • The faith rule held. None of the three spirit and jinn cases was debunked. Two safeguards enforce this in code, so the AI can't override it.
  • The cloud automation is live. A Sanity Function now runs the AI investigator automatically whenever a new report arrives.
  • The AI works on your plan. I checked that Sanity's built-in AI is available, so you don't need a separate AI account.

One honest cut: I dropped the daily backup-repair job. Sanity only allows it at the organisation level, and the token I have doesn't permit that. I added a command that does the same repair on demand, so it costs us nothing. You can lift that limit yourself if you want it: it's a permission on your Sanity organisation.

One open question: I've only tested that the AI responds. How good its scoring is on real reports gets tested in the final pass. If it turns out weak, I can switch to Claude, which needs an Anthropic API key from you.

Still owed: nothing is committed or pushed to cfo, and the old token is still in this chat's record, so please replace it before publishing.

Next is the public website: the map, the case files, the "file a report" form, and the live stamp that lands when the AI finishes. This is the part judges will see first, so it gets the most design effort. Shall I go ahead?

Agent

The build itself succeeded, but the site is being served as if it were a plain static folder. I'll check the project's framework setting.

Agent

The framework wasn't set, so Vercel didn't know this was a Next.js app. I'll set it and redeploy.

Agent

While the website redeploys, I'll redeploy the Case Board with the corrected link, using your login.

Agent

The site is redeployed and the map worker file is being served. I'll rerun the screenshots to confirm the fixes, then run the first real report through the site.

Agent

The AI's updated instructions are live. Now the website with the skip-link fix, and then I'll re-file the credible report to see whether the calibration helped.

Agent

The calibration worked: the same credible report now goes straight to investigation. Now the Director's Desk test on two of the earlier test cases.

Agent

Picking up where we left off. My notes list two open items: the mobile speed of case pages (57 out of 100) and the search-engine score (about 66). I'll start with the exact reasons Lighthouse gave for the search-engine score.

Agent

The deploy failed. I'll look at the actual error rather than guess.

Agent

"Not authorized" means the command-line login to Vercel isn't active in this session. I'll check.

Agent

The Vercel command line is now signed in as a different account (mamubeenkhan-6376) from the one that owns the project (mubeen9). I'll see which teams this login can access.

Agent

The login is fine: same account, same team. The failure may have been a hiccup, so I'll retry the deploy with the team named explicitly.

Agent

Deployed. Now I'll re-measure speed on phone and desktop.

Agent

Deployed. Now a quick check that the deferred map still appears when you scroll to it on a phone, and a re-measure of the home page.

Agent

Testing turned up two things worth fixing, and both are fixed and deployed. Most of the untested items pass.

Passed
- Keyboard only: the skip link works and every one of the 44 tab stops on the home page shows a visible focus ring. I filed a complete report with the keyboard alone, choosing the category with arrow keys and the place with the search box.
- Reduced motion: nothing animates.
- Place search down: a clear message appears and you can still drop a pin and continue.
- Firefox: clean.
- Safari's engine: pages, maps and the form work. It logs one harmless message about a cancelled background request.

Found and fixed: the report limiter was useless.
I filed eight reports at once from one connection, with the limit set to 5 per hour, and all eight went through. The counter lived in each server's memory, and Vercel runs many servers at once. I rebuilt it so the counts live in Sanity as hidden records that visitors can't read. It now allows 5 per hour per person and 40 per hour overall. I reran the test: 5 accepted, 3 refused, and an anonymous check finds none of the hidden records. The daily repair job now also tidies old counters.

One more snag: Vercel blocked a deploy. Now that the code is in git, Vercel refused it because the commit author isn't on your Vercel team. I added scripts/deploy-web.sh, which deploys from a copy without git history. I also cleared the counters and hid the 20 new test reports, so you can film without being limited.

Still can't test without you
- Two people on the Case Board at once. To try it, open the Case Board in two browser windows and drag a card in one.
- A real screen reader.
- The daily repair job, which first runs tomorrow at 04:00 UTC.

Everything is committed and pushed to your private cfo repo.

About the video: I'd suggest the hybrid plan. I record the public-website part automatically with on-screen captions, and you record only the Case Board and Studio clips (about 30 seconds) plus a voice-over. Or you record everything yourself from the shot list. Which do you prefer?

Agent

Tiles load fine here (only aborted prefetches). Checking what it rendered.

Agent

The public map renders fine. The blank one is the Studio input, which likely lacks the worker setup that MapLibre 6 needs. I'll check its code.

Agent

CORS is open on the Studio host. Deploying the Studio with the CLI login.

Agent

Deployed and served. I'll reload the Studio tab in Chrome and check the map.

Agent

That F5 went to VS Code instead of Chrome, because VS Code had focus. It looks harmless, but I'll stop driving your screen blind. I'll log the findings, then hand back.

You

video is good, just make the strings more visible and red, they are hardly visible

Agent

The strings on the Case Board are thin and greyish in the recording. I'll look at how they're styled.

Agent

The CSS already asks for red, but React Flow's own stylesheet (grey, 1 px) is winning over it. I'll raise the specificity, thicken the strings and make them a stronger red.

Agent

The type-check passes. My stronger selector would also override the reduced-motion rule, so I'll fix that too, then deploy the Case Board.

Top comments (0)