AI(Claude)で派遣の3年ルール いつまで計算機を作って売るまで:3か月を超える空白の数え方、全角・半角で1年以上ずれた抵触日、別のエージェントの答え合わせ

派遣で働く人が同じ課で働きはじめた日を入れると、抵触日(働けなくなる最初の日)とあと何日働けるかが分かる計算機を、AI(Claude)で作って note で売っています。空白の「3か月を超える」を日付で決めたこと、課の名前の全角・半角で抵触日が1年以上ずれた不具合、別のエージェントとの答え合わせを、作る人向けに書きます。

※本記事には、筆者が note で販売しているアプリへのリンク(PR)が含まれます。

作ったもの

「派遣の3年ルール いつまで計算機」という、ブラウザで動く計算機です。

お試し版は、今の課で派遣が始まった日を入れるだけで使えます。前にも同じ課で働いていた人は、前の派遣の開始日と最後の日も入れます。

下は、お試し版をそのまま埋め込んだものです。見本の日付が入っているので、自分の開始日に変えてみてください。

(表示されない場合は お試し版をブラウザで開く)

  • お試し版(無料):働ける最後の日とあと何日、抵触日、前の派遣1件との空白の判定、この課に戻れるいちばん早い日、1年になる日、対象外のチェック
  • 完全版(note・300円):就業履歴20件から課ごとの抵触日、就業条件明示書の日付との比べ、3年までの道のり、5年ルールの目安、A4・1枚の印刷、カレンダー用ファイル(.ics)

題材の選び方:解説はあるのに、自分の日付が出ない

このシリーズでは、検索の上位に解説やQ&Aだけが並び、計算の道具がまだない語を選びます。道具がすでに上位にある語は見送ります。

「派遣 3年ルール いつまで」「派遣 抵触日 計算機」で調べると(10月20日・21日)、上位は解説の記事・Q&A・労働局の資料で、日付を入れて抵触日を数えるものは見当たりませんでした。

決まりは解説で分かっても、自分が何年何月何日まで働けるか、前の派遣との2か月半は数え直しかは、自分の日付で数えるしかありません。空白の境目では、1日の差で答えが入れかわります。

数え方は、資料と条文から先に決める

期限の日付は、1日ずれてもそれらしく見えます。そこでコードの前に、厚生労働省・労働局の資料と条文から数え方を決め、仕様書(SPEC.md)の2章に「この通りに数える」と書きました。点検役も校閲役も、この章を正にします。

  • 抵触日は、3年の起点(その課で派遣が始まった日)の3年後の同じ日。2025年5月1日からなら2028年5月1日で、働けるのはその前日まで
  • 3年後に同じ日がない(2月29日から)ときは、3月1日
  • 前の派遣との空白が3か月を超えなければ続いている扱いで、起点は前の開始日のまま

迷ったのは「3か月を超える」の境目です。資料の言い方は、3か月を超えない空白なら続いているとみなす、までで、日付の定義がありません。

そこで、民法の期間の数え方を当てはめました。前の派遣の最後の日 L の翌日 G から3か月の期間が終わる日を E とし、次の派遣が E+1 までに始まれば続いている扱い、E+2 以降なら数え直しです(よく言う「3か月と1日以上あける」に当たります)。3月31日に終わった人なら、7月1日開始は続いている扱いで、7月2日からが数え直し。11月29日に終わった人も11月30日の人も、空白の3か月が2月の末日で終わるので、3月2日からです。

日付は1970年1月1日からの日の番号(整数)で持つので、E+2 はただの足し算です。

// 期間が終わった次の日(応当日があればその日、なければ翌月1日)
function afterMonths(n, months){
  const c = fromDn(n), t = c.m + months,
        y = c.y + Math.floor(t / 12), m = mod(t, 12);
  return c.d <= lastDay(y, m) ? dn(y, m, c.d) : dn(y, m + 1, 1);
}
const periodEnd = (n, months) => afterMonths(n, months) - 1;
// 抵触日(3年後の同じ日)
const conflictOf = origin => afterMonths(origin, 36);
// 空白:S が E+1 までなら続いている扱い
function gapInfo(L, S){
  const G = L + 1, E = periodEnd(G, 3);
  return {L:L, S:S, G:G, E:E, thr:E + 2, cont:S <= E + 1,
          days:S - G, len:span(G, S - 1)};
}

空白も3年に入り、派遣元を変えても続く:データの持ち方

続いている扱いなら空白も3年に入り(時計は止まりません)、派遣元(派遣会社)を変えても、同じ課なら通算されます。なのでデータは、同じ課の派遣を開始日の順に並べたものだけ。空白が3か月を超えた所から数え直し、空白は引きません。派遣元の名前は表示にだけ使います。

// rows:同じ課の派遣を開始日の順に。{start, last(続いているなら null), moto}
function chainOf(rows){
  const links = [];
  let oi = 0;
  for(let i = 1; i < rows.length; i++){
    const g = gapInfo(rows[i - 1].last, rows[i].start);
    links.push(g);
    if(!g.cont) oi = i;   // 3か月を超える空白 → ここから数え直し
  }
  const origin = rows[oi].start, conflict = conflictOf(origin),
        lr = rows[rows.length - 1];
  // …(略)
}
派遣の3年ルール いつまで計算機の完全版の課ごとのカード。総務課は派遣会社Aと派遣会社Bのあいだが「空白 2か月(59日間) → 続いている扱い」で、3年の起点2024年4月1日・抵触日2027年4月1日と出ている
完全版の課ごとのカード(見本の履歴・2026年10月20日)。派遣会社AからBに変わり2か月あいても、同じ総務課なので3年は2024年4月1日から。棒のしまが空白

課の名前のゆれ:NFKC でそろえないと、抵触日が1年以上遅く出た

完全版は、課の名前が同じ行を同じ課として数えます。最初の版がそろえていたのは、仕様書のとおり、名前の空白(半角・全角・前後)だけでした。

別のエージェントの点検で、ここが重い指摘(重1)になりました。「第1課」と「第1課」(数字だけ全角)で、課が2つに分かれます。2023年4月1日〜2024年3月31日と、1か月あけて2024年5月1日から続いている人は、本当は続いている扱いで抵触日は2026年4月1日。それを1年1か月遅い2027年5月1日にして、2026年10月20日には過ぎているのに「あと 192日」と出していました。

全角・半角はキーボードの設定で変わり、完全版はURLでパソコンとスマホをまたいで使えるので、行ごとに端末がちがえば起こります。直し方は、鍵を作るときに先に Unicode の NFKC 正規化をかけ、英字を小文字にし、空白の並びを1つにすることです。

// 同じ課かどうかの鍵(点検の重1・2回目の点検の中1で直した)
const nfkc = s => (String.prototype.normalize
  ? String(s).normalize('NFKC') : String(s));
// NFKC でそろわないダッシュ・長音・波ダッシュは、鍵だけ「-」「~」に
const DASH_RE = /[\u2010-\u2015\u2043\u2212\uFF0D\u30FC\uFF70]/g,
  WAVE_RE = /[\u301C\u3030\u223C\uFF5E]/g;
function groupKey(s){
  const k =
    nfkc(s).toLowerCase().replace(DASH_RE, '-').replace(WAVE_RE, '~').replace(/[\s\u3000]+/g, ' ').trim();
  return /[\p{L}\p{N}\p{S}\p{P}]/u.test(k) ? k : '';
}

NFKC でもそろわない字もありました。直したあとの2回目の点検で、ダッシュ・マイナス・長音(−と-、ーなど)や波ダッシュ(〜と~)の書き分けで、また課が2つに分かれると分かりました(中1)。「営業1−2課」と「営業1-2課」がその例です。鍵を作るときだけ「-」と「~」にそろえ、表示する名前は入れたとおりにしています。

名前の似た課を知らせる案もありましたが、本当に別の「第1課」と「第2課」でも毎回出てしまうので、入れていません。

過ぎた日を、これからの目安として出さない

点検では、3年を使い切ったあとの文も2つ直しました(点検の中2・中3)。1つ目は、3年働いて空白を待っている人に、「それより前にこの課で始めると続いている扱いで、働けるのは」のあとに、もう過ぎた日を出していたことです。今は、抵触日を過ぎているので派遣として働けない、と出します。

2つ目は、抵触日を過ぎても続いている人です。お試し版は今の派遣が続いている前提なので、最後に働ける日で終わった場合の戻れる日が過ぎた日付になり、もう数え直しになったと読めました。最後の日がなく今日が抵触日以後なら、日付は出さずに相談先を案内します。

