Skip to content

feat: establish versioned UI translation ledger foundation - #929

Draft
seonghobae wants to merge 262 commits into
mainfrom
feat/i18n-versioned-translation-ledger
Draft

seonghobae wants to merge 262 commits into
mainfrom
feat/i18n-versioned-translation-ledger

Conversation

@seonghobae

@seonghobae seonghobae commented Sep 3, 2026 •

Copy link
Copy Markdown
Contributor

Scope / owner boundary

PostgreSQL-authoritative versioned UI translation ledger plus authenticated translation API. LineageWeave owns product UI copy/presentation read-model behavior only; ontology/concept labels and semantic truth remain canonical-owner concerns. Customer Master copy remains a PostgreSQL draft.

Current exact authority — 2026-09-25

  • protected base: main@83eba56149eb802cd63642c507c324c9976ec78e
  • exact head: f076fa46976b2f68942a6e066cdbcf8895ba16f4
  • state: open / Draft / mechanically mergeable
  • ancestry: 262 ahead / 0 behind, exact merge-base = protected main
  • direct child feat(i18n): add owned Similar VOC translation draft #1127: 6e5ba4773e5f21bafd7437986ec4b43bf5907639, 43 ahead / 0 behind from this exact parent
  • direct child feat(i18n): consume published Customer Master screen copy #932: 4cfe2fe57352590f85010df6f2555c4b0e4eca4a, 75 ahead / 0 behind from this exact parent
  • qualifying independent current-head approval: none established; predecessor approval does not transfer

Fresh buyer-language finding: generic “resolve” copy obscured the actual governed action

The Customer Master button calls the hint-resolution path for an opaque source customer identifier. That path may bind a customer only after the proposed organization name is externally corroborated; it is not a generic problem-solving action and it is not a user confirmation/finalization step.

The draft nevertheless rendered the Resolve / Resolving... action as Korean 확정, Japanese 解決, Chinese 解析, Spanish Resolver, German Auflösen, and French Résoudre. Those words respectively lean toward finalizing, solving, parsing, or technical dissolution rather than naming the buyer task. This is especially risky beside copy that says source identifiers are hints only and must be resolved before binding a customer.

  • buyer-copy RED 44c6ccc446e891f36e300efb90397847b2412136: adds an exact eight-locale contract requiring the hint action to name organization identification/verification rather than generic solving/finalization; the predecessor 0248 draft fails that contract;
  • causal copy repair f076fa46976b2f68942a6e066cdbcf8895ba16f4: keeps the English source key/value Resolve / Resolving... for contract compatibility, while the seven translated presentation values now explicitly name organization identification or verification (조직 식별, 組織を特定, 识别组织, Xác minh tổ chức, Identificar organización, Organisation identifizieren, Identifier l’organisation) and corresponding in-progress states;
  • no ontology label, customer identity, resolver algorithm, authorization rule, UI source, publication state, or canonical-owner semantic truth moved into this correction.

This is an owner-side product-language review and a regression contract, not qualifying independent language approval. External/current-head language/product review remains required before publication.

Retained transaction/recovery evidence

The seed-owner replay lock-order RED b3df3853f38a7c5019dac0994c9dddcd80ad0750 and repair 8153ece6be2a7671cef507a04c7da08145881826 remain in the ancestry: ownership receipt is the lifecycle serialization point and replay-side resource identity is a plain MVCC read, eliminating the ownership -> root versus ordinary-delete root -> ownership deadlock edge. Prior TRUNCATE no-resurrection hardening, production-path seed evidence, retirement preservation, and rollback atomicity also remain in force.

Descendant convergence

Parent movement was not left as a note. #1127 and #932 adopted f076fa46... through ordinary non-force two-parent convergence. The parent changes touch only the Customer Master 0248 draft copy and its buyer-copy regression; #1127 retains its Similar VOC owner delta, and #932 retains its Customer Master consumer/UI delta. No force push, destructive rebase, or parent-source copy was used.

