You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 268177b
Browse filesBrowse the repository at this point in the historyBrowse files
Copy file name to clipboardExpand all lines: docs/architecture/rfcs/typescript-control-plane-migration-v0.md
+28-2Lines changed: 28 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -31,9 +31,9 @@ T0–T4, not additional provider promotion or completed migration claims.
31
31
32
32
<aid="current-delivery-frontier-2026-10-02"></a>
33
33
34
-
## Current delivery frontier (2026-10-07)
34
+
## Current delivery frontier (2026-10-12)
35
35
36
-
Rechecked at main `06b6caa07`: #5413/#5466/#5283 and the affected creation,
36
+
Rechecked at main `38cb407ed`: #5413/#5466/#5283 and the affected creation,
37
37
Host-stop and UI-history owners #5500/#5805/#5308/#5398 are merged. Reuse
38
38
their delivered boundaries rather than reopening the October 2 merge queue.
39
39
The [current validation, migration and deletion plan](ledger/shared-goal-authority-state-provider-v0/2026-09-28-retirement-cadence.md#current-closeout-validation-migration-and-deletion-2026-10-02)
@@ -77,6 +77,32 @@ Lark dry-run and Explore replay qualify local consumers only, not live external
77
77
adoption. This closes the production re-export dependency, while last supported
78
78
source writers, historical recovery, installed cohort and release exits remain.
79
79
80
+
The next T4 package is the [import-first normal-writer cutoff](../../reference/local-authority-provider-selection.md#proposed-compatibility-cutoff-and-release-sequence),
81
+
not another re-export or producer-loading extraction. At `38cb407ed`, live
82
+
unpromoted callers remain in ordinary mutation, bootstrap/creation opt-out,
83
+
team-plan, Monitor, ownership/source lease and active capture/binding. Reuse
84
+
their typed admission/transaction owners; treat retained source capture,
85
+
historical receipts and permanent document IO as recovery obligations.
86
+
The existing delivery Todos should carry these concrete exits:
87
+
88
+
- Qualify the installed import/backup/recovery journey for the declared source
89
+
matrix; importer implementation is already present and is not a missing-code
90
+
dependency. Do not reinterpret complete coordination backup as complete Goal
91
+
backup.
92
+
- Run the bounded reversible core-developer SQLite trial before the breaking
93
+
cutoff, recording real Host adoption/use separately from conversion drills.
94
+
- Deliver the cohesive 2.0 normal-writer cutoff: fresh unmigrated writes and
95
+
execution grants refuse before effects; canonical work and original-operation
96
+
recovery pass with the old writer physically absent. Keep the additive 1.x
97
+
import/deprecation line compatible.
98
+
- After the last source caller exits, reconcile pending outboxes and delete
Copy file name to clipboardExpand all lines: docs/reference/local-authority-provider-selection.md
+47-12Lines changed: 47 additions & 12 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -276,10 +276,10 @@ to qualify each last caller family independently.
276
276
277
277
| Retained boundary | Current value and owner | Evidence needed before removal |
278
278
| --- | --- | --- |
279
-
|`todos.py`, `bootstrap.py`, `todos/line_update.py`| Unmigrated source creation and Todo edits still use Markdown writes. Canonical lifecycle decisions belong to the typed provider transactions. |Migrate the corresponding supported callers; run creation, update and recovery with the old writer physically absent. Keep Markdown display projection and supportedimport/export. |
279
+
|`todos/mutation_api.py` → `todos/legacy_mutation.py`; `bootstrap.py`, `work_items/team_plan_adapter.py`, `scheduler/legacy_monitor_poll.py`| These are still reachable unpromoted mutation families. Production callers have left the historic `todos.py` re-export; canonical transactions use their concrete typed owners. |Qualify the import-first cutoff for every family below, then delete its normal source-write dispatch and implementation together. Keep Markdown display, historical imports where supported, and import/export recovery. |
280
280
|`runtime_shadow_writer_adapter.py`, `local_authority_shadow_outbox.py`| Source writers prepare capture before the primary write and record commit afterward; outbox records preserve interrupted operations. Typed coordination owners interpret the captured mutations. | Stop the corresponding source producers, classify every pending prepared/committed entry against its source and exact receipt, and prove recovery after producer removal. Clearing configuration cannot cancel an active capture obligation. |
281
281
|`local_authority_shadow_projection.py`| Python transports full source artifacts, rejects floats and unsafe integers before Python/JS digest comparison, and checks identity, size, digest and regular-file readback. `coordination.source.project` remains the typed projection owner. | Preserve exact-byte and malformed-input behavior in the replacement, including symlink rejection, bounded transfer and ambiguous-operation errors. A language-only rewrite is insufficient. |
282
-
|`runtime_shadow.py`, `local_authority_shadow_adapter.py`| Explicit bootstrap, inspect, candidate read, drain and recovery still consume full source snapshots, cursor history and digest comparison. |Qualify the replacement management/recovery entrypoints and supported historical evidence; a canonical write passing does not establish these readers are unused. |
282
+
|`runtime_shadow.py`, `local_authority_shadow_adapter.py`; retained `configuration.py`, `authority_source_capture.py`, `local_authority_shadow_history.py`, `local_authority_shadow_readback.py`| Configuration, cold-source capture and read-only diagnostics now have concrete owners independent of producers. Explicit shadow bootstrap/drain/promotion and recovery still have live callers. |Retire obsolete producer aliases only after their supported callers exit. Preserve the retained import/history/readback owners and outbox recovery; inspect or cold import succeeding without producers does not make a live drain unused. |
283
283
|`authority_core.py`| Live Todo adapters delegate to typed mutation/ownership rules; scope overlap delegates to the typed lease owner. The lease-mode input compatibility contract is explicitly retained. | Trace direct, internal, dynamic and exported callers separately. Review registered historical input support before retiring its vocabulary; do not infer a fresh grant from old `legacy` inputs. |
284
284
285
285
Paths in the table are under `loopx/` or its `control_plane/coordination/` and
@@ -332,12 +332,15 @@ promotion requires an enabled, bootstrapped shadow qualified by **real source
332
332
mutations**, with the saved operation/event policy. An empty shadow cannot pass.
333
333
If the major release first blocks the writer that produces those mutations, a
334
334
cold Goal cannot manufacture its own migration qualification. The selected
335
-
upgrade path is a separately qualified **reviewed import of the existing
336
-
source**, without requiring a compatible 1.x writer to create new captures.
335
+
upgrade path is **reviewed import of the existing source**, implemented by the
336
+
existing typed transaction and CLI/App storage settings described below,
337
+
without requiring a compatible 1.x writer to create new captures.
337
338
Do not lower operation counts, fabricate capture history or bypass source and
338
-
receipt verification to hide this dependency. A direct importer is a remaining
339
-
acceptance item, not a capability established by canonical create or isolated
340
-
archive restore. Keep the compatible installer available for recovery until
339
+
receipt verification to hide this dependency. Implementation and bounded
340
+
source/normal-wheel recovery evidence do not close installed adoption, complete
341
+
Goal backup or every supported historical source. Keep those acceptance rows
342
+
open; canonical create and isolated archive restore cannot substitute for them.
343
+
Keep the compatible installer available for recovery until
341
344
the declared historical support matrix has been qualified.
342
345
343
346
The import package must close one installed user journey through the existing
@@ -504,9 +507,26 @@ used by the source witness, including registries outside conventional Goal folde
The last-writer inventory at `38cb407ed` names the next implementation frontier:
511
+
512
+
| Caller family | Existing owner and cutoff proof |
513
+
| --- | --- |
514
+
| Ordinary Todo add/update/claim/complete/supersede/archive |`todos/mutation_api.py`, `provider_create.py`, `provider_update.py`, `provider_terminal_lifecycle.py`. Five legacy mutation dispatches remain; claim uses the update route. Require canonical authority before a fresh mutation, then remove `legacy_mutation.py` and writer-only line editing after tracing public imports. Preserve validators, display publication and original receipt recovery. |
515
+
| Bootstrap/reconnect and explicit creation opt-out |`bootstrap.py` and the typed creation/default owner. Preserve existing canonical selection and interrupted initialization; an unmigrated source or disabled creation setting receives the reviewed import/configuration route before source replacement. Do not turn an old Goal into an empty new store. |
516
+
| Confirmed team-plan commit |`work_items/team_plan_adapter.py` and `work_items.team_plan.commit`. Remove the unpromoted batch writer after canonical-required admission; recover historical confirmation receipts without applying the plan again or losing later work. |
517
+
| Monitor observation and succession |`scheduler/monitor_poll_writeback.py`, `provider_monitor_poll.py`, `monitor_batch.ts`. Remove fresh `legacy_monitor_poll.py` writes, retaining `monitor_batch_receipts.py` recovery and exact generation/successor/once-only identity. A promoted historical replay must leave old outbox bytes inert. |
518
+
| Ownership-policy/source lease entrypoints |`todos/handoff_mode.py`, `provider_handoff_mode.py` and the existing lease owners. Keep source inspection and settled lease history for import; refuse fresh unmigrated execution grants. An expired but unreleased lease still blocks import. This is separate from File/SQLite provider selection. |
519
+
| Capture and active binding |`runtime_shadow_writer_adapter.py` and the existing typed source/outbox owners. Removing a configuration switch does not cancel an active binding. Classify prepared, committed and ambiguous entries against source bytes and original receipts before removing the last producer; retain recovery readers for the declared support window. |
520
+
521
+
These are live call sites, not modules approved for immediate deletion. The
522
+
implementation PR must join their shared typed admission boundary and exercise
523
+
both fresh refusal **before any effect** and original-operation recovery. Do not
524
+
deliver one PR per fallback. Use one cohesive normal-writer cutoff package,
525
+
then a separate producer cleanup when its last callers and outboxes are settled.
526
+
507
527
Deliver complete, reversible PR packages in this order:
508
528
509
-
1.**Direct source import and support boundary.**Implement and qualify the
529
+
1.**Direct source import and support boundary.**Qualify the existing
510
530
reviewed cold-source import on the installed CLI and packaged App, alongside
511
531
existing new-Goal creation/retry and provider migration. Cover both
512
532
qualified and cold unpromoted sources, target-only settings, stopped writers,
@@ -515,7 +535,14 @@ Deliver complete, reversible PR packages in this order:
515
535
its writer. An additive 1.x release may ship the importer and deprecation
516
536
guidance first; using the old writer is not a prerequisite for import.
517
537
New SQLite creation is already implemented.
518
-
2.**Normal writer family cutoff.** In the major-release implementation, enforce
538
+
2.**Core-developer SQLite trial.** Between import qualification and the breaking
539
+
cutoff, use the existing [reversible trial procedure](sqlite-authority-store.md#reversible-developer-trial--可逆开发者试用).
540
+
Record actual installed source, CLI/App/Host adoption, ordinary use and recovery
541
+
outcomes for the declared small cohort. Use disposable copies for conversion
542
+
drills when an existing Goal is already canonical. Rollback/export starts at
543
+
the current head and retains new writes. A local conversion exercise is not
0 commit comments