同じ日付でも、今日との前後で目安にも過去の話にもなるので、今日の状態(始まる前・あと何日・過ぎた・終わったなど)を先に決めて、文を書き分けています。

お試し版と完全版を1つのソースから作る

もとのファイルは src/app.html の1枚で、完全版だけの行を //#full 〜 //#end の印で囲んであります。build.py がこれを、お試し版と完全版の2つのページに書き分けます。お試し版に完全版の関数や文言、URLがまざっていないかは、test_build が見張ります。

計算は版で分けていません。お試し版は、前の派遣1件と今の派遣の2行を、完全版と同じ chainOf に渡すだけです。

書体はページに出る字だけを切り出して埋め込み、外へは何も読みに行きません。課の名前は人が入れるので、細字には名前によく出る漢字(総務・経理・製造など)も足しました。

確かめ方:別のエージェントに、仕様書だけから計算を書かせる

手元のテストは5本・17,725項目で、Playwright(Python)で両方の版を開いて確かめます。計算は、仕様書の例と手で書いた答えに、ランダムな履歴3,100件などを加えました(空白の境目・月末・2月29日を多めに)。わざと10種類の誤りを入れたアプリでは、どれもテストが落ちました。

ただ、答え合わせの計算(model.py)も同じAIが書いたもので、思い込みまで同じかもしれません。そこで、作ったときの会話も作った側のテストも見ていない別のエージェントに、仕様書の2章だけから答え合わせのモデルを書かせ、アプリを壊しにかからせました。

点検役は今日の日付を1件ずつ固定して画面の文字を読み、モデルと比べました。お試し版5,000件・完全版2,340件の計7,340件で、計算の食い違いは0。比べる仕組みが空振りしていないことも、モデルをわざと壊した10通りで確かめています。

それでも指摘は、重い1件・中くらい6件・軽い12件。重い1件(課の名前のゆれ)は、計算の突き合わせではなく、操作の点検で見つかりました。

note の記事の原稿も別のエージェントに校閲させ、17件の指摘を受けました。重要の1件は「空白の3か月は、1日でも足りないと続いている扱い」という注記で、裏返すと「ちょうど3か月あければ数え直し」と読めます(実際は、ちょうど3か月は続いている扱い)。直したところは1件ずつ、直す前なら落ちる形のテスト(169項目)で見張っています。

直したあと、もう一度別のエージェントに、直したところとその副作用だけを見る点検をさせました。7,340件の答え合わせに加えて印刷の紙2,340件・文字のコピー582件でも食い違いは0、わざとまちがえたモデル19通りは全部拾えました。それでも、上のダッシュ・長音の書き分け(中くらい1件)と、軽い4件が見つかり、直しています。

かかった時間と、やってみて思ったこと

作業は10月20日の夜から21日の朝まで。20日の夜にアプリと note の原稿を作り、23時台から翌1時台に点検と記事の校閲を並べて回し、21日の未明に直してから2回目の点検、明け方に2回目の直しをして、テストを流し直しました。

思ったのは、重い問題が日付の式ではなく、その前後にあったことです。前は「どの行を同じ課とみなすか」(重1)、後ろは「その日付を今日の時点でどう言うか」(中2・中3)。どちらも7,340件の答え合わせでは出ず、使う人の入れ方や読み方を試して見つかりました。

お試し版と完全版

お試し版は、ブラウザで開けばすぐ使えます(登録・インストール不要)。

お試し版をブラウザで開く(無料)

完全版(就業履歴20件・明示書との比べ・印刷・.ics など)は、note「余白の実験室」の記事の有料部分にURLがあります(300円・買い切り)。

note の記事を見る(PR)

同じ「働く人の困りごと」の道具として、有給の付与日・日数 計算機と、ふたりの休み合わせカレンダーも作っています。

※この記事は、AI(Claude)でブラウザのアプリを作って売るまでの記録です。計算機が出すのは、個人単位の期間制限(同じ課で働ける3年)の目安で、法律の助言ではありません。事業所単位の抵触日は数えないので、最終的には就業条件明示書と派遣元で確かめてください。動きは Chromium(パソコンとスマホの幅)で確かめましたが、実機のスマホでの .ics の取り込みと印刷は、まだ確かめていません。

この記事が参考になったら、ランキングの応援をお願いします。

にほんブログ村 小遣いブログ 副業・副収入へ にほんブログ村 小遣いブログ 在宅ワークへ
おすすめの記事