Exact-head hosted state

On f076fa46...:

  • Tests 36023533720: skipped by Draft policy
  • PROV-O 36023533821: skipped
  • Ontology Pages 36023533825: skipped
  • Security 36023533676: queued on last exact-head read
  • SAST 36023533781: queued on last exact-head read
  • CodeQL 36023533855: queued on last exact-head read

Therefore 44c6ccc4... -> f076fa46... is source-level RED→repair evidence only. No exact-head executable full-suite/PostgreSQL GREEN, complete Security/SAST/CodeQL/Strix/model acceptance, qualifying independent language/product approval, immutable publication, consumer/browser acceptance, qualifying current-head approval, protected merge, or release evidence is established.

Promotion gate

Keep Draft. Do not Ready-cycle to materialize checks, enable auto-merge, add wake commits, synthesize status, blind-rerun, self-approve, dismiss reviews, weaken gates, force-push, destructively rebase, publish prematurely, merge, or release.

@coderabbitai

coderabbitai Bot commented Sep 3, 2026 •

Copy link
Copy Markdown

Review Change StackReview Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Advanced

Run ID: 320fbdd5-4644-43d4-9e08-115d512cf9a6

📥 Commits

Reviewing files that changed from the base of the PR and between ac60da4 and 4fdb294.

📒 Files selected for processing (2)
  • migrations/0247_z_customer_master_translation_seed_ownership.sql
  • tests/test_customer_master_translation_seed_ownership_concurrency.py

Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review.


📝 Walkthrough

Walkthrough

8개 로케일 번역 원장과 읽기 경로를 갱신했습니다. 캐시 검증, API 오류 매핑, 게시 보호, 롤백, Customer Master 초안, 문서와 검증 테스트를 확장했습니다.

Changes

UI 번역 원장

