← 活動記録一覧

FACTUAL ACTIVITY RECORD · 実際の作業をもとにした活動記録

ConnectorとRunnerのlocal service lifecycleを完成する

固定target、owner-only LaunchAgent、確認付き操作、rollbackをControl Centerへ統合する

対象期間:

目的

ConnectorとEditorial Runnerをlocalで利用するには、plistやlaunchctlをTerminalから手作業で管理する必要があった。任意pathやcommandを受け取る管理機能では、誤操作や同名serviceとの衝突を安全に防げない。

current macOS userだけを対象に、固定された2つのserviceをControl Centerから状態確認・install・起動・停止・自動起動設定できるようにし、更新失敗時のrollbackとunknown設定のfail-closedを含む再現可能な運用を作ることを目指した。

実装

管理applicationに、current UIDのgui/<uid> domainとownerのLaunchAgents directoryだけを扱うcontrollerを実装した。service label、plist path、command、scheduleはallowlistへ固定し、UIやIPCから任意値を受け取らない。

plistはowner-only mode、symbolic link/hard link拒否、同期後のatomic renameで扱う。更新前にplist bytes、runtime設定、load・running・Auto Start状態をsnapshotし、途中で失敗した場合は元の状態へ戻す。管理対象と確認できないplistや同名衝突は上書きも削除もしない。

Control CenterのServices画面はConnectorとRunnerを別cardで表示し、install/update/uninstall、start/stop/restart、Auto Startのenable/disableを現在状態に応じて提示する。状態変更前には対象、変更内容、保持されるdata、rollback可否をnative confirmationで示す。

command入口へ常駐用serveを追加し、同期runtime、owner-only Unix socket、bounded logを組み立て、終了signalでsocketやoutboxを閉じるようにした。日次実行入口には同じservice contractで毎時実行できるrun-dueを用意し、この段階ではEditorial処理を開始せずno-workとして終了させた。

TypeScriptとSwiftでstatus、operation、confirmationを共有fixtureへ揃え、temporary homeとfake launchctlによる状態遷移test、supported macOS上の実LaunchAgent smoke、database変更がないことを検査した。

Control Centerからlocal servicesとsmoke verificationへ至る完成構成

図を描画しています…

確認したこと

確認結果

Connectorのinstall、manual start、実Unix socket status、stop、uninstallが成功し、manual start後もAuto Startはdisabledのままだった。

Runnerのinstall、manual one-shot、no-work結果、uninstallが成功した。

TypeScript 47 tests、Swift 22 tests、repository-wide verificationが成功した。

smoke終了後に管理対象のplist、service登録、temporary homeが残らず、uninstall対象外のlocal dataを削除しない境界を確認した。

cutoff時点でlocal service lifecycle全体が対象へ反映され、関連する完了条件が達成済みとして確定した。

完了とした根拠

固定targetだけを扱うinstall・状態遷移・rollback・uninstallがControl Centerと実LaunchAgentで動作し、共有contractと自動testが通り、終了後のservice資源が残らないことを確認した時点を完了とした。