fm-code-duplication-detect-withdrawal (arxiv-fetcher.ts + refresh-watchlist.ts で 4-signature regex 重複) を structural resolve。 新 shared module scripts/research-radar/arxiv-withdrawal.ts に WITHDRAWAL_SIGNATURES + detectWithdrawalInHtml() + extractCanonicalArxivId() 抽出、 両 caller が import で 参照 = single source of truth、 silent drift 構造的排除。
fm-code-duplication-detect-withdrawal)、 shared helper 抽出 は deferarxiv-withdrawal.ts (66 line)Exports:
WITHDRAWAL_SIGNATURES: readonly RegExp[] — 4-signature array (readonly immutable marker)detectWithdrawalInHtml(html): WithdrawalDetectionResult — first-match signature scannerextractCanonicalArxivId(idStr): string | null — arxiv URL/id normalizerWithdrawalDetectionResult interfaceComment header 明示:
Any change to the WITHDRAWAL_SIGNATURES array or the detection function now affects both call sites simultaneously — silent drift eliminated.
arxiv-fetcher.ts (-30 line net)WITHDRAWAL_SIGNATURES + detectWithdrawalInHtml() + extractCanonicalArxivId()import { detectWithdrawalInHtml, extractCanonicalArxivId } from './arxiv-withdrawal';sleep() helper (単純、 shared 化不要) + ArxivEntry.withdrawn? fieldrefresh-watchlist.ts (-15 line net)detectWithdrawal() function (含む local 4-signature array)import { detectWithdrawalInHtml } from './arxiv-withdrawal';detectWithdrawal(html) → detectWithdrawalInHtml(html) (rename)npx tsx scripts/research-radar/refresh-watchlist.ts --dry-run (~42s wall-clock):
▶ Checking 14 tracked paper(s) via arxiv.org/abs/... (rate-limited 3s between requests) 1-13/14 ✓ no change 14/14 2605.13886 ↩ already withdrawn (skip) — Parity vectors and paradoxical sequences ▶ Refresh summary: 0 newly-withdrawn detected, 13 unchanged, 0 errors
= shared module import path 動作 verify、 STEP 2203 Feature 3 と 同 behavior 保存 confirmed。
| fm | STEP | Status |
|---|---|---|
fm-code-duplication-detect-withdrawal | 2204 (marker) → 2208 (resolved) | eliminated |
readonly const 化 は immutability marker のみ (runtime 挙動 不変)detectWithdrawal は detectWithdrawalInHtml に rename、 backward compat alias なし (script、 外部 caller なし、 shim 不要)sleep() helper は 2 caller で 同一 だが 単純すぎ (2 line)、 shared 化コスト vs 収益 不釣合、 意図的 保持signature-drift-check.ts (canonical Niu abs HTML fixture 保持 + 既 signature 一致 unit test) candidate[via 藤本さん explicit go 「STEP 2208 (4-signature regex の shared helper 抽出) go です」 / orig: chat-Claude(cloud) next candidate recommendation accept / execute: rei-aios-59]