Layer / File(s) Summary
원장 스키마와 게시 계약
migrations/0246_ui_translation_ledger.sql, migrations/0247_ui_translation_truncate_guard.sql, migrations/rollback/*.sql, tests/test_translation_ledger_*
8개 로케일, 식별자 검증, 번역 완전성, Unicode 공백, 게시 시각과 게시 후 불변성을 정의하고 검증합니다. TRUNCATE와 롤백의 잠금 및 가드를 검증합니다.
번역 읽기 모델과 캐시 검증
backend/app/translation_ledger.py, tests/test_translation_ledger_read_model.py, tests/test_translation_screen_value_object.py, tests/test_translation_cache_*.py, tests/test_translation_exact_version_query_budget.py
캐시 후보의 digest와 UTF-8 octet 길이를 검증합니다. 과대 payload와 지연된 캐시 I/O를 거부하고 PostgreSQL projection으로 폴백합니다.
인증된 번역 조회 API
backend/app/main.py, tests/test_translation_api_http.py, tests/test_translation_api_driver_boundary.py
screen_key의 슬래시 경로를 지원합니다. 식별자, 로케일, 버전 오류를 별도 422 응답으로 매핑하고 404와 409 처리를 유지합니다.
Customer Master 번역 초안 시드와 소유권
migrations/0247_z_customer_master_translation_seed_ownership.sql, migrations/0248_customer_master_translation_draft.sql, migrations/rollback/024*.sql, tests/test_customer_master_translation_seed*.py
37개 키와 8개 로케일 텍스트를 draft 리소스에 삽입합니다. 시드 소유권, 멱등 재생, 게시 리소스 보호와 초안 롤백을 검증합니다.
기술 기준선과 런타임 지원
docs/adr/*.md, docs/product-technical-gap-baseline*.md*, lineageweave/observability.py, pyproject.toml, docker/postgres-init/migrate.sh, tests/test_translation_documentation_alignment.py, tests/test_translation_wire_evidence_contract.py
기준선과 ADR 문서를 갱신합니다. OpenTelemetry 로깅 의존성, 마이그레이션 컨텍스트, 실제 JSON 재귀 소진 증거를 갱신합니다.

Priority: ➖ Normal

Estimated code review effort: 5 (Critical) | ~120 minutes

Change: Feature · Severity of issue fixed: Medium

Sequence Diagram(s)

sequenceDiagram
  participant AuthenticatedClient
  participant FastAPI
  participant translation_ledger
  participant Valkey
  participant PostgreSQL

  AuthenticatedClient->>FastAPI: GET /api/translations/{screen_key}
  FastAPI->>translation_ledger: read_translation_screen(...)
  translation_ledger->>Valkey: Read exact-version cache candidate
  Valkey-->>translation_ledger: Payload or cache miss
  translation_ledger->>PostgreSQL: Validate evidence or fetch projection
  PostgreSQL-->>translation_ledger: TranslationScreen
  translation_ledger-->>FastAPI: Immutable translation projection
  FastAPI-->>AuthenticatedClient: 200, 404, 409, or 422
Loading

Merge Risk: ⚪ Minimal · up to 4fdb2

The Customer Master migration now protects pre-existing drafts from adoption or rollback deletion, and the documentation check scopes PR #929 status assertions to the current snapshot. No actionable merge risk remains.

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 75.10% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 261 functions across 33 files. (1 skipped… Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목은 버전 관리형 UI 번역 원장 기반 구축이라는 PR의 주요 변경을 정확하고 간결하게 요약합니다.
Full details: Docstring Coverage

Explanation

Docstring coverage is 75.10% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 261 functions across 33 files. (1 skipped: 1 unsupported.)

  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/i18n-versioned-translation-ledger

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@seonghobae seonghobae left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Valid finding: the explicit-version Valkey fast path can make a structurally valid but incomplete cache payload authoritative. _decode_cached_screen() validates identity and nonblank values, but it has no independent knowledge of the published resource's required key set. A payload for the exact product/screen/version/locale containing only title therefore bypasses PostgreSQL and returns an incomplete screen, contradicting this PR's fail-closed completeness contract and its statement that PostgreSQL remains authoritative. Add a realistic RED for a correct-identity/partial-key cache payload, then make cache acceptance depend on authoritative published key-set evidence (without cross-locale fallback).

Copy link
Copy Markdown
Contributor Author

Review finding on current head 7df347874ae26b95947be14b0cb97d7789b8d07a: application reads canonicalize product_key and screen_key with .strip(), but migration 0246 only checks btrim(key) <> ''; it does not require btrim(key) = key. PostgreSQL can persist lineageweave and lineageweave as distinct resource identities while the reader/cache boundary collapses both inputs to lineageweave, leaving a padded published resource unreachable through the canonical reader. Repair should make the DB reject leading/trailing whitespace so aggregate, API, and cache identities agree.

Copy link
Copy Markdown
Contributor Author

Review finding on 0e307531d97e71346835dc059f6c3db46956abbc: publication provenance is caller-controlled. guard_ui_translation_resource_mutation() currently does new.published_at := coalesce(new.published_at, now()), so a caller can submit an arbitrary non-null published_at while transitioning a draft to published; the trigger preserves that value and the row becomes immutable. Because publication time is release/audit evidence, the state transition must stamp database time itself rather than admit a caller-supplied timestamp. Add RED coverage for server-owned publication time, then assign now() unconditionally on the publish transition.

@seonghobae seonghobae left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Application/DB identity semantics are not actually aligned yet. ADR 0362 says leading/trailing-whitespace product_key and screen_key forms are rejected consistently at PostgreSQL and the application boundary, and migration 0246 rejects them with btrim equality. _validate_identity_segment() instead strips caller input and accepts it, so lineageweave aliases lineageweave before DB/cache lookup. That silently normalizes an ambiguous external identity while the persisted aggregate forbids that spelling. Add a RED covering padded product/screen inputs failing before I/O, then make the application boundary reject rather than normalize.

@seonghobae seonghobae left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The new real-PostgreSQL translation test adds fresh direct psycopg2 / psycopg2.errors reachability even though repository issue #910 requires every direct psycopg2 caller to be migrated and #911 is removing that dependency path. This branch should not add a new caller that would have to be deleted during convergence. Keep the test independent of mutable #911 source by using the already-owned asyncpg runtime boundary for its throwaway PostgreSQL setup/assertions, and lock that with a RED before refactoring.

@seonghobae seonghobae left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Valid finding on exact head 8b01c7c82cf3f7923868c38a5c7f4fd9379d966d: explicit-version reads acquire an asyncpg connection, fetch the required-key set, and then await Valkey get() before releasing that PostgreSQL lease. Because published resource/key sets are immutable, the DB lease is not needed while waiting on cache I/O. A slow or wedged cache can therefore pin one PostgreSQL pool slot per request and create buyer-visible pool starvation/latency even though Valkey is explicitly non-authoritative. Repair should release the PostgreSQL connection immediately after the key-set query, perform the cache read outside the pool lease, and reacquire only on cache miss/failure. Add a regression that observes lease state at cache-read time; do not weaken fail-closed key-set validation.

Copy link
Copy Markdown
Contributor Author

Review finding on exact head b4056e29134a78f008aff5ee847c4ac6f0a975f8: ui_translation_resource is documented as the aggregate root identified by (product_key, screen_key, resource_version), but the current mutation guard allows all three identity fields to be changed while the resource is still draft (including in the same statement that publishes it). That means review/evidence can be attached to one aggregate identity and the row can be published under another identity/version without creating a new aggregate. I’m treating this as a DDD/evidence-boundary defect rather than a cosmetic schema issue. The repair should make the aggregate identity immutable after INSERT, while retaining draft child-copy edits and the one-way publication transition.

Copy link
Copy Markdown
Contributor Author

Owner-path handoff from Similar VOC #1126 exact addef8a6712984c7cb63faebd9b0566050e95a57: the retry/authorization repair adds buyer-visible Korean retry/status copy (불러온 근거는 그대로 유지됩니다…, 실패한 다음 페이지를 다시 요청하세요., 같은 조회를 다시 시도하세요., retry labels) while #1126 intentionally does not create a second translation authority. Before #1126 can satisfy the material-UI delivery gate, these Similar VOC screen keys need a canonical PostgreSQL-authoritative versioned ledger path with KO/EN/JA/ZH/VI/ES/DE/FR publication/review and screen-key consumption, preserving ontology-label separation. This is an owner dependency, not a request to duplicate #929’s current Customer Master 37×8 draft inside #1126. If #929 remains foundation-only for these keys, route the extension through its verified successor/consumer contract and keep #1126 Draft until that released path is consumable. No publication or Accepted-state claim is made here.

Copy link
Copy Markdown
Contributor Author

Concrete owner successor opened for the #1126 Similar VOC screen-copy handoff: #1127, Draft, stacked directly on #929 exact d4f42f579663e88a0c9af0cc492aa6ff7cae96ee; current exact head 75fefc4e599f35fd7f24862ea0496d7c89717eb0, 10 ahead / 0 behind. It keeps PostgreSQL as the sole presentation-copy authority, adds an owned lineageweave/similar-voc/v1 23×8 draft candidate, generalizes one-time seed ownership instead of copying Customer-Master-specific triggers, and leaves SimilarVocPanel source ownership in #1126. Current-head review also repaired two owner-path hazards before handoff: blocked/pending rows with resource_id=NULL could otherwise escape rollback deletion authority (f0e79fd... → 2e673c1e...), and the generic trigger layer initially lacked a bounded paired rollback (27e8d53... → 057eb6ed...). ADR 0377 remains Proposed. #1127 is intentionally Draft: exact-head PostgreSQL/hosted execution, independent 8-locale language/product review, immutable publication, authenticated API consumption, CJK/text-expansion/font-fallback, #1126 consumer/browser acceptance, parent #929 acceptance, and qualifying approval remain outstanding. This comment supersedes the earlier handoff's lack of a concrete successor; it does not claim publication or GREEN acceptance.

Copy link
Copy Markdown
Contributor Author

Similar VOC translation successor #1127 advanced by ordinary commits to exact 714d828fa5ecfc85962737eb43cc374b476daa00 (13 ahead / 0 behind from this parent exact d4f42f579663e88a0c9af0cc492aa6ff7cae96ee). Fresh review found a second rollback-provenance gap in the generic child guard: rollback/<migration_key>.sql was enforced for root deletion but not for direct child-table mutation, so a blocked operator-owned draft could lose ui_translation_key/ui_translation_text rows under rollback-labelled context. RED 73c7397ecd7e49439662b07516d087505a769d16; causal repair dde6ea349cdf244e1c2dd754d600c041db2f8b6f; Proposed ADR 0377 convergence 714d828fa5ecfc85962737eb43cc374b476daa00. Rollback-labelled child mutation now requires exact owned + matching resource and only DELETE is admissible. #1127 remains Draft/unpublished. Exact-head Tests 35959371271 are Draft-skipped (jobs 107504435449, 107504435979 have no runner/steps); real-PostgreSQL/hosted acceptance, language/product review, immutable publication/API consumption, #1126 final consumer/browser acceptance, parent #929 acceptance, and qualifying independent approval remain outstanding.

Copy link
Copy Markdown
Contributor Author

#1127 owner-path handoff update: current exact head is 2d08963b46f57d106549296874bb4d8f4f925b7d (18 ahead / 0 behind on this #929 head), still Draft/unpublished. Fresh review found that the generic child guard inspected only NEW.resource_id on UPDATE; under a matching seed rollback context a child could otherwise be moved out of a blocked/owned resource to an unrelated resource with no ownership row and escape provenance enforcement. RED eaf25d06... covers the real-PostgreSQL resource-move boundary. Causal migration cf14dc81... installs a source-first UPDATE guard before the Similar VOC seed under sorted replay; 61378357... wires the regression to that migration and 86c6863d... pins ordering. ADR 0377 converges at the current head. Exact-head Tests 35961707502 are Draft-policy skipped, so this remains source-level evidence only; no publication, independent language/product approval, or transfer of acceptance to #929/#1126 is claimed.

seonghobae commented Sep 24, 2026 •

Copy link
Copy Markdown
Contributor Author

#1127 owner-path correction: current exact head is 260296705871eefd03219523dd9fe7cccc5aac4f, 23 ahead / 0 behind on #929 exact d4f42f579663e88a0c9af0cc492aa6ff7cae96ee, still Draft/unpublished. Fresh review rejected the prior cross-resource child UPDATE repair as duplicate ADR-0362 authority: migration 0246 already makes translation-child resource_id immutable. PostgreSQL same-kind triggers fire alphabetically, but the order differs between key and text tables here; that still creates no escape because an earlier seed guard may reject first, and otherwise the base ledger guard subsequently rejects the move. Correction RED 6ed44ea... pins the no-duplicate-owner boundary, causal correction 8d220fbc... removes 0249_ui_translation_seed_ownership_generic_b.sql, coverage 0d598231... exercises both key and text orderings, and Proposed ADR 0377 converges at 26029670.... Intermediate eaf25d06... / cf14dc81... / 61378357... / 86c6863d... remain ordinary history but are superseded as non-causal evidence. Exact-head Tests 35966812823 are Draft-policy skipped and only Devin Review/CodeRabbit statuses are currently successful. Real-PostgreSQL/full-suite, required hosted security/static/model acceptance, independent language/product review, immutable publication/API consumption and qualifying approval remain outstanding; no parent acceptance or publication is claimed.

Copy link
Copy Markdown
Contributor Author

#1127 owner handoff update: Similar VOC screen-copy successor is now Draft at exact c519138c54d3b68e52d1cda4cacdc0d64a9e74c8, 26 ahead / 0 behind from this parent d4f42f579663e88a0c9af0cc492aa6ff7cae96ee. Fresh recovery review found that rollback/0249_ui_translation_seed_ownership_generic.sql incorrectly treated existence of any same-identity Similar VOC v1 as a rollback dependency even when the one-time seed receipt was blocked (resource_id=NULL) and therefore owned no resource. RED e9eb4699... covers the real PostgreSQL failed-deployment case with operator-owned root+child. Causal fix df9a39e9... makes the receipt the dependency boundary: pending|blocked|retired NULL-resource receipts can be removed while preserving operator copy; an owned receipt and other generic owners still refuse shared-layer rollback. Proposed ADR 0377 converges at c519138c.... No publication or parent acceptance is claimed: exact-head Tests 35971931132 are Draft-policy skipped, and real-PostgreSQL/full-suite, hosted Security/SAST/CodeQL/Strix/model acceptance, independent language/product review, immutable publication/API consumption, and qualifying approval remain outstanding.

Copy link
Copy Markdown
Contributor Author

#1127 translation-owner successor advanced to exact 9c35c477d9bed0acee7720d4e4737024dd7f0461 (29 ahead / 0 behind from this parent) with a new rollback/replay repair. Fresh review found that deleting a retired Similar VOC seed receipt during generic ownership-layer rollback erased the durable no-resurrection fact and allowed a later forward reapply to recreate a pending reservation and reseed historical copy. RED 12e48573... reproduces retire -> generic rollback -> generic reapply -> seed replay; causal fix 88601285... preserves valid retired NULL-resource receipts while withdrawing only pending/blocked reservations; ADR 0377 converges at 9c35c477.... #1127 remains Draft/unpublished. Tests 35977832957 are Draft-policy skipped, so exact-head real-PostgreSQL/full-suite and hosted Security/SAST/CodeQL/Strix/model acceptance, independent language/product review, publication/API consumption, #1126 consumer/browser acceptance, and qualifying approval remain required.

@seonghobae seonghobae left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Current-head review: the Customer Master ownership rollback previously erased a valid retired one-time-seed receipt, contradicting the no-resurrection lifecycle already enforced on ordinary deletion/startup. RED 92ac572f... now requires real PostgreSQL rollback to fail closed and preserve retired / resource_id=NULL; causal fix 314be833... withdraws only unowned pending|blocked reservations and refuses to destroy retired history. Direct children #932 and #1127 were converged by ordinary two-parent commits without force-push or child-delta duplication. Exact-head Tests are Draft-policy skipped and Security/SAST/CodeQL are not yet accepting, so this is source-level evidence only, not approval or promotion authority.

@seonghobae seonghobae left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Current-head evidence repair on 156bd71dc53cfb6315f3396437651eac88649596: the September 21 finding remained valid. The existing 37×8 completeness/publishability fixture applied 0248 without the production predecessor 0247_z_customer_master_translation_seed_ownership.sql, replay guard, or the lineageweave.migration_file provenance used by docker/postgres-init/migrate.sh, so it proved a different migration path. Realistic RED e74d6e8a139d0e7da5b3a3e8186f869790bc5d64 requires an owned 0248 receipt on that evidence path. Causal evidence fix 156bd71dc53cfb6315f3396437651eac88649596 adds a real-PostgreSQL canonical sorted path with runner-equivalent provenance and verifies the owned receipt, one 37×8 draft, reviewed-copy replay preservation, publication, published rollback refusal, and exact-owned draft rollback. This changes test/evidence only; no translation runtime, seed bytes, publication authority, or rollback implementation changed. Exact-head Tests remain Draft-policy skipped, so this is source-level evidence and not approval or promotion authority. Direct children #932 and #1127 were immediately converged by ordinary two-parent commits with the parent test blob adopted unchanged; no force push or destructive rebase.

@seonghobae seonghobae left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Current-head recovery review: ui_translation_seed_ownership carries durable one-time-seed state (retired is the no-resurrection fact), but the existing TRUNCATE guard covered only ui_translation_resource/key/text. Because the ownership table references the root, root TRUNCATE ... CASCADE can include and erase that history while no resource is published, bypassing row-level retirement/rollback guards. RED 2a87b299... pins the real-PostgreSQL failure mode. Causal fix 527d7e196... adds a separately ordered ownership-table BEFORE TRUNCATE fail-closed guard plus paired rollback and moves the production-path fixture through 0247_z -> 0247_za -> 0247_zz -> 0248. Direct children #932 and #1127 were non-force two-parent converged. Exact-head Tests/PROV-O/Ontology are Draft-policy skipped; Security/SAST/CodeQL are still nonterminal, so this is source-level evidence only and not approval/promotion authority.

@seonghobae seonghobae left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fresh recovery review found a second destructive gap in the new seed-ownership TRUNCATE protection. The forward guard was valid, but rollback/0247_za_ui_translation_seed_ownership_truncate_guard.sql removed it in a separate committed step before rollback/0247_z_customer_master_translation_seed_ownership.sql validated whether retirement history could actually be removed. With a valid retired / resource_id=NULL receipt, the second rollback correctly fails closed; the predecessor therefore left the ownership table in place but unprotected, reopening TRUNCATE ui_translation_resource CASCADE as a way to erase no-resurrection history.

Real-PostgreSQL RED 84a7b1fc7af8bd0ac1a00c03755a14568deee192 extends the retirement scenario through 0247_za rollback -> expected 0247_z refusal -> root TRUNCATE and requires the guard/receipt to survive the failed recovery. Causal repair 787aac211cafeb90e2459538c1877b2ac1ac2c09 makes the 0247_za rollback non-destructive; final exact head 1219fe4b2d9dcc3388c286aa9fdeb4fdac60c566 moves trigger/function removal into the successful 0247_z ownership-table rollback transaction, after all resource/receipt preconditions pass. Any exception rolls the whole transaction back and leaves the TRUNCATE guard live.

This is source-level recovery evidence only. Exact-head Tests are Draft-policy skipped; Security/SAST/CodeQL are currently queued, and no qualifying independent current-head approval exists. Keep Draft; do not Ready-cycle, auto-merge, blind-rerun, or resolve the long-running ownership thread until unchanged-head PostgreSQL/full-suite and required hosted acceptance are real GREEN.

@seonghobae seonghobae left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Current-head review: the ownership replay path locked ui_translation_seed_ownership and then the Customer Master root, while ordinary DELETE acquires the root row before its BEFORE DELETE trigger retires the ownership receipt. That is a real lock-order inversion. RED b3df3853... stages replay and DELETE behind an ownership-row holder so the predecessor reaches the deadlock cycle; causal fix 8153ece6... removes the replay-side root row lock and keeps the ownership row as the serialization point. This is source-level evidence only until exact-head real-PostgreSQL/full-suite and required hosted checks are actually GREEN. Keep Draft; this comment is not approval.

@seonghobae seonghobae left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Current-head review found a buyer-visible language defect in the Customer Master hint action. The route resolves an opaque source customer identifier to a corroborated organization candidate before any binding, but the 0248 draft translated Resolve as generic finalization/solving/parsing terms (확정, 解決, 解析, Resolver, Auflösen, Résoudre). RED 44c6ccc4... fixes the reviewed intent as organization identification/verification across the seven translated locales; repair f076fa46... updates only presentation copy and preserves the English contract key/value, resolver semantics, auth, ontology ownership, publication state, and consumer source. This is COMMENT only, not independent approval. Keep Draft until exact-head executable checks and qualifying independent language/product review exist.

if task is not None and not task.done():
task.cancel()
with suppress(asyncio.CancelledError, asyncpg.PostgresError):
await task

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant