Issue #69 / Track #93。現行restart契約のStage 7「通常boustrophedon traversal」だけを実装する。
中央耕の最後から仕上げ周回3列目へ移動する経路は、後続Trackの責務であり今回は実装しない。
利用者確認により、Claude報告のTrack #92由来gapは次のように扱うことが確定した。
endpointResidualCm <= 0付近で境界上の先頭laneが縮退・消失し得る件は、今回は不問とする。DEADHEADで先行移動し、反対端から入口方向へDEADHEAD、実際の耕耘方向と終点を結果・PC表示へ残す。DEADHEADをsafeCenterlineRegion内に生成できない場合だけ、型付きで停止する。この修正ではsingle-laneの事前移動までをTrack #93の責務に含める。複数laneの通常ケース、および最後の
中央耕から仕上げ周回3列目へのtransferが後続Trackである点は変更しない。
Stage 7のlaneCount == 1分岐だけでは不十分である。実筆でproduction pipelineを通したところ、物理的には
1laneだけ置ける幅でも、Stage 5のterminal-constrained overlap solverが先に
「指定偶奇(EVEN)を満たす列数解が存在しない」としてINVALID_INPUT / OVERLAP_ADJUSTMENTで停止した。
その結果はcandidate lane数=0であり、Stage 7のsingle-lane例外へ到達しない。
次を追加実装すること。
requiredParityを満たす解が無い場合に、単純に失敗する前にcenterTillageRegion、開始側からの先行移動可能性をlaneCount=1を捏造したり、テストfixtureの値を直接注入しない。requiredParity=EVENを満たしたとは記録しない。single-lane例外であることと、実際のRegionUnsupportedまたは適切な型付き停止を返す。InvalidInputとしない。入力値が不正なのではなく、物理幅と通常偶奇制約のSOLVED / laneCount=1 / passCount=1 / leadInありになることを確認する。必須の回帰試験とPC gate:
requiredParity=EVENだが物理的には1laneだけ成立するfixtureを追加する。CenterTillageCandidateLaneResult.SingleLaneを直接組み立てるだけでは証拠にしない。INVALID_INPUT / OVERLAP_ADJUSTMENT / candidate lane数0ではなく、SOLVED / laneCount 1 / candidate lane数1 / Stage 7成立 / hasLeadIn=trueを表示する。今回利用者が確認した失敗表示は次である。これを修正前の再現条件・回帰基準として扱う。
pipeline最終状態: INVALID_INPUT
停止Stage: OVERLAP_ADJUSTMENT
candidate lane数: 0
terminal-constrained overlap solverが解を返さない:
実効調整範囲のpitch 100..200cm内に、指定偶奇(EVEN)を満たす列数解が存在しない
この失敗をテスト用SingleLane直接注入やPC表示だけで迂回してはならない。producerであるStage 5を修正し、
production pipelineからStage 7のsingle-lane例外へ実際に到達させること。
Track #92までのPC previewには、中央部分を耕す青い直線が並んでいる。しかし、それらはまだ
「どの線を何番目に、どちら向きに走り、端でどう隣の線へ移るか」を表す一続きの走行経路ではない。
今回完成させるのは次の範囲である。
PC previewでは、直線の集合ではなく、走行番号、矢印、耕す区間、折り返しの空走りを地図上で確認できるようにする。
次を前倒しで実装してはならない。
今回の「折り返し」は、中央耕線の終点から隣の線の始点へ、safeCenterlineRegion内だけを耕さずに移動する
安全な接続経路である。現行契約に無い旋回半径を推測して追加しない。運動学的な旋回形状が必要と判明した場合は
実装を止め、契約変更として利用者へ確認する。
次を全文確認する。
AIエージェント作業規約.mdSTARTUP_CONTEXT.mddocs/standards/navigation-field-geometry-contract-conformance.mddocs/runbooks/navigation-field-geometry-pipeline-contract-restart.mddocs/runbooks/navigation-field-geometry-review-gates.mddocs/standards/ui-design-guidelines.mddocs/specifications/p6-ui-spec.mdセッション開始時にButlerのwork_session_start(project_root)、work_observe()、
track_summarize(parent_issue_id=69)を実行し、Track #93を作業対象にする。gitコマンドを直接使わない。
Pythonが必要なら必ずuv経由にする。
新しい自由入力を追加せず、production pipelineの次の出力だけを使う。
safeCenterlineRegion。開始側、終了側、最初/最後の方向、偶数列/奇数列をUI、HTTP request、fixture専用引数から再入力してはならない。
Track #92の結果型を次の処理へ渡し、内部値をばらばらの引数へ戻さない。
今回正常に解くのは、各中央耕線がpolygonとの交差後も1本の連続した採用区間になる場合だけである。
例えば21本の中央耕線がある場合は、開始側から終了側へ1〜21の順で訪問する。距離を短くする目的で
途中の列を飛ばしたり、21本目から始めたり、奇数列と偶数列を別々に処理したりしてはならない。
1本の中央耕線が2区間以上へ分裂する場合は、今回の通常ケースとして無理に接続しない。安全な型付き結果で
「後続の不規則形状処理が必要」と返す。古いWorkArea探索へ自動的に丸投げして完成扱いにしない。
実走順はTrack #92のlane配置が持つfinish側からの逆算順と混同しない。solver内部のidentityは保持したまま、
presentationと走行actionはstart側からfinish側へ並べる。
必ず次を満たす。
firstLaneOffsetに対応する中央耕線。lastLaneOffsetに対応する中央耕線。firstPassDirection。lastPassDirectionと一致する。複数laneで不一致を検知した場合、どれかの値を黙って反転・並べ替え・補正してはならない。warning付きで停止する。
物理的に1laneしか成立しない場合はこの停止条件を適用せず、§0のsingle-lane経路を生成する。
各中央耕線の走行終点と、次の中央耕線の走行始点を接続する。
DEADHEAD。safeCenterlineRegion内にあることを既存JTS基盤で検証する。既存の接続候補生成・安全判定技術を再利用してよい。ただし、旧Track #87/#88のWorkArea全体探索、
最大候補数、開始側/終了側の自由選択という意味論を持ち込まない。
型名は既存命名に合わせて決めてよいが、結果は最低限次を表現する。
DEADHEAD接続geometry。このTrackでは、最後の中央耕passから仕上げ周回へ向かうactionを出力しない。出力の終点は最後の中央耕passの
終点で止める。
PC previewのproduction serviceを、Track #92の成功結果から今回の通常往復走行resolverを呼ぶよう接続する。
地図に最低限次を表示する。
画面の説明文には、今回の到達点を「中央耕内の往復と折り返しまで」と明記し、
「中央耕の最後から仕上げ周回3列目への移動は後続」と表示する。
安全性未検証の内部候補IDだけを利用者に選ばせない。正常な矩形では候補切替UIを出さず、契約どおり一意な
start→finish順を表示する。
DEADHEADでsafeCenterlineRegion内。DEADHEADが1件ある。DEADHEADを安全に生成できないfixtureでは型付きで停止する。track-coreへ追加する。:track-core:test、:pc-tool:test、:pc-tool:installDistを実行する。次の場合は推測で実装せず停止する。
次をすべて満たすまでTrack #93を完了しない。