v0.1.58
Highlights
Direct Execution (new)
- Direct-routed ALTERs now execute as native MySQL DDL — changes the planner routes to direct execution run under the policy's lock-wait bound instead of a full copy, making small/metadata-only changes fast and safe. (#836)
direct_executionpolicy configuration — a new opt-in config block (enabled,max_table_rows,lock_acquisition_timeout) controls when direct execution is allowed. (#858)- Plan-time execution-mode verdicts — plans resolve and display whether each statement will run direct or via copy, so the route is visible before anything applies. (#886)
- Disclosure and manual confirmation for direct-execution changes — PR comments call out direct-routed statements and require an explicit confirmation before applying. (#839)
GitHub PR Experience
- Apply is marked as the primary action with
▶️ — the apply instruction stands out from secondary commands in the plan comment. (#896) - Failed tables surface their own error — a failed table shows its failure reason directly below its progress row, carried on a new per-table
error_messageprogress field. (#888, #890) - Pre-copy failures render without a misleading progress bar — failures before the copy starts no longer show 0% progress. (#880)
- Remote apply failures surface their reason in the PR comment — instead of a bare failed state. (#878)
- Support-channel footer shows exactly when it should — offered on unmanaged-schema notices and unsafe-change refusals, and omitted everywhere it was noise. (#884, #871, #883)
- Bare plans stay silent on non-owning deployments — a bare
plancommand no longer fans out duplicate comments from deployments that don't own the change. (#870) - Multi-deployment detail bodies use derived status — detail sections stay consistent with the aggregate state. (#882)
Driver Correctness
- Pending operations are only claimed when their apply is still claimable — a driver can no longer pick up work under an apply that has settled or moved on. (#906)
- Stranded pending operations under settled applies are reaped — leftover operations from interrupted drives are cleaned up instead of wedging future work. (#911)
- The persisted tenant is authoritative for durable webhook deliveries — redeliveries resolve to the tenant recorded at receipt time. (#872)
- Gate evaluation failures are distinguished from merit blocks — an evaluation error fails closed and reads as an error, never as a judged "blocked". (#823)
Observability
- Apply identity on the full drive lifecycle — operator, sequential, grouped, resume/control, task-readiness, gRPC client, engine, and handler log lines all carry the apply's triage identifiers, so a failed or stalled apply can be traced end-to-end from logs alone. (#877, #879, #881, #885, #887, #889, #893, #913, #914, #917)
- Spirit control-path and apply logs route through the change logger with table context — engine log lines land in the same identity-scoped stream as the rest of the drive. (#918, #875)
- Stuck-pending apply diagnostics are surfaced and preserved — the diagnosis of why an apply sat pending survives for later triage. (#816)
- Log fields that collided with reserved log-pipeline attributes were renamed — affected fields index correctly again. (#874)
Internals
StatementTypeis owned bypkg/ddlbehind the parser seam — DDL classification no longer leaks parser types across package boundaries. (#908)- Docs: where to put the schema directory in namespaced repos. (#849)
- Spirit pin advanced to latest main. (#894)
Contributors
What's Changed
- refactor(webhook): distinguish gate evaluation failures from merit blocks by @Kiran01bm in #823
- fix(github): show support footer only on unsafe-change apply refusals by @aparajon in #871
- fix(observability): rename log fields that collide with reserved log-pipeline attributes by @aparajon in #874
- fix(github): keep bare-plan fan-out silent on non-owning deployments by @aparajon in #870
- fix(observability): carry table context on Spirit apply log lines by @aparajon in #875
- fix(tests): isolate awssm resolver test from ambient AWS environment by @Kiran01bm in #876
- refactor(webhook): make the persisted tenant authoritative for durable deliveries by @Kiran01bm in #872
- feat(observability): bind apply identity to operator drive-scoped logger by @Kiran01bm in #877
- refactor(github): declare support-footer eligibility at render time by @aparajon in #883
- fix(github): offer the support channel on unmanaged-schema notices by @aparajon in #884
- fix(github): surface remote apply failure reason in PR comment by @Kiran01bm in #878
- feat(observability): bind apply identity to local resume and control logs by @Kiran01bm in #879
- feat(github): render pre-copy failures without a progress bar by @Kiran01bm in #880
- feat(github): use derived status in multi-deployment detail bodies by @Kiran01bm in #882
- feat(api): add the direct_execution policy configuration surface by @aparajon in #858
- feat(observability): bind apply identity to sequential drive logs by @Kiran01bm in #881
- fix(observability): preserve drive logger in task readiness checks by @Kiran01bm in #885
- feat(observability): bind apply identity to grouped drive logs by @Kiran01bm in #887
- feat(observability): bind identity-scoped logger to gRPC client core remote drive loop by @Kiran01bm in #889
- feat(github): surface a failed table's error below its row by @Kiran01bm in #888
- Bump spirit to
@main(e94e99be2c1b) by @morgo in #894 - feat(engine): resolve plan-time execution-mode verdicts under the direct execution policy by @aparajon in #886
- feat(engine): execute direct-routed ALTERs as native MySQL DDL under the policy's lock bound by @aparajon in #836
- feat(api): carry per-table error_message on TableProgress by @Kiran01bm in #890
- feat(github): disclose direct-execution changes and require manual confirmation by @aparajon in #839
- feat(observability): complete gRPC client apply-identity logger adoption by @Kiran01bm in #893
- fix(github): mark the apply instruction as the primary action with
▶️ by @aparajon in #896 - feat(observability): surface and preserve stuck-pending apply diagnostics by @Kiran01bm in #816
- docs(namespaces): where to put the schema directory by @Kiran01bm in #849
- refactor(ddl): own StatementType in pkg/ddl behind the parser seam by @Kiran01bm in #908
- ci: pre-pull external Docker images with bounded retry by @Kiran01bm in #912
- feat(observability): carry the apply identity into Spirit engine log records by @Kiran01bm in #913
- feat(observability): carry full apply attrs on operator lifecycle logs by @Kiran01bm in #914
- feat(observability): carry the apply identity into handler lifecycle log records by @Kiran01bm in #917
- fix(operator): only claim pending operations whose apply is still claimable by @aparajon in #906
- fix(operator): reap stranded pending operations left under settled applies by @aparajon in #911
- feat(observability): route Spirit control-path logs through the change logger by @Kiran01bm in #918
Full Changelog: v0.1.57...v0.1.58