Skip to content

Legacy field-rule retirement checkpoint

Moved without content change from typescript-control-plane-migration-v0.md (former section "Legacy field-rule retirement checkpoint") on 2026-09-26; RFC baseline 3e443ad7c. Checkpoint records live in this ledger, not in the RFC body.

todos/field_update.ts now owns the complete metadata intent assembly used by the legacy update, claim, complete, and supersede line writer: status and completion timestamps, omission versus explicit clears, binding precedence, removed-policy repair, resume-generation pairing, and completion metadata. It composes the existing TS completion rule directly. The replaced Python decision branches and the last-caller todo.completion_state.metadata_updates RPC/facade are removed, not kept as a fallback.

This is a pure plan, not admission or a provider commit. Python still owns Markdown lookup/encoding, byte-level no-op detection, locking and external effects. Public role/binding admission and the event writer are not declared migrated by that slice. Native planning now composes this owner as described in T1; unsupported fields gain no authority, no goal is promoted, and no third storage path appears. Rejected plans now leave even the caller's in-memory line buffer unchanged; public rejected transactions were already non-committing.

There is one field-plan crossing per legacy line write. It replaces the former metadata RPC on ordinary edits; already-finalized completions with an override gain one planning crossing. Cached codec normalization calls remain. This is semantic deletion, not a claim of fewer crossings on every command. Retire the adapter with its final legacy lifecycle caller after full-goal cutover, or fold it into that caller's coarse transaction when migrating the caller; do not grow a series of field-level RPCs. Retain Markdown rendering permanently.