diff --git a/apps/admin-api/tests/migration_command.rs b/apps/admin-api/tests/migration_command.rs index ae6d5ea..91e2ca3 100644 --- a/apps/admin-api/tests/migration_command.rs +++ b/apps/admin-api/tests/migration_command.rs @@ -40,7 +40,7 @@ fn plan_is_deterministic_and_committed_contract_is_current() { ); assert_eq!(first.stdout, second.stdout); let plan: serde_json::Value = serde_json::from_slice(&first.stdout).unwrap(); - assert_eq!(plan["sequence"].as_array().unwrap().len(), 12); + assert_eq!(plan["sequence"].as_array().unwrap().len(), 13); let checked = command(&["plan", "--check"], None); assert!( @@ -82,7 +82,7 @@ async fn database_only_config_can_apply_and_preflight_a_fresh_schema() { ); let result: serde_json::Value = serde_json::from_slice(&preflight.stdout).unwrap(); assert_eq!(result["status"], "current"); - assert_eq!(result["version"], 12); + assert_eq!(result["version"], 13); } #[tokio::test] diff --git a/crates/crank-registry/src/migrations/authority_tests.rs b/crates/crank-registry/src/migrations/authority_tests.rs index ba1aa2c..71e17e4 100644 --- a/crates/crank-registry/src/migrations/authority_tests.rs +++ b/crates/crank-registry/src/migrations/authority_tests.rs @@ -8,7 +8,7 @@ fn sequence_is_deterministic_and_append_only() { MigrationAuthority::validate_sequence().unwrap(); assert_eq!( first.iter().map(|item| item.version).collect::>(), - vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] + vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] ); assert_eq!(first[0].checksum, "crank-community-baseline-v1"); assert_eq!(first[0].source_digest, BASELINE_SOURCE_SHA256); diff --git a/docs/migrations.md b/docs/migrations.md index 089b1df..f04c5a5 100644 --- a/docs/migrations.md +++ b/docs/migrations.md @@ -16,7 +16,7 @@ docker compose -f deploy/community/docker-compose.yml --env-file deploy/communit 2. Создайте и проверьте согласованный backup PostgreSQL и artifact storage. Для первой пустой установки зафиксируйте, что восстанавливать нечего. 3. Проверьте immutable plan: `cargo run -p admin-api --bin crank-migrate -- plan --check` в source checkout либо ` run --rm migrate crank-migrate plan` для образа. 4. Примените sequence: ` run --rm migrate crank-migrate apply`. -5. Повторите preflight и убедитесь в `{"status":"current","version":12}`. +5. Повторите preflight и убедитесь в `{"status":"current","version":13}`. 6. Только теперь запускайте long-running services: ` up -d`. Обычный `up` также содержит обязательный migration job, но при upgrade он не заменяет предварительные preflight и backup. Migrator делает до десяти bounded попыток подключения с секундной паузой и затем безопасно завершается ошибкой. @@ -90,6 +90,9 @@ cargo run -p admin-api --bin crank-migrate -- plan --check sensitivity и source lifecycle принадлежат scoped relation. Claim token/expiry зарезервированы bounded all-or-none contract для последующего reconciliation, но эта версия не запускает cleanup и не удаляет physical blobs. +- V13 — expand-only indexes, поддерживающие bounded artifact/import cleanup и + reconciliation ранее зарезервированных claim token/expiry; эта версия сама + не выполняет cleanup, не переписывает данные и не удаляет physical blobs. - Каждая версия имеет contiguous `i64` version, стабильное имя, lowercase SHA-256, owner, phase, explicit readable schema min/max и backfill policy. - `migrate` требует bounded cursor/batch policy; `contract` дополнительно требует tracked compatibility evidence и закрытого окна. - Добавление descriptor без executable implementation блокируется `invalid_contract` до DB I/O. diff --git a/docs/schemas/migration-sequence.json b/docs/schemas/migration-sequence.json index ffac4f7..b7aa7ae 100644 --- a/docs/schemas/migration-sequence.json +++ b/docs/schemas/migration-sequence.json @@ -192,6 +192,22 @@ "source_digest": "052058da53cd861b2a1af81243b34cc35204d665a9276f8ece563e061f8ebbfe", "transactional": true, "version": 12 + }, + { + "backfill": { + "kind": "none" + }, + "checksum": "abe822c967e1b2cc3966ede988e05eb2d9b2a062b539c45aaa8cad677395ab05", + "compatibility": "n-minus-one-readable", + "contract_evidence": null, + "name": "artifact-cleanup-indexes-v13", + "owner": "crank-registry", + "phase": "expand", + "readable_schema_max": 13, + "readable_schema_min": 12, + "source_digest": "abe822c967e1b2cc3966ede988e05eb2d9b2a062b539c45aaa8cad677395ab05", + "transactional": true, + "version": 13 } ] }