<?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: Yuli Dai</title>
    <description>The latest articles on DEV Community by Yuli Dai (@yulidai).</description>
    <link>https://dev.to/yulidai</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%2F4176192%2Fe3a901df-cd17-4fac-96fc-41afa382f138.png</url>
      <title>DEV Community: Yuli Dai</title>
      <link>https://dev.to/yulidai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yulidai"/>
    <language>en</language>
    <item>
      <title>Scope Desk: "one more thing" needs a scope review</title>
      <dc:creator>Yuli Dai</dc:creator>
      <pubDate>Tue, 13 Oct 2026 04:48:33 +0000</pubDate>
      <link>https://dev.to/yulidai/scope-desk-one-more-thing-needs-a-scope-review-2m52</link>
      <guid>https://dev.to/yulidai/scope-desk-one-more-thing-needs-a-scope-review-2m52</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;The agreement says one English landing page with a contact form. A new message says, "Please add online payments and a French version."&lt;/p&gt;

&lt;p&gt;Neither request sounds huge in a chat. Both add work. Before talking about a price, someone has to put the original agreement beside the new message and work out what changed.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;Scope Desk&lt;/strong&gt; for that step. It's a small command-line tool for a freelance developer reviewing client requests. You choose the project, enter the agreed scope, and give it a new message. An open-weight Nemotron model drafts three kinds of suggestions: included work, extra work, and things that need clarification. Each suggestion quotes the request it came from. Included work also has to point to an existing scope item.&lt;/p&gt;

&lt;p&gt;The result stays a draft. You read it, explicitly approve it, and export a plain-text scope review to edit before sharing. It doesn't set a price, agree to do the work, or send a message to a client.&lt;/p&gt;

&lt;p&gt;The potential buyer is a freelancer juggling small fixed-scope jobs. The value would be having the agreement, new requests and review record together when deciding what to discuss with a client. That's a business hypothesis: I haven't had a real customer try it, and nobody has paid for it. The current prototype is free, MIT-licensed, and still needs user feedback.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/YunongDai2005/scope-desk/releases/download/v0.1.0-prototype/scope-desk-real-results-replay.mp4" rel="noopener noreferrer"&gt;Watch or download the 72-second demo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The video is a &lt;strong&gt;labelled text replay of real saved synthetic model results and actual command-line checks&lt;/strong&gt;. It is not a live screen recording or a new inference run. The approval in the demonstration was scripted; it doesn't establish that a human reviewed the answer.&lt;/p&gt;

&lt;p&gt;It shows three development examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Payments and a French version added to the agreed English landing page: two extra-work suggestions.&lt;/li&gt;
&lt;li&gt;A revision to the third blog post, with one revision per post already agreed: included work.&lt;/li&gt;
&lt;li&gt;"Can you improve it?": clarification, because the request doesn't say what to improve.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also shows an unapproved draft refusing export, an approved review exporting successfully, and a repeated approval after reopening the database returning the saved receipt without duplicating it.&lt;/p&gt;

&lt;p&gt;These are three synthetic development probes, not an accuracy benchmark or evidence that it handles every contract correctly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/YunongDai2005/scope-desk/releases/tag/v0.1.0-prototype" rel="noopener noreferrer"&gt;Release page and limitations&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/YunongDai2005/scope-desk" rel="noopener noreferrer"&gt;Scope Desk on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project and repository were created on October 13, after this challenge's opening. This is new code, separate from my earlier TheOne projects. Codex assisted the implementation, tests, documentation and demonstration.&lt;/p&gt;

&lt;p&gt;Python 3.11 or later and its standard library are enough for the CLI and SQLite storage. The README has the commands for creating a project, analysing a request, reading the draft, approving it and exporting the review. The model call requires your own provider access; inference is not promised to be free.&lt;/p&gt;

&lt;p&gt;Eight offline tests use mocked provider responses. The three genuine model calls are documented separately in &lt;a href="https://github.com/YunongDai2005/scope-desk/blob/codex/dev-week2-scope-desk/evidence/model-development.json" rel="noopener noreferrer"&gt;the synthetic development evidence&lt;/a&gt;. &lt;a href="https://github.com/YunongDai2005/scope-desk/actions/runs/38340250558" rel="noopener noreferrer"&gt;The published implementation's CI&lt;/a&gt; passed. Keys and private databases are excluded from the repository.&lt;/p&gt;

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

&lt;p&gt;The model used in the actual calls was &lt;code&gt;nvidia/nemotron-3-super-120b-a12b&lt;/code&gt;, served by Nebius Token Factory. Each request contains only the selected project's scope and current message. Other projects don't go into that request.&lt;/p&gt;

&lt;p&gt;The response has to match a small JSON schema. The application then checks the quotes against the input and the scope references against the selected project. An unknown reference or an incomplete response is rejected. Those checks establish where the words came from; they cannot establish that the model's interpretation is right. That's why the draft still needs review.&lt;/p&gt;

&lt;p&gt;I also wanted the record to survive ordinary interruptions. Approval writes a receipt to SQLite. Repeating that approval after reopening the database returns the same receipt. If the agreed scope changes while inference is running, the result is discarded. A stale unapproved draft cannot be approved against a changed scope.&lt;/p&gt;

&lt;p&gt;The persistent prototype budget allows ten attempted model calls per database, including failures. A process restart doesn't reset it. The default request is bounded to 900 output tokens and a 45-second timeout. There is no fake-answer fallback when the key is missing or the provider fails.&lt;/p&gt;

&lt;p&gt;This is a single-operator prototype. Its database isn't encrypted and it has no multi-user authentication. A review flag is a deliberate action, not proof that someone actually read the text. The exported review still needs editing before anyone uses it with a client.&lt;/p&gt;

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

&lt;p&gt;The open-weight model does the central task: it interprets a request against an agreement. The original application code is open too, so the prompt, validation, review gate and storage can all be inspected and changed.&lt;/p&gt;

&lt;p&gt;The model and endpoint are settings rather than assumptions buried in the workflow. That gives me a place to try another compatible model without rewriting how approval or receipts work. A compatible local endpoint is supported by the client, but I haven't tested local inference. All three actual model calls used the hosted service.&lt;/p&gt;

&lt;p&gt;That distinction matters here. SQLite keeps the records on the operator's machine, but the selected scope and message still go to the configured provider. This build does not keep all client data offline, and I haven't measured a cost or quality advantage over another model. The useful part of the open approach so far is control over the workflow and the ability to investigate or replace its parts.&lt;/p&gt;

&lt;p&gt;The next useful test is a freelancer trying their own messy, ambiguous requests and telling me where the suggestions stop helping. I would do that with their consent and without publishing their client data.&lt;/p&gt;

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

&lt;p&gt;Overall challenge entry. No partner category is claimed.&lt;/p&gt;

</description>
      <category>hf26challenge</category>
      <category>devchallenge</category>
    </item>
    <item>
      <title>Two models sent a moving bill to the wrong chat</title>
      <dc:creator>Yuli Dai</dc:creator>
      <pubDate>Sun, 11 Oct 2026 02:37:51 +0000</pubDate>
      <link>https://dev.to/yulidai/two-models-sent-a-moving-bill-to-the-wrong-chat-26ng</link>
      <guid>https://dev.to/yulidai/two-models-sent-a-moving-bill-to-the-wrong-chat-26ng</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/kaggle-2026-09-23"&gt;Kaggle Benchmarking Challenge&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I'm building &lt;a href="https://github.com/YunongDai2005/dsh-theone" rel="noopener noreferrer"&gt;TheOne&lt;/a&gt;, a DSH plugin where you talk in one main chat and each topic has a separate background session. Before the assistant answers, it has to decide where your message belongs.&lt;/p&gt;

&lt;p&gt;I wanted to isolate that decision. Given a catalog of three topics and recent conversation, can a model choose an existing topic, recognize a new matter, or ask for clarification?&lt;/p&gt;

&lt;p&gt;The test has 36 synthetic cases, six in each group:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explicit topic references&lt;/li&gt;
&lt;li&gt;Resuming a topic from recent history&lt;/li&gt;
&lt;li&gt;Overlapping words and facts across topics&lt;/li&gt;
&lt;li&gt;Starting a genuinely new matter&lt;/li&gt;
&lt;li&gt;Ambiguous references that require clarification&lt;/li&gt;
&lt;li&gt;Routing instructions quoted inside untrusted content&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The topics are a thesis paper, a monthly household budget, and an apartment move. Each case makes one model request. The catalog order rotates, and neither the expected label nor the group name appears in the prompt. The model must return a topic ID, &lt;code&gt;NEW&lt;/code&gt;, or &lt;code&gt;CLARIFY&lt;/code&gt;. Scoring is exact matching after case and whitespace normalization. Extra explanations score zero; there is no LLM judge.&lt;/p&gt;

&lt;p&gt;The cases and implementation were authored with AI assistance. A separate offline harness checks scoring with scripted responses. Those checks make no model calls and are not part of the model results below.&lt;/p&gt;

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

&lt;p&gt;Kaggle's initial task execution used &lt;strong&gt;Gemini 3.7 Flash&lt;/strong&gt;. I then ran &lt;strong&gt;GPT-5.4 nano&lt;/strong&gt; as a lightweight alternative on the same frozen cases and scoring policy. These are single runs, not repeated trials or a search for the best prompt.&lt;/p&gt;

&lt;p&gt;I also scheduled &lt;strong&gt;Qwen 3 Next 80B Instruct&lt;/strong&gt;. Update, October 11: Kaggle reports that run ended with HTTP 429 because the model was experiencing heavy load. I am not assigning it an accuracy score or treating the service failure as a routing failure. I have not started a replacement run.&lt;/p&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Group&lt;/th&gt;
&lt;th&gt;Gemini 3.7 Flash&lt;/th&gt;
&lt;th&gt;GPT-5.4 nano&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Explicit topic&lt;/td&gt;
&lt;td&gt;6/6&lt;/td&gt;
&lt;td&gt;6/6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resumption&lt;/td&gt;
&lt;td&gt;6/6&lt;/td&gt;
&lt;td&gt;6/6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Overlapping facts&lt;/td&gt;
&lt;td&gt;5/6&lt;/td&gt;
&lt;td&gt;5/6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New matter&lt;/td&gt;
&lt;td&gt;6/6&lt;/td&gt;
&lt;td&gt;6/6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clarification&lt;/td&gt;
&lt;td&gt;6/6&lt;/td&gt;
&lt;td&gt;5/6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quoted instructions&lt;/td&gt;
&lt;td&gt;6/6&lt;/td&gt;
&lt;td&gt;6/6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;35/36 (97.2%)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;34/36 (94.4%)&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Both models missed this message:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Add the 480 EUR moving bill as a one-off expense in my monthly budget.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Both returned the apartment-move topic. The expected destination is the household budget: the user is asking to categorize an expense. The routing policy explicitly distinguishes moving logistics from monthly spending.&lt;/p&gt;

&lt;p&gt;The paired case made this easier to inspect:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The mover's quote is 480 EUR. Compare it with renting a truck for moving day.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That request belongs to the apartment move, and both models routed it correctly. The number and subject overlap, but the requested action changes the destination. My interpretation is that the moving-related content outweighed the budget operation in the failed case. Two examples cannot establish a general mechanism, but they give me a specific failure to test further.&lt;/p&gt;

&lt;p&gt;GPT-5.4 nano also picked the thesis topic for “Use the smaller number,” even though the supplied history mentioned lowering both the participant count and the grocery allowance without selecting either. Under the stated policy, that should be &lt;code&gt;CLARIFY&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The six quoted-instruction cases passed for both models. That is useful as a basic check, but the outer requests are explicit and the quoted attacks are simple. I would not call this evidence of general prompt-injection resistance.&lt;/p&gt;

&lt;p&gt;The completed traces record about &lt;strong&gt;$0.0368&lt;/strong&gt; for Gemini and &lt;strong&gt;$0.0026&lt;/strong&gt; for GPT-5.4 nano. Those are recorded inference costs for these runs, not a price comparison for general workloads. The failed Qwen run is excluded. Execution used Kaggle's free allowance; no paid subscription was started.&lt;/p&gt;

&lt;p&gt;The scores are close to the ceiling. One case changes the total by 2.78 percentage points, so the one-case gap is not enough to declare a broadly better model. The concrete mistakes tell me more than the ranking.&lt;/p&gt;

&lt;p&gt;Next I would expand the paired cases while keeping the operation distinct from the subject, then test natural ambiguous dialogue without phrases such as “neither is selected.” I would also test cases where a single message genuinely needs two projects, and define the expected behavior before running the models.&lt;/p&gt;

&lt;p&gt;This is a small public diagnostic of base-model decisions under an explicit policy. It does &lt;strong&gt;not&lt;/strong&gt; measure production TheOne accuracy, represent real user conversations, or provide a contamination-proof held-out test.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.kaggle.com/benchmarks/yulidai/theone-routing-decisions" rel="noopener noreferrer"&gt;Public Kaggle benchmark and leaderboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.kaggle.com/benchmarks/tasks/yulidai/theone-routing-decisions/1" rel="noopener noreferrer"&gt;Task v1 and model outputs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/YunongDai2005/dsh-theone/tree/codex/kaggle-topic-routing/benchmarks/kaggle-topic-routing" rel="noopener noreferrer"&gt;Source, labeled cases, harness checks, and reproducible result summarizer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result summarizer checks all 36 case traces against the source labels and the parent score before producing the tables. Kaggle run IDs are &lt;code&gt;4630860&lt;/code&gt; (Gemini) and &lt;code&gt;4630864&lt;/code&gt; (GPT-5.4 nano).&lt;/p&gt;

&lt;p&gt;If you've built a router like this, how do you decide which topic owns a message that mentions one project but asks for work in another?&lt;/p&gt